drm-fixes for 5.0-rc2, part 2
nouveau: one backlight, falcon register access, and a fan fix. i915: - Disable PSR for Apple panels - Broxton ERR_PTR error state fix - Kabylake VECS workaround fix - Unwind failure on pinning the gen7 ppgtt - GVT workload request allocation fix core: - Fix fb-helper to work correctly with SDL 1.2 bugs. - Fix lockdep warning in the atomic ioctl and setproperty. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEb4nG6jLu8Y5XI+PfTA9ye/CYqnEFAlw5IEcACgkQTA9ye/CY qnFrLw/9G9cEKiM9ZPspa5ovEi1S1lwUaKD5JWJckaLzbNIkDFDpfbV0X8An+IOt L0Db/cdtsBZ67Ci+QrUk60Zy36dFRChDafCP41U2nZtn5iel9v474fys13ZFwtWa znyvb5trPEB+76Sc3YDQuK2Aapr/NDowm993qkCJq8euQboFI6jfC7Ib/+zrsZjz 7OErdKVSkxPT8hEeQq6DkuB0hDMCvb9V/Gu0pzYn+Tb5ECl6ZTSSjf4bxhQ8qG6x P+rPQLcymgG+OhYuHn19rh1Y/3NPJnDN4lgZ5HOKVyvKIfjLGuZwriZ5e53sbgWw sjBD/9tSHSSRH3Taj4yVWw/XcwIH9YnUmaMAPe35bQmweYjMILlrkWEIGC+g4loi aebq66x2LWZ4tqiGu5flNfXPnLYJqnvaA8z4vEPdtwAN/JsrbRD3lUWkVV5Ydvdq KFQnrzCXuDWf8UjmW70utvkW+pxK155Xb/3IqivF8tpoz+jC+NeXqp7cts9gOJkj UZv842gymFJ0yQ3ZhjFJKc2aAe2eKtq8lJiCDzVA0uwg2ddebi2ttJTo6rH9ze58 XEhywCGptMKOOYsCDzzkqAGNTkOajd88d1/HCrwWeHW6SIfEfHPsYliC6O9ZzgLM xO1/JGF7PrlggtzM+rffVgh2lVFKQxErUZkPPkecUj42XjnX+is= =7xM2 -----END PGP SIGNATURE----- Merge tag 'drm-fixes-2019-01-11-1' of git://anongit.freedesktop.org/drm/drm Pull more drm fixes from Daniel Vetter: "Dave sends out his pull, everybody remembers holidays are over :-) Since Dave's already in weekend mode and it was quite a few patches I figured better to apply all the pulls and forward them to you. Hence here 2nd part of bugfixes for -rc2. nouveau: - backlight fix - falcon register access fix - fan fix. i915: - Disable PSR for Apple panels - Broxton ERR_PTR error state fix - Kabylake VECS workaround fix - Unwind failure on pinning the gen7 ppgtt - GVT workload request allocation fix core: - Fix fb-helper to work correctly with SDL 1.2 bugs - Fix lockdep warning in the atomic ioctl and setproperty" * tag 'drm-fixes-2019-01-11-1' of git://anongit.freedesktop.org/drm/drm: drm/nouveau/falcon: avoid touching registers if engine is off drm/nouveau: Don't disable polling in fallback mode drm/nouveau: register backlight on pascal and newer drm: Fix documentation generation for DP_DPCD_QUIRK_NO_PSR drm/i915: init per-engine WAs for all engines drm/i915: Unwind failure on pinning the gen7 ppgtt drm/i915: Skip the ERR_PTR error state drm/i915: Disable PSR in Apple panels gpu/drm: Fix lock held when returning to user space. drm/fb-helper: Ignore the value of fb_var_screeninfo.pixclock drm/fb-helper: Partially bring back workaround for bugs of SDL 1.2 drm/i915/gvt: Fix workload request allocation before request add
This commit is contained in:
commit
7b5c8f5226
@ -1296,12 +1296,11 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
|
||||
(arg->flags & DRM_MODE_PAGE_FLIP_EVENT))
|
||||
return -EINVAL;
|
||||
|
||||
drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE);
|
||||
|
||||
state = drm_atomic_state_alloc(dev);
|
||||
if (!state)
|
||||
return -ENOMEM;
|
||||
|
||||
drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE);
|
||||
state->acquire_ctx = &ctx;
|
||||
state->allow_modeset = !!(arg->flags & DRM_MODE_ATOMIC_ALLOW_MODESET);
|
||||
|
||||
|
@ -1273,6 +1273,8 @@ static const struct dpcd_quirk dpcd_quirk_list[] = {
|
||||
{ OUI(0x00, 0x22, 0xb9), DEVICE_ID_ANY, true, BIT(DP_DPCD_QUIRK_CONSTANT_N) },
|
||||
/* LG LP140WF6-SPM1 eDP panel */
|
||||
{ OUI(0x00, 0x22, 0xb9), DEVICE_ID('s', 'i', 'v', 'a', 'r', 'T'), false, BIT(DP_DPCD_QUIRK_CONSTANT_N) },
|
||||
/* Apple panels need some additional handling to support PSR */
|
||||
{ OUI(0x00, 0x10, 0xfa), DEVICE_ID_ANY, false, BIT(DP_DPCD_QUIRK_NO_PSR) }
|
||||
};
|
||||
|
||||
#undef OUI
|
||||
|
@ -1621,6 +1621,64 @@ static bool drm_fb_pixel_format_equal(const struct fb_var_screeninfo *var_1,
|
||||
var_1->transp.msb_right == var_2->transp.msb_right;
|
||||
}
|
||||
|
||||
static void drm_fb_helper_fill_pixel_fmt(struct fb_var_screeninfo *var,
|
||||
u8 depth)
|
||||
{
|
||||
switch (depth) {
|
||||
case 8:
|
||||
var->red.offset = 0;
|
||||
var->green.offset = 0;
|
||||
var->blue.offset = 0;
|
||||
var->red.length = 8; /* 8bit DAC */
|
||||
var->green.length = 8;
|
||||
var->blue.length = 8;
|
||||
var->transp.offset = 0;
|
||||
var->transp.length = 0;
|
||||
break;
|
||||
case 15:
|
||||
var->red.offset = 10;
|
||||
var->green.offset = 5;
|
||||
var->blue.offset = 0;
|
||||
var->red.length = 5;
|
||||
var->green.length = 5;
|
||||
var->blue.length = 5;
|
||||
var->transp.offset = 15;
|
||||
var->transp.length = 1;
|
||||
break;
|
||||
case 16:
|
||||
var->red.offset = 11;
|
||||
var->green.offset = 5;
|
||||
var->blue.offset = 0;
|
||||
var->red.length = 5;
|
||||
var->green.length = 6;
|
||||
var->blue.length = 5;
|
||||
var->transp.offset = 0;
|
||||
break;
|
||||
case 24:
|
||||
var->red.offset = 16;
|
||||
var->green.offset = 8;
|
||||
var->blue.offset = 0;
|
||||
var->red.length = 8;
|
||||
var->green.length = 8;
|
||||
var->blue.length = 8;
|
||||
var->transp.offset = 0;
|
||||
var->transp.length = 0;
|
||||
break;
|
||||
case 32:
|
||||
var->red.offset = 16;
|
||||
var->green.offset = 8;
|
||||
var->blue.offset = 0;
|
||||
var->red.length = 8;
|
||||
var->green.length = 8;
|
||||
var->blue.length = 8;
|
||||
var->transp.offset = 24;
|
||||
var->transp.length = 8;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_fb_helper_check_var - implementation for &fb_ops.fb_check_var
|
||||
* @var: screeninfo to check
|
||||
@ -1632,9 +1690,14 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
|
||||
struct drm_fb_helper *fb_helper = info->par;
|
||||
struct drm_framebuffer *fb = fb_helper->fb;
|
||||
|
||||
if (var->pixclock != 0 || in_dbg_master())
|
||||
if (in_dbg_master())
|
||||
return -EINVAL;
|
||||
|
||||
if (var->pixclock != 0) {
|
||||
DRM_DEBUG("fbdev emulation doesn't support changing the pixel clock, value of pixclock is ignored\n");
|
||||
var->pixclock = 0;
|
||||
}
|
||||
|
||||
if ((drm_format_info_block_width(fb->format, 0) > 1) ||
|
||||
(drm_format_info_block_height(fb->format, 0) > 1))
|
||||
return -EINVAL;
|
||||
@ -1654,6 +1717,20 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Workaround for SDL 1.2, which is known to be setting all pixel format
|
||||
* fields values to zero in some cases. We treat this situation as a
|
||||
* kind of "use some reasonable autodetected values".
|
||||
*/
|
||||
if (!var->red.offset && !var->green.offset &&
|
||||
!var->blue.offset && !var->transp.offset &&
|
||||
!var->red.length && !var->green.length &&
|
||||
!var->blue.length && !var->transp.length &&
|
||||
!var->red.msb_right && !var->green.msb_right &&
|
||||
!var->blue.msb_right && !var->transp.msb_right) {
|
||||
drm_fb_helper_fill_pixel_fmt(var, fb->format->depth);
|
||||
}
|
||||
|
||||
/*
|
||||
* drm fbdev emulation doesn't support changing the pixel format at all,
|
||||
* so reject all pixel format changing requests.
|
||||
@ -1967,59 +2044,7 @@ void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helpe
|
||||
info->var.yoffset = 0;
|
||||
info->var.activate = FB_ACTIVATE_NOW;
|
||||
|
||||
switch (fb->format->depth) {
|
||||
case 8:
|
||||
info->var.red.offset = 0;
|
||||
info->var.green.offset = 0;
|
||||
info->var.blue.offset = 0;
|
||||
info->var.red.length = 8; /* 8bit DAC */
|
||||
info->var.green.length = 8;
|
||||
info->var.blue.length = 8;
|
||||
info->var.transp.offset = 0;
|
||||
info->var.transp.length = 0;
|
||||
break;
|
||||
case 15:
|
||||
info->var.red.offset = 10;
|
||||
info->var.green.offset = 5;
|
||||
info->var.blue.offset = 0;
|
||||
info->var.red.length = 5;
|
||||
info->var.green.length = 5;
|
||||
info->var.blue.length = 5;
|
||||
info->var.transp.offset = 15;
|
||||
info->var.transp.length = 1;
|
||||
break;
|
||||
case 16:
|
||||
info->var.red.offset = 11;
|
||||
info->var.green.offset = 5;
|
||||
info->var.blue.offset = 0;
|
||||
info->var.red.length = 5;
|
||||
info->var.green.length = 6;
|
||||
info->var.blue.length = 5;
|
||||
info->var.transp.offset = 0;
|
||||
break;
|
||||
case 24:
|
||||
info->var.red.offset = 16;
|
||||
info->var.green.offset = 8;
|
||||
info->var.blue.offset = 0;
|
||||
info->var.red.length = 8;
|
||||
info->var.green.length = 8;
|
||||
info->var.blue.length = 8;
|
||||
info->var.transp.offset = 0;
|
||||
info->var.transp.length = 0;
|
||||
break;
|
||||
case 32:
|
||||
info->var.red.offset = 16;
|
||||
info->var.green.offset = 8;
|
||||
info->var.blue.offset = 0;
|
||||
info->var.red.length = 8;
|
||||
info->var.green.length = 8;
|
||||
info->var.blue.length = 8;
|
||||
info->var.transp.offset = 24;
|
||||
info->var.transp.length = 8;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
drm_fb_helper_fill_pixel_fmt(&info->var, fb->format->depth);
|
||||
|
||||
info->var.xres = fb_width;
|
||||
info->var.yres = fb_height;
|
||||
|
@ -459,11 +459,11 @@ static int set_property_atomic(struct drm_mode_object *obj,
|
||||
struct drm_modeset_acquire_ctx ctx;
|
||||
int ret;
|
||||
|
||||
drm_modeset_acquire_init(&ctx, 0);
|
||||
|
||||
state = drm_atomic_state_alloc(dev);
|
||||
if (!state)
|
||||
return -ENOMEM;
|
||||
|
||||
drm_modeset_acquire_init(&ctx, 0);
|
||||
state->acquire_ctx = &ctx;
|
||||
retry:
|
||||
if (prop == state->dev->mode_config.dpms_property) {
|
||||
|
@ -356,6 +356,33 @@ static int set_context_ppgtt_from_shadow(struct intel_vgpu_workload *workload,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
intel_gvt_workload_req_alloc(struct intel_vgpu_workload *workload)
|
||||
{
|
||||
struct intel_vgpu *vgpu = workload->vgpu;
|
||||
struct intel_vgpu_submission *s = &vgpu->submission;
|
||||
struct i915_gem_context *shadow_ctx = s->shadow_ctx;
|
||||
struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
|
||||
struct intel_engine_cs *engine = dev_priv->engine[workload->ring_id];
|
||||
struct i915_request *rq;
|
||||
int ret = 0;
|
||||
|
||||
lockdep_assert_held(&dev_priv->drm.struct_mutex);
|
||||
|
||||
if (workload->req)
|
||||
goto out;
|
||||
|
||||
rq = i915_request_alloc(engine, shadow_ctx);
|
||||
if (IS_ERR(rq)) {
|
||||
gvt_vgpu_err("fail to allocate gem request\n");
|
||||
ret = PTR_ERR(rq);
|
||||
goto out;
|
||||
}
|
||||
workload->req = i915_request_get(rq);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_gvt_scan_and_shadow_workload - audit the workload by scanning and
|
||||
* shadow it as well, include ringbuffer,wa_ctx and ctx.
|
||||
@ -372,12 +399,11 @@ int intel_gvt_scan_and_shadow_workload(struct intel_vgpu_workload *workload)
|
||||
struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
|
||||
struct intel_engine_cs *engine = dev_priv->engine[workload->ring_id];
|
||||
struct intel_context *ce;
|
||||
struct i915_request *rq;
|
||||
int ret;
|
||||
|
||||
lockdep_assert_held(&dev_priv->drm.struct_mutex);
|
||||
|
||||
if (workload->req)
|
||||
if (workload->shadow)
|
||||
return 0;
|
||||
|
||||
ret = set_context_ppgtt_from_shadow(workload, shadow_ctx);
|
||||
@ -417,22 +443,8 @@ int intel_gvt_scan_and_shadow_workload(struct intel_vgpu_workload *workload)
|
||||
goto err_shadow;
|
||||
}
|
||||
|
||||
rq = i915_request_alloc(engine, shadow_ctx);
|
||||
if (IS_ERR(rq)) {
|
||||
gvt_vgpu_err("fail to allocate gem request\n");
|
||||
ret = PTR_ERR(rq);
|
||||
goto err_shadow;
|
||||
}
|
||||
workload->req = i915_request_get(rq);
|
||||
|
||||
ret = populate_shadow_context(workload);
|
||||
if (ret)
|
||||
goto err_req;
|
||||
|
||||
workload->shadow = true;
|
||||
return 0;
|
||||
err_req:
|
||||
rq = fetch_and_zero(&workload->req);
|
||||
i915_request_put(rq);
|
||||
err_shadow:
|
||||
release_shadow_wa_ctx(&workload->wa_ctx);
|
||||
err_unpin:
|
||||
@ -671,23 +683,31 @@ static int dispatch_workload(struct intel_vgpu_workload *workload)
|
||||
mutex_lock(&vgpu->vgpu_lock);
|
||||
mutex_lock(&dev_priv->drm.struct_mutex);
|
||||
|
||||
ret = intel_gvt_workload_req_alloc(workload);
|
||||
if (ret)
|
||||
goto err_req;
|
||||
|
||||
ret = intel_gvt_scan_and_shadow_workload(workload);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = populate_shadow_context(workload);
|
||||
if (ret) {
|
||||
release_shadow_wa_ctx(&workload->wa_ctx);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = prepare_workload(workload);
|
||||
|
||||
out:
|
||||
if (ret)
|
||||
workload->status = ret;
|
||||
|
||||
if (!IS_ERR_OR_NULL(workload->req)) {
|
||||
gvt_dbg_sched("ring id %d submit workload to i915 %p\n",
|
||||
ring_id, workload->req);
|
||||
i915_request_add(workload->req);
|
||||
workload->dispatched = true;
|
||||
}
|
||||
|
||||
err_req:
|
||||
if (ret)
|
||||
workload->status = ret;
|
||||
mutex_unlock(&dev_priv->drm.struct_mutex);
|
||||
mutex_unlock(&vgpu->vgpu_lock);
|
||||
return ret;
|
||||
|
@ -83,6 +83,7 @@ struct intel_vgpu_workload {
|
||||
struct i915_request *req;
|
||||
/* if this workload has been dispatched to i915? */
|
||||
bool dispatched;
|
||||
bool shadow; /* if workload has done shadow of guest request */
|
||||
int status;
|
||||
|
||||
struct intel_vgpu_mm *shadow_mm;
|
||||
|
@ -984,8 +984,8 @@ static int i915_gpu_info_open(struct inode *inode, struct file *file)
|
||||
intel_runtime_pm_get(i915);
|
||||
gpu = i915_capture_gpu_state(i915);
|
||||
intel_runtime_pm_put(i915);
|
||||
if (!gpu)
|
||||
return -ENOMEM;
|
||||
if (IS_ERR(gpu))
|
||||
return PTR_ERR(gpu);
|
||||
|
||||
file->private_data = gpu;
|
||||
return 0;
|
||||
@ -1018,7 +1018,13 @@ i915_error_state_write(struct file *filp,
|
||||
|
||||
static int i915_error_state_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
file->private_data = i915_first_error_state(inode->i_private);
|
||||
struct i915_gpu_state *error;
|
||||
|
||||
error = i915_first_error_state(inode->i_private);
|
||||
if (IS_ERR(error))
|
||||
return PTR_ERR(error);
|
||||
|
||||
file->private_data = error;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2075,6 +2075,7 @@ static struct i915_vma *pd_vma_create(struct gen6_hw_ppgtt *ppgtt, int size)
|
||||
int gen6_ppgtt_pin(struct i915_hw_ppgtt *base)
|
||||
{
|
||||
struct gen6_hw_ppgtt *ppgtt = to_gen6_ppgtt(base);
|
||||
int err;
|
||||
|
||||
/*
|
||||
* Workaround the limited maximum vma->pin_count and the aliasing_ppgtt
|
||||
@ -2090,9 +2091,17 @@ int gen6_ppgtt_pin(struct i915_hw_ppgtt *base)
|
||||
* allocator works in address space sizes, so it's multiplied by page
|
||||
* size. We allocate at the top of the GTT to avoid fragmentation.
|
||||
*/
|
||||
return i915_vma_pin(ppgtt->vma,
|
||||
0, GEN6_PD_ALIGN,
|
||||
PIN_GLOBAL | PIN_HIGH);
|
||||
err = i915_vma_pin(ppgtt->vma,
|
||||
0, GEN6_PD_ALIGN,
|
||||
PIN_GLOBAL | PIN_HIGH);
|
||||
if (err)
|
||||
goto unpin;
|
||||
|
||||
return 0;
|
||||
|
||||
unpin:
|
||||
ppgtt->pin_count = 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
void gen6_ppgtt_unpin(struct i915_hw_ppgtt *base)
|
||||
|
@ -1907,9 +1907,16 @@ i915_capture_gpu_state(struct drm_i915_private *i915)
|
||||
{
|
||||
struct i915_gpu_state *error;
|
||||
|
||||
/* Check if GPU capture has been disabled */
|
||||
error = READ_ONCE(i915->gpu_error.first_error);
|
||||
if (IS_ERR(error))
|
||||
return error;
|
||||
|
||||
error = kzalloc(sizeof(*error), GFP_ATOMIC);
|
||||
if (!error)
|
||||
return NULL;
|
||||
if (!error) {
|
||||
i915_disable_error_state(i915, -ENOMEM);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
kref_init(&error->ref);
|
||||
error->i915 = i915;
|
||||
@ -1945,11 +1952,8 @@ void i915_capture_error_state(struct drm_i915_private *i915,
|
||||
return;
|
||||
|
||||
error = i915_capture_gpu_state(i915);
|
||||
if (!error) {
|
||||
DRM_DEBUG_DRIVER("out of memory, not capturing error state\n");
|
||||
i915_disable_error_state(i915, -ENOMEM);
|
||||
if (IS_ERR(error))
|
||||
return;
|
||||
}
|
||||
|
||||
i915_error_capture_msg(i915, error, engine_mask, error_msg);
|
||||
DRM_INFO("%s\n", error->error_msg);
|
||||
@ -1987,7 +1991,7 @@ i915_first_error_state(struct drm_i915_private *i915)
|
||||
|
||||
spin_lock_irq(&i915->gpu_error.lock);
|
||||
error = i915->gpu_error.first_error;
|
||||
if (error)
|
||||
if (!IS_ERR_OR_NULL(error))
|
||||
i915_gpu_state_get(error);
|
||||
spin_unlock_irq(&i915->gpu_error.lock);
|
||||
|
||||
@ -2000,10 +2004,11 @@ void i915_reset_error_state(struct drm_i915_private *i915)
|
||||
|
||||
spin_lock_irq(&i915->gpu_error.lock);
|
||||
error = i915->gpu_error.first_error;
|
||||
i915->gpu_error.first_error = NULL;
|
||||
if (error != ERR_PTR(-ENODEV)) /* if disabled, always disabled */
|
||||
i915->gpu_error.first_error = NULL;
|
||||
spin_unlock_irq(&i915->gpu_error.lock);
|
||||
|
||||
if (!IS_ERR(error))
|
||||
if (!IS_ERR_OR_NULL(error))
|
||||
i915_gpu_state_put(error);
|
||||
}
|
||||
|
||||
|
@ -521,7 +521,9 @@ static ssize_t error_state_read(struct file *filp, struct kobject *kobj,
|
||||
ssize_t ret;
|
||||
|
||||
gpu = i915_first_error_state(i915);
|
||||
if (gpu) {
|
||||
if (IS_ERR(gpu)) {
|
||||
ret = PTR_ERR(gpu);
|
||||
} else if (gpu) {
|
||||
ret = i915_gpu_state_copy_to_buffer(gpu, buf, off, count);
|
||||
i915_gpu_state_put(gpu);
|
||||
} else {
|
||||
|
@ -2244,6 +2244,8 @@ static int logical_ring_init(struct intel_engine_cs *engine)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
intel_engine_init_workarounds(engine);
|
||||
|
||||
if (HAS_LOGICAL_RING_ELSQ(i915)) {
|
||||
execlists->submit_reg = i915->regs +
|
||||
i915_mmio_reg_offset(RING_EXECLIST_SQ_CONTENTS(engine));
|
||||
@ -2310,7 +2312,6 @@ int logical_render_ring_init(struct intel_engine_cs *engine)
|
||||
}
|
||||
|
||||
intel_engine_init_whitelist(engine);
|
||||
intel_engine_init_workarounds(engine);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -274,10 +274,16 @@ void intel_psr_init_dpcd(struct intel_dp *intel_dp)
|
||||
DRM_DEBUG_KMS("eDP panel supports PSR version %x\n",
|
||||
intel_dp->psr_dpcd[0]);
|
||||
|
||||
if (drm_dp_has_quirk(&intel_dp->desc, DP_DPCD_QUIRK_NO_PSR)) {
|
||||
DRM_DEBUG_KMS("PSR support not currently available for this panel\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(intel_dp->edp_dpcd[1] & DP_EDP_SET_POWER_CAP)) {
|
||||
DRM_DEBUG_KMS("Panel lacks power state control, PSR cannot be enabled\n");
|
||||
return;
|
||||
}
|
||||
|
||||
dev_priv->psr.sink_support = true;
|
||||
dev_priv->psr.sink_sync_latency =
|
||||
intel_dp_get_sink_sync_latency(intel_dp);
|
||||
|
@ -253,6 +253,9 @@ nouveau_backlight_init(struct drm_connector *connector)
|
||||
case NV_DEVICE_INFO_V0_FERMI:
|
||||
case NV_DEVICE_INFO_V0_KEPLER:
|
||||
case NV_DEVICE_INFO_V0_MAXWELL:
|
||||
case NV_DEVICE_INFO_V0_PASCAL:
|
||||
case NV_DEVICE_INFO_V0_VOLTA:
|
||||
case NV_DEVICE_INFO_V0_TURING:
|
||||
ret = nv50_backlight_init(nv_encoder, &props, &ops);
|
||||
break;
|
||||
default:
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <engine/falcon.h>
|
||||
|
||||
#include <core/gpuobj.h>
|
||||
#include <subdev/mc.h>
|
||||
#include <subdev/timer.h>
|
||||
#include <engine/fifo.h>
|
||||
|
||||
@ -107,8 +108,10 @@ nvkm_falcon_fini(struct nvkm_engine *engine, bool suspend)
|
||||
}
|
||||
}
|
||||
|
||||
nvkm_mask(device, base + 0x048, 0x00000003, 0x00000000);
|
||||
nvkm_wr32(device, base + 0x014, 0xffffffff);
|
||||
if (nvkm_mc_enabled(device, engine->subdev.index)) {
|
||||
nvkm_mask(device, base + 0x048, 0x00000003, 0x00000000);
|
||||
nvkm_wr32(device, base + 0x014, 0xffffffff);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -132,11 +132,12 @@ nvkm_therm_update(struct nvkm_therm *therm, int mode)
|
||||
duty = nvkm_therm_update_linear(therm);
|
||||
break;
|
||||
case NVBIOS_THERM_FAN_OTHER:
|
||||
if (therm->cstate)
|
||||
if (therm->cstate) {
|
||||
duty = therm->cstate;
|
||||
else
|
||||
poll = false;
|
||||
} else {
|
||||
duty = nvkm_therm_update_linear_fallback(therm);
|
||||
poll = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
immd = false;
|
||||
|
@ -1365,6 +1365,13 @@ enum drm_dp_quirk {
|
||||
* to 16 bits. So will give a constant value (0x8000) for compatability.
|
||||
*/
|
||||
DP_DPCD_QUIRK_CONSTANT_N,
|
||||
/**
|
||||
* @DP_DPCD_QUIRK_NO_PSR:
|
||||
*
|
||||
* The device does not support PSR even if reports that it supports or
|
||||
* driver still need to implement proper handling for such device.
|
||||
*/
|
||||
DP_DPCD_QUIRK_NO_PSR,
|
||||
};
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user