mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-21 06:01:23 +00:00
i915, nouveau, hdlcd and misc fixes.
-----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJZH09kAAoJEAx081l5xIa+J/wP/ikgMkHYzBsw22aAa7jlu/iK NaNi7qp4CtN2e5CjNX6GjEtOOEUuDhQ23EsA8qUwctypPQDKXYKW477ZQcEkPI3T Y86OptyVZMdVQQO8BYVTydN5cvfhiTDnYu03AAApHa+1AQ1CPkQ79jbVfL1CR6/0 8B43rgNG2vK/rbB5IPvhWu5bX8sCiHvYummuS9Vi3imdRkik0O7/0mepzu7KF4hs lPmqfid+DhZwXM7sk1hw9hRVjYNxaXZ14VqFZFJbXsO/ayujmG+utLiMFUZP87ij vSEhNhQCOQt/RHSsGATv4DSpxbK3in6ESPsaiPEs1tyyKFsmwo91qmaTAFHtTKjT yUrctlVrLjcNLJtlfRqJGs1zNHthOAll67oGVZNTDWgvHwdhD3VMdJ5qAgJD9biG 8xsWYNxmF2n1qLHynP/jNU2K8NukDjpZSAzpsIPI0N8Qv2nzamfUUhsQzWWk3tW1 GH0EIeK5fCpsTnpb2KVjlbxQR7mAkAkGi6uKOtISOcqGmVdi7i0sssQV5g8nuLO6 GOC2k3jdlhlXjs9HmvKaYQKS24/bdVtXZbOzbdsS75/fJzGQwx8XOM85n2htXm4c woc0l5PChcSmRF/idHuS+iLK/etxZowA6GkD3ed/stqvKILt0CZl1cOnPzKKqOkx LBCzaaS/23HSmY5H5SFG =Eg8t -----END PGP SIGNATURE----- Merge tag 'drm-fixes-for-v4.12-rc2' of git://people.freedesktop.org/~airlied/linux Pull drm fixes from Dave Airlie: "Mostly nouveau and i915, fairly quiet as usual for rc2" * tag 'drm-fixes-for-v4.12-rc2' of git://people.freedesktop.org/~airlied/linux: drm/atmel-hlcdc: Fix output initialization gpu: host1x: select IOMMU_IOVA drm/nouveau/fifo/gk104-: Silence a locking warning drm/nouveau/secboot: plug memory leak in ls_ucode_img_load_gr() error path drm/nouveau: Fix drm poll_helper handling drm/i915: don't do allocate_va_range again on PIN_UPDATE drm/i915: Fix rawclk readout for g4x drm/i915: Fix runtime PM for LPE audio drm/i915/glk: Fix DSI "*ERROR* ULPS is still active" messages drm/i915/gvt: avoid unnecessary vgpu switch drm/i915/gvt: not to restore in-context mmio drm/etnaviv: don't put fence in case of submit failure drm/i915/gvt: fix typo: "supporte" -> "support" drm: hdlcd: Fix the calculation of the scanout start address
This commit is contained in:
commit
cf80a6fbca
17 changed files with 93 additions and 69 deletions
|
@ -10,6 +10,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <drm/drmP.h>
|
#include <drm/drmP.h>
|
||||||
|
#include <drm/drm_atomic.h>
|
||||||
#include <drm/drm_atomic_helper.h>
|
#include <drm/drm_atomic_helper.h>
|
||||||
#include <drm/drm_crtc.h>
|
#include <drm/drm_crtc.h>
|
||||||
#include <drm/drm_crtc_helper.h>
|
#include <drm/drm_crtc_helper.h>
|
||||||
|
@ -226,16 +227,33 @@ static const struct drm_crtc_helper_funcs hdlcd_crtc_helper_funcs = {
|
||||||
static int hdlcd_plane_atomic_check(struct drm_plane *plane,
|
static int hdlcd_plane_atomic_check(struct drm_plane *plane,
|
||||||
struct drm_plane_state *state)
|
struct drm_plane_state *state)
|
||||||
{
|
{
|
||||||
u32 src_w, src_h;
|
struct drm_rect clip = { 0 };
|
||||||
|
struct drm_crtc_state *crtc_state;
|
||||||
|
u32 src_h = state->src_h >> 16;
|
||||||
|
|
||||||
src_w = state->src_w >> 16;
|
/* only the HDLCD_REG_FB_LINE_COUNT register has a limit */
|
||||||
src_h = state->src_h >> 16;
|
if (src_h >= HDLCD_MAX_YRES) {
|
||||||
|
DRM_DEBUG_KMS("Invalid source width: %d\n", src_h);
|
||||||
/* we can't do any scaling of the plane source */
|
|
||||||
if ((src_w != state->crtc_w) || (src_h != state->crtc_h))
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!state->fb || !state->crtc)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
crtc_state = drm_atomic_get_existing_crtc_state(state->state,
|
||||||
|
state->crtc);
|
||||||
|
if (!crtc_state) {
|
||||||
|
DRM_DEBUG_KMS("Invalid crtc state\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
clip.x2 = crtc_state->adjusted_mode.hdisplay;
|
||||||
|
clip.y2 = crtc_state->adjusted_mode.vdisplay;
|
||||||
|
|
||||||
|
return drm_plane_helper_check_state(state, &clip,
|
||||||
|
DRM_PLANE_HELPER_NO_SCALING,
|
||||||
|
DRM_PLANE_HELPER_NO_SCALING,
|
||||||
|
false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hdlcd_plane_atomic_update(struct drm_plane *plane,
|
static void hdlcd_plane_atomic_update(struct drm_plane *plane,
|
||||||
|
@ -244,21 +262,20 @@ static void hdlcd_plane_atomic_update(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb = plane->state->fb;
|
struct drm_framebuffer *fb = plane->state->fb;
|
||||||
struct hdlcd_drm_private *hdlcd;
|
struct hdlcd_drm_private *hdlcd;
|
||||||
struct drm_gem_cma_object *gem;
|
struct drm_gem_cma_object *gem;
|
||||||
u32 src_w, src_h, dest_w, dest_h;
|
u32 src_x, src_y, dest_h;
|
||||||
dma_addr_t scanout_start;
|
dma_addr_t scanout_start;
|
||||||
|
|
||||||
if (!fb)
|
if (!fb)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
src_w = plane->state->src_w >> 16;
|
src_x = plane->state->src.x1 >> 16;
|
||||||
src_h = plane->state->src_h >> 16;
|
src_y = plane->state->src.y1 >> 16;
|
||||||
dest_w = plane->state->crtc_w;
|
dest_h = drm_rect_height(&plane->state->dst);
|
||||||
dest_h = plane->state->crtc_h;
|
|
||||||
gem = drm_fb_cma_get_gem_obj(fb, 0);
|
gem = drm_fb_cma_get_gem_obj(fb, 0);
|
||||||
|
|
||||||
scanout_start = gem->paddr + fb->offsets[0] +
|
scanout_start = gem->paddr + fb->offsets[0] +
|
||||||
plane->state->crtc_y * fb->pitches[0] +
|
src_y * fb->pitches[0] +
|
||||||
plane->state->crtc_x *
|
src_x * fb->format->cpp[0];
|
||||||
fb->format->cpp[0];
|
|
||||||
|
|
||||||
hdlcd = plane->dev->dev_private;
|
hdlcd = plane->dev->dev_private;
|
||||||
hdlcd_write(hdlcd, HDLCD_REG_FB_LINE_LENGTH, fb->pitches[0]);
|
hdlcd_write(hdlcd, HDLCD_REG_FB_LINE_LENGTH, fb->pitches[0]);
|
||||||
|
@ -305,7 +322,6 @@ static struct drm_plane *hdlcd_plane_init(struct drm_device *drm)
|
||||||
formats, ARRAY_SIZE(formats),
|
formats, ARRAY_SIZE(formats),
|
||||||
DRM_PLANE_TYPE_PRIMARY, NULL);
|
DRM_PLANE_TYPE_PRIMARY, NULL);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
devm_kfree(drm->dev, plane);
|
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,7 +345,6 @@ int hdlcd_setup_crtc(struct drm_device *drm)
|
||||||
&hdlcd_crtc_funcs, NULL);
|
&hdlcd_crtc_funcs, NULL);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
hdlcd_plane_destroy(primary);
|
hdlcd_plane_destroy(primary);
|
||||||
devm_kfree(drm->dev, primary);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -152,8 +152,7 @@ static const struct drm_connector_funcs atmel_hlcdc_panel_connector_funcs = {
|
||||||
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
|
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
|
static int atmel_hlcdc_attach_endpoint(struct drm_device *dev, int endpoint)
|
||||||
const struct device_node *np)
|
|
||||||
{
|
{
|
||||||
struct atmel_hlcdc_dc *dc = dev->dev_private;
|
struct atmel_hlcdc_dc *dc = dev->dev_private;
|
||||||
struct atmel_hlcdc_rgb_output *output;
|
struct atmel_hlcdc_rgb_output *output;
|
||||||
|
@ -161,6 +160,11 @@ static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
|
||||||
struct drm_bridge *bridge;
|
struct drm_bridge *bridge;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
ret = drm_of_find_panel_or_bridge(dev->dev->of_node, 0, endpoint,
|
||||||
|
&panel, &bridge);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
output = devm_kzalloc(dev->dev, sizeof(*output), GFP_KERNEL);
|
output = devm_kzalloc(dev->dev, sizeof(*output), GFP_KERNEL);
|
||||||
if (!output)
|
if (!output)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -177,10 +181,6 @@ static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
|
||||||
|
|
||||||
output->encoder.possible_crtcs = 0x1;
|
output->encoder.possible_crtcs = 0x1;
|
||||||
|
|
||||||
ret = drm_of_find_panel_or_bridge(np, 0, 0, &panel, &bridge);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (panel) {
|
if (panel) {
|
||||||
output->connector.dpms = DRM_MODE_DPMS_OFF;
|
output->connector.dpms = DRM_MODE_DPMS_OFF;
|
||||||
output->connector.polled = DRM_CONNECTOR_POLL_CONNECT;
|
output->connector.polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
@ -220,22 +220,14 @@ err_encoder_cleanup:
|
||||||
|
|
||||||
int atmel_hlcdc_create_outputs(struct drm_device *dev)
|
int atmel_hlcdc_create_outputs(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
struct device_node *remote;
|
int endpoint, ret = 0;
|
||||||
int ret = -ENODEV;
|
|
||||||
int endpoint = 0;
|
|
||||||
|
|
||||||
while (true) {
|
for (endpoint = 0; !ret; endpoint++)
|
||||||
/* Loop thru possible multiple connections to the output */
|
ret = atmel_hlcdc_attach_endpoint(dev, endpoint);
|
||||||
remote = of_graph_get_remote_node(dev->dev->of_node, 0,
|
|
||||||
endpoint++);
|
|
||||||
if (!remote)
|
|
||||||
break;
|
|
||||||
|
|
||||||
ret = atmel_hlcdc_attach_endpoint(dev, remote);
|
/* At least one device was successfully attached.*/
|
||||||
of_node_put(remote);
|
if (ret == -ENODEV && endpoint)
|
||||||
if (ret)
|
return 0;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@ static struct etnaviv_gem_submit *submit_create(struct drm_device *dev,
|
||||||
|
|
||||||
/* initially, until copy_from_user() and bo lookup succeeds: */
|
/* initially, until copy_from_user() and bo lookup succeeds: */
|
||||||
submit->nr_bos = 0;
|
submit->nr_bos = 0;
|
||||||
|
submit->fence = NULL;
|
||||||
|
|
||||||
ww_acquire_init(&submit->ticket, &reservation_ww_class);
|
ww_acquire_init(&submit->ticket, &reservation_ww_class);
|
||||||
}
|
}
|
||||||
|
@ -294,6 +295,7 @@ static void submit_cleanup(struct etnaviv_gem_submit *submit)
|
||||||
}
|
}
|
||||||
|
|
||||||
ww_acquire_fini(&submit->ticket);
|
ww_acquire_fini(&submit->ticket);
|
||||||
|
if (submit->fence)
|
||||||
dma_fence_put(submit->fence);
|
dma_fence_put(submit->fence);
|
||||||
kfree(submit);
|
kfree(submit);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1244,7 +1244,7 @@ static int dma_ctrl_write(struct intel_vgpu *vgpu, unsigned int offset,
|
||||||
mode = vgpu_vreg(vgpu, offset);
|
mode = vgpu_vreg(vgpu, offset);
|
||||||
|
|
||||||
if (GFX_MODE_BIT_SET_IN_MASK(mode, START_DMA)) {
|
if (GFX_MODE_BIT_SET_IN_MASK(mode, START_DMA)) {
|
||||||
WARN_ONCE(1, "VM(%d): iGVT-g doesn't supporte GuC\n",
|
WARN_ONCE(1, "VM(%d): iGVT-g doesn't support GuC\n",
|
||||||
vgpu->id);
|
vgpu->id);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -340,6 +340,9 @@ void intel_gvt_restore_render_mmio(struct intel_vgpu *vgpu, int ring_id)
|
||||||
} else
|
} else
|
||||||
v = mmio->value;
|
v = mmio->value;
|
||||||
|
|
||||||
|
if (mmio->in_context)
|
||||||
|
continue;
|
||||||
|
|
||||||
I915_WRITE(mmio->reg, v);
|
I915_WRITE(mmio->reg, v);
|
||||||
POSTING_READ(mmio->reg);
|
POSTING_READ(mmio->reg);
|
||||||
|
|
||||||
|
|
|
@ -129,9 +129,13 @@ static void try_to_schedule_next_vgpu(struct intel_gvt *gvt)
|
||||||
struct vgpu_sched_data *vgpu_data;
|
struct vgpu_sched_data *vgpu_data;
|
||||||
ktime_t cur_time;
|
ktime_t cur_time;
|
||||||
|
|
||||||
/* no target to schedule */
|
/* no need to schedule if next_vgpu is the same with current_vgpu,
|
||||||
if (!scheduler->next_vgpu)
|
* let scheduler chose next_vgpu again by setting it to NULL.
|
||||||
|
*/
|
||||||
|
if (scheduler->next_vgpu == scheduler->current_vgpu) {
|
||||||
|
scheduler->next_vgpu = NULL;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* after the flag is set, workload dispatch thread will
|
* after the flag is set, workload dispatch thread will
|
||||||
|
|
|
@ -195,9 +195,12 @@ static int ppgtt_bind_vma(struct i915_vma *vma,
|
||||||
u32 pte_flags;
|
u32 pte_flags;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = vma->vm->allocate_va_range(vma->vm, vma->node.start, vma->size);
|
if (!(vma->flags & I915_VMA_LOCAL_BIND)) {
|
||||||
|
ret = vma->vm->allocate_va_range(vma->vm, vma->node.start,
|
||||||
|
vma->size);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
vma->pages = vma->obj->mm.pages;
|
vma->pages = vma->obj->mm.pages;
|
||||||
|
|
||||||
|
@ -2306,7 +2309,8 @@ static int aliasing_gtt_bind_vma(struct i915_vma *vma,
|
||||||
if (flags & I915_VMA_LOCAL_BIND) {
|
if (flags & I915_VMA_LOCAL_BIND) {
|
||||||
struct i915_hw_ppgtt *appgtt = i915->mm.aliasing_ppgtt;
|
struct i915_hw_ppgtt *appgtt = i915->mm.aliasing_ppgtt;
|
||||||
|
|
||||||
if (appgtt->base.allocate_va_range) {
|
if (!(vma->flags & I915_VMA_LOCAL_BIND) &&
|
||||||
|
appgtt->base.allocate_va_range) {
|
||||||
ret = appgtt->base.allocate_va_range(&appgtt->base,
|
ret = appgtt->base.allocate_va_range(&appgtt->base,
|
||||||
vma->node.start,
|
vma->node.start,
|
||||||
vma->node.size);
|
vma->node.size);
|
||||||
|
|
|
@ -3051,10 +3051,14 @@ enum skl_disp_power_wells {
|
||||||
#define CLKCFG_FSB_667 (3 << 0) /* hrawclk 166 */
|
#define CLKCFG_FSB_667 (3 << 0) /* hrawclk 166 */
|
||||||
#define CLKCFG_FSB_800 (2 << 0) /* hrawclk 200 */
|
#define CLKCFG_FSB_800 (2 << 0) /* hrawclk 200 */
|
||||||
#define CLKCFG_FSB_1067 (6 << 0) /* hrawclk 266 */
|
#define CLKCFG_FSB_1067 (6 << 0) /* hrawclk 266 */
|
||||||
|
#define CLKCFG_FSB_1067_ALT (0 << 0) /* hrawclk 266 */
|
||||||
#define CLKCFG_FSB_1333 (7 << 0) /* hrawclk 333 */
|
#define CLKCFG_FSB_1333 (7 << 0) /* hrawclk 333 */
|
||||||
/* Note, below two are guess */
|
/*
|
||||||
#define CLKCFG_FSB_1600 (4 << 0) /* hrawclk 400 */
|
* Note that on at least on ELK the below value is reported for both
|
||||||
#define CLKCFG_FSB_1600_ALT (0 << 0) /* hrawclk 400 */
|
* 333 and 400 MHz BIOS FSB setting, but given that the gmch datasheet
|
||||||
|
* lists only 200/266/333 MHz FSB as supported let's decode it as 333 MHz.
|
||||||
|
*/
|
||||||
|
#define CLKCFG_FSB_1333_ALT (4 << 0) /* hrawclk 333 */
|
||||||
#define CLKCFG_FSB_MASK (7 << 0)
|
#define CLKCFG_FSB_MASK (7 << 0)
|
||||||
#define CLKCFG_MEM_533 (1 << 4)
|
#define CLKCFG_MEM_533 (1 << 4)
|
||||||
#define CLKCFG_MEM_667 (2 << 4)
|
#define CLKCFG_MEM_667 (2 << 4)
|
||||||
|
|
|
@ -1798,13 +1798,11 @@ static int g4x_hrawclk(struct drm_i915_private *dev_priv)
|
||||||
case CLKCFG_FSB_800:
|
case CLKCFG_FSB_800:
|
||||||
return 200000;
|
return 200000;
|
||||||
case CLKCFG_FSB_1067:
|
case CLKCFG_FSB_1067:
|
||||||
|
case CLKCFG_FSB_1067_ALT:
|
||||||
return 266667;
|
return 266667;
|
||||||
case CLKCFG_FSB_1333:
|
case CLKCFG_FSB_1333:
|
||||||
|
case CLKCFG_FSB_1333_ALT:
|
||||||
return 333333;
|
return 333333;
|
||||||
/* these two are just a guess; one of them might be right */
|
|
||||||
case CLKCFG_FSB_1600:
|
|
||||||
case CLKCFG_FSB_1600_ALT:
|
|
||||||
return 400000;
|
|
||||||
default:
|
default:
|
||||||
return 133333;
|
return 133333;
|
||||||
}
|
}
|
||||||
|
|
|
@ -410,11 +410,10 @@ static void glk_dsi_device_ready(struct intel_encoder *encoder)
|
||||||
val |= (ULPS_STATE_ENTER | DEVICE_READY);
|
val |= (ULPS_STATE_ENTER | DEVICE_READY);
|
||||||
I915_WRITE(MIPI_DEVICE_READY(port), val);
|
I915_WRITE(MIPI_DEVICE_READY(port), val);
|
||||||
|
|
||||||
/* Wait for ULPS Not active */
|
/* Wait for ULPS active */
|
||||||
if (intel_wait_for_register(dev_priv,
|
if (intel_wait_for_register(dev_priv,
|
||||||
MIPI_CTRL(port), GLK_ULPS_NOT_ACTIVE,
|
MIPI_CTRL(port), GLK_ULPS_NOT_ACTIVE, 0, 20))
|
||||||
GLK_ULPS_NOT_ACTIVE, 20))
|
DRM_ERROR("ULPS not active\n");
|
||||||
DRM_ERROR("ULPS is still active\n");
|
|
||||||
|
|
||||||
/* Exit ULPS */
|
/* Exit ULPS */
|
||||||
val = I915_READ(MIPI_DEVICE_READY(port));
|
val = I915_READ(MIPI_DEVICE_READY(port));
|
||||||
|
|
|
@ -63,6 +63,7 @@
|
||||||
#include <linux/acpi.h>
|
#include <linux/acpi.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
|
#include <linux/pm_runtime.h>
|
||||||
|
|
||||||
#include "i915_drv.h"
|
#include "i915_drv.h"
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
@ -121,6 +122,10 @@ lpe_audio_platdev_create(struct drm_i915_private *dev_priv)
|
||||||
|
|
||||||
kfree(rsc);
|
kfree(rsc);
|
||||||
|
|
||||||
|
pm_runtime_forbid(&platdev->dev);
|
||||||
|
pm_runtime_set_active(&platdev->dev);
|
||||||
|
pm_runtime_enable(&platdev->dev);
|
||||||
|
|
||||||
return platdev;
|
return platdev;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
|
|
@ -360,6 +360,8 @@ nouveau_display_hpd_work(struct work_struct *work)
|
||||||
pm_runtime_get_sync(drm->dev->dev);
|
pm_runtime_get_sync(drm->dev->dev);
|
||||||
|
|
||||||
drm_helper_hpd_irq_event(drm->dev);
|
drm_helper_hpd_irq_event(drm->dev);
|
||||||
|
/* enable polling for external displays */
|
||||||
|
drm_kms_helper_poll_enable(drm->dev);
|
||||||
|
|
||||||
pm_runtime_mark_last_busy(drm->dev->dev);
|
pm_runtime_mark_last_busy(drm->dev->dev);
|
||||||
pm_runtime_put_sync(drm->dev->dev);
|
pm_runtime_put_sync(drm->dev->dev);
|
||||||
|
@ -413,10 +415,6 @@ nouveau_display_init(struct drm_device *dev)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* enable polling for external displays */
|
|
||||||
if (!dev->mode_config.poll_enabled)
|
|
||||||
drm_kms_helper_poll_enable(dev);
|
|
||||||
|
|
||||||
/* enable hotplug interrupts */
|
/* enable hotplug interrupts */
|
||||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||||
struct nouveau_connector *conn = nouveau_connector(connector);
|
struct nouveau_connector *conn = nouveau_connector(connector);
|
||||||
|
|
|
@ -502,6 +502,9 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
|
||||||
pm_runtime_allow(dev->dev);
|
pm_runtime_allow(dev->dev);
|
||||||
pm_runtime_mark_last_busy(dev->dev);
|
pm_runtime_mark_last_busy(dev->dev);
|
||||||
pm_runtime_put(dev->dev);
|
pm_runtime_put(dev->dev);
|
||||||
|
} else {
|
||||||
|
/* enable polling for external displays */
|
||||||
|
drm_kms_helper_poll_enable(dev);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -774,9 +777,6 @@ nouveau_pmops_runtime_resume(struct device *dev)
|
||||||
|
|
||||||
ret = nouveau_do_resume(drm_dev, true);
|
ret = nouveau_do_resume(drm_dev, true);
|
||||||
|
|
||||||
if (!drm_dev->mode_config.poll_enabled)
|
|
||||||
drm_kms_helper_poll_enable(drm_dev);
|
|
||||||
|
|
||||||
/* do magic */
|
/* do magic */
|
||||||
nvif_mask(&device->object, 0x088488, (1 << 25), (1 << 25));
|
nvif_mask(&device->object, 0x088488, (1 << 25), (1 << 25));
|
||||||
vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_ON);
|
vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_ON);
|
||||||
|
|
|
@ -148,7 +148,7 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl)
|
||||||
case NVKM_MEM_TARGET_NCOH: target = 3; break;
|
case NVKM_MEM_TARGET_NCOH: target = 3; break;
|
||||||
default:
|
default:
|
||||||
WARN_ON(1);
|
WARN_ON(1);
|
||||||
return;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
nvkm_wr32(device, 0x002270, (nvkm_memory_addr(mem) >> 12) |
|
nvkm_wr32(device, 0x002270, (nvkm_memory_addr(mem) >> 12) |
|
||||||
|
@ -160,6 +160,7 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl)
|
||||||
& 0x00100000),
|
& 0x00100000),
|
||||||
msecs_to_jiffies(2000)) == 0)
|
msecs_to_jiffies(2000)) == 0)
|
||||||
nvkm_error(subdev, "runlist %d update timeout\n", runl);
|
nvkm_error(subdev, "runlist %d update timeout\n", runl);
|
||||||
|
unlock:
|
||||||
mutex_unlock(&subdev->mutex);
|
mutex_unlock(&subdev->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,6 +116,7 @@ ls_ucode_img_load_gr(const struct nvkm_subdev *subdev, struct ls_ucode_img *img,
|
||||||
ret = nvkm_firmware_get(subdev->device, f, &sig);
|
ret = nvkm_firmware_get(subdev->device, f, &sig);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto free_data;
|
goto free_data;
|
||||||
|
|
||||||
img->sig = kmemdup(sig->data, sig->size, GFP_KERNEL);
|
img->sig = kmemdup(sig->data, sig->size, GFP_KERNEL);
|
||||||
if (!img->sig) {
|
if (!img->sig) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
@ -126,8 +127,9 @@ ls_ucode_img_load_gr(const struct nvkm_subdev *subdev, struct ls_ucode_img *img,
|
||||||
img->ucode_data = ls_ucode_img_build(bl, code, data,
|
img->ucode_data = ls_ucode_img_build(bl, code, data,
|
||||||
&img->ucode_desc);
|
&img->ucode_desc);
|
||||||
if (IS_ERR(img->ucode_data)) {
|
if (IS_ERR(img->ucode_data)) {
|
||||||
|
kfree(img->sig);
|
||||||
ret = PTR_ERR(img->ucode_data);
|
ret = PTR_ERR(img->ucode_data);
|
||||||
goto free_data;
|
goto free_sig;
|
||||||
}
|
}
|
||||||
img->ucode_size = img->ucode_desc.image_size;
|
img->ucode_size = img->ucode_desc.image_size;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
config TEGRA_HOST1X
|
config TEGRA_HOST1X
|
||||||
tristate "NVIDIA Tegra host1x driver"
|
tristate "NVIDIA Tegra host1x driver"
|
||||||
depends on ARCH_TEGRA || (ARM && COMPILE_TEST)
|
depends on ARCH_TEGRA || (ARM && COMPILE_TEST)
|
||||||
|
select IOMMU_IOVA if IOMMU_SUPPORT
|
||||||
help
|
help
|
||||||
Driver for the NVIDIA Tegra host1x hardware.
|
Driver for the NVIDIA Tegra host1x hardware.
|
||||||
|
|
||||||
|
|
|
@ -1809,10 +1809,6 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev)
|
||||||
pdata->notify_pending = false;
|
pdata->notify_pending = false;
|
||||||
spin_unlock_irq(&pdata->lpe_audio_slock);
|
spin_unlock_irq(&pdata->lpe_audio_slock);
|
||||||
|
|
||||||
/* runtime PM isn't enabled as default, since it won't save much on
|
|
||||||
* BYT/CHT devices; user who want the runtime PM should adjust the
|
|
||||||
* power/ontrol and power/autosuspend_delay_ms sysfs entries instead
|
|
||||||
*/
|
|
||||||
pm_runtime_use_autosuspend(&pdev->dev);
|
pm_runtime_use_autosuspend(&pdev->dev);
|
||||||
pm_runtime_mark_last_busy(&pdev->dev);
|
pm_runtime_mark_last_busy(&pdev->dev);
|
||||||
pm_runtime_set_active(&pdev->dev);
|
pm_runtime_set_active(&pdev->dev);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue