From: Greg Kroah-Hartman Date: Sun, 12 Mar 2017 19:37:29 +0000 (+0100) Subject: 4.10-stable patches X-Git-Tag: v4.4.54~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=24400fc158468f5d8f2a8c520174d0be2489622b;p=thirdparty%2Fkernel%2Fstable-queue.git 4.10-stable patches added patches: drm-i915-avoid-spurious-warns-about-the-wrong-pipe-in-the-pps-code.patch drm-i915-check-for-timeout-completion-when-waiting-for-the-rq-to-submitted.patch drm-i915-fix-not-finding-the-vbt-when-it-overlaps-with-opregion_asle_ext.patch drm-i915-pass-timeout-0-on-to-i915_gem_object_wait_fence.patch drm-i915-recreate-internal-objects-with-single-page-segments-if-dmar-fails.patch --- diff --git a/queue-4.10/drm-i915-avoid-spurious-warns-about-the-wrong-pipe-in-the-pps-code.patch b/queue-4.10/drm-i915-avoid-spurious-warns-about-the-wrong-pipe-in-the-pps-code.patch new file mode 100644 index 00000000000..4f5cbd51acb --- /dev/null +++ b/queue-4.10/drm-i915-avoid-spurious-warns-about-the-wrong-pipe-in-the-pps-code.patch @@ -0,0 +1,57 @@ +From aa9323dd49b23932a09023012f050556de64f118 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= +Date: Wed, 8 Feb 2017 19:52:54 +0200 +Subject: drm/i915: Avoid spurious WARNs about the wrong pipe in the PPS code +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ville Syrjälä + +commit aa9323dd49b23932a09023012f050556de64f118 upstream. + +Until recently vlv_steal_power_sequencer() wasn't being called for +normal DP ports, and hence it could assert that it should only be +called for pipe A and B (since pipe C doesn't support eDP). However +that changed when we started to consider normal DP ports as well when +choosing a PPS. So we will now get spurious warnings when +vlv_steal_power_sequencer() does get called for pipe C. Avoid this by +moving the WARN down into vlv_detach_power_sequencer() where this +assertion should still hold. + +Cc: Imre Deak +Fixes: 9f2bdb006a7e ("drm/i915: Prevent PPS stealing from a normal DP port on VLV/CHV") +References: https://bugs.freedesktop.org/show_bug.cgi?id=95287 +Signed-off-by: Ville Syrjälä +Link: http://patchwork.freedesktop.org/patch/msgid/20170208175254.10958-1-ville.syrjala@linux.intel.com +Reviewed-by: Imre Deak +(cherry picked from commit d158694f452252d0fef335a775aeb3eb74fe7af0) +Signed-off-by: Jani Nikula +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_dp.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_dp.c ++++ b/drivers/gpu/drm/i915/intel_dp.c +@@ -2820,6 +2820,9 @@ static void vlv_detach_power_sequencer(s + enum pipe pipe = intel_dp->pps_pipe; + i915_reg_t pp_on_reg = PP_ON_DELAYS(pipe); + ++ if (WARN_ON(pipe != PIPE_A && pipe != PIPE_B)) ++ return; ++ + edp_panel_vdd_off_sync(intel_dp); + + /* +@@ -2847,9 +2850,6 @@ static void vlv_steal_power_sequencer(st + + lockdep_assert_held(&dev_priv->pps_mutex); + +- if (WARN_ON(pipe != PIPE_A && pipe != PIPE_B)) +- return; +- + for_each_intel_encoder(dev, encoder) { + struct intel_dp *intel_dp; + enum port port; diff --git a/queue-4.10/drm-i915-check-for-timeout-completion-when-waiting-for-the-rq-to-submitted.patch b/queue-4.10/drm-i915-check-for-timeout-completion-when-waiting-for-the-rq-to-submitted.patch new file mode 100644 index 00000000000..1c6b8368c60 --- /dev/null +++ b/queue-4.10/drm-i915-check-for-timeout-completion-when-waiting-for-the-rq-to-submitted.patch @@ -0,0 +1,52 @@ +From 44a027058b24541cc7ec499e6fb91db4b130648a Mon Sep 17 00:00:00 2001 +From: Chris Wilson +Date: Wed, 8 Feb 2017 18:12:38 +0000 +Subject: drm/i915: Check for timeout completion when waiting for the rq to submitted + +From: Chris Wilson + +commit 44a027058b24541cc7ec499e6fb91db4b130648a upstream. + +We first wait for a request to be submitted to hw and assigned a seqno, +before we can wait for the hw to signal completion (otherwise we don't +know the hw id we need to wait upon). Whilst waiting for the request to +be submitted, we may exceed the user's timeout and need to propagate the +error back. + +v2: Make ETIME into an error from wait_for_execute for consistent exit +handling. + +Reported-by: Tvrtko Ursulin +Fixes: 4680816be336 ("drm/i915: Wait first for submission, before waiting for request completion") +Testcase: igt/gem_wait/basic-await +Signed-off-by: Chris Wilson +Cc: Tvrtko Ursulin +Cc: Joonas Lahtinen +Cc: # v4.10-rc1+ +Link: http://patchwork.freedesktop.org/patch/msgid/20170208181238.7232-1-chris@chris-wilson.co.uk +Reviewed-by: Tvrtko Ursulin +(cherry picked from commit 969bb72cbfd906d347cf76dc9b8c8dbaf83ba27a) +Signed-off-by: Jani Nikula +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/i915_gem_request.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/i915/i915_gem_request.c ++++ b/drivers/gpu/drm/i915/i915_gem_request.c +@@ -1011,8 +1011,13 @@ __i915_request_wait_for_execute(struct d + break; + } + ++ if (!timeout) { ++ timeout = -ETIME; ++ break; ++ } ++ + timeout = io_schedule_timeout(timeout); +- } while (timeout); ++ } while (1); + finish_wait(&request->execute.wait, &wait); + + if (flags & I915_WAIT_LOCKED) diff --git a/queue-4.10/drm-i915-fix-not-finding-the-vbt-when-it-overlaps-with-opregion_asle_ext.patch b/queue-4.10/drm-i915-fix-not-finding-the-vbt-when-it-overlaps-with-opregion_asle_ext.patch new file mode 100644 index 00000000000..ad8e2567160 --- /dev/null +++ b/queue-4.10/drm-i915-fix-not-finding-the-vbt-when-it-overlaps-with-opregion_asle_ext.patch @@ -0,0 +1,49 @@ +From 998d75730b40afc218c059d811869abe9676b305 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 14 Feb 2017 18:12:38 +0200 +Subject: drm/i915: Fix not finding the VBT when it overlaps with OPREGION_ASLE_EXT + +From: Hans de Goede + +commit 998d75730b40afc218c059d811869abe9676b305 upstream. + +If there is no OPREGION_ASLE_EXT then a VBT stored in mailbox #4 may +use the ASLE_EXT parts of the opregion. Adjust the vbt_size calculation +for a vbt in mailbox #4 for this. + +This fixes the driver not finding the VBT on a jumper ezpad mini3 +cherrytrail tablet and on a ACER SW5_017 machine. + +Signed-off-by: Hans de Goede +Signed-off-by: Jani Nikula +Link: http://patchwork.freedesktop.org/patch/msgid/1487088758-30050-1-git-send-email-jani.nikula@intel.com +(cherry picked from commit dfb65e71ea2c1d97ac373cc0587dc60b3307581a) +Signed-off-by: Jani Nikula +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_opregion.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/i915/intel_opregion.c ++++ b/drivers/gpu/drm/i915/intel_opregion.c +@@ -982,7 +982,18 @@ int intel_opregion_setup(struct drm_i915 + opregion->vbt_size = vbt_size; + } else { + vbt = base + OPREGION_VBT_OFFSET; +- vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET; ++ /* ++ * The VBT specification says that if the ASLE ext ++ * mailbox is not used its area is reserved, but ++ * on some CHT boards the VBT extends into the ++ * ASLE ext area. Allow this even though it is ++ * against the spec, so we do not end up rejecting ++ * the VBT on those boards (and end up not finding the ++ * LCD panel because of this). ++ */ ++ vbt_size = (mboxes & MBOX_ASLE_EXT) ? ++ OPREGION_ASLE_EXT_OFFSET : OPREGION_SIZE; ++ vbt_size -= OPREGION_VBT_OFFSET; + if (intel_bios_is_valid_vbt(vbt, vbt_size)) { + DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (Mailbox #4)\n"); + opregion->vbt = vbt; diff --git a/queue-4.10/drm-i915-pass-timeout-0-on-to-i915_gem_object_wait_fence.patch b/queue-4.10/drm-i915-pass-timeout-0-on-to-i915_gem_object_wait_fence.patch new file mode 100644 index 00000000000..a9eafa055de --- /dev/null +++ b/queue-4.10/drm-i915-pass-timeout-0-on-to-i915_gem_object_wait_fence.patch @@ -0,0 +1,49 @@ +From 636deb5b2277cf57bb0f5e00fc9687de9a96061e Mon Sep 17 00:00:00 2001 +From: Chris Wilson +Date: Sun, 12 Feb 2017 21:53:43 +0000 +Subject: drm/i915: Pass timeout==0 on to i915_gem_object_wait_fence() + +From: Chris Wilson + +commit 636deb5b2277cf57bb0f5e00fc9687de9a96061e upstream. + +The i915_gem_object_wait_fence() uses an incoming timeout=0 to query +whether the current fence is busy or idle, without waiting. This can be +used by the wait-ioctl to implement a busy query. + +Fixes: e95433c73a11 ("drm/i915: Rearrange i915_wait_request() accounting with callers") +Testcase: igt/gem_wait/basic-busy-write-all +Signed-off-by: Chris Wilson +Cc: Matthew Auld +Cc: Joonas Lahtinen +Cc: # v4.10-rc1+ +Link: http://patchwork.freedesktop.org/patch/msgid/20170212215344.16600-1-chris@chris-wilson.co.uk +Reviewed-by: Joonas Lahtinen +(cherry picked from commit d892e9398ecf6defc7972a62227b77dad6be20bd) +Signed-off-by: Jani Nikula +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/i915_gem.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/gpu/drm/i915/i915_gem.c ++++ b/drivers/gpu/drm/i915/i915_gem.c +@@ -440,7 +440,7 @@ i915_gem_object_wait_reservation(struct + timeout = i915_gem_object_wait_fence(shared[i], + flags, timeout, + rps); +- if (timeout <= 0) ++ if (timeout < 0) + break; + + dma_fence_put(shared[i]); +@@ -453,7 +453,7 @@ i915_gem_object_wait_reservation(struct + excl = reservation_object_get_excl_rcu(resv); + } + +- if (excl && timeout > 0) ++ if (excl && timeout >= 0) + timeout = i915_gem_object_wait_fence(excl, flags, timeout, rps); + + dma_fence_put(excl); diff --git a/queue-4.10/drm-i915-recreate-internal-objects-with-single-page-segments-if-dmar-fails.patch b/queue-4.10/drm-i915-recreate-internal-objects-with-single-page-segments-if-dmar-fails.patch new file mode 100644 index 00000000000..ab573fc4140 --- /dev/null +++ b/queue-4.10/drm-i915-recreate-internal-objects-with-single-page-segments-if-dmar-fails.patch @@ -0,0 +1,98 @@ +From 2d2cfc12b1270c8451edc7d2dd5f79097b3a17d8 Mon Sep 17 00:00:00 2001 +From: Chris Wilson +Date: Thu, 2 Feb 2017 13:27:21 +0000 +Subject: drm/i915: Recreate internal objects with single page segments if dmar fails + +From: Chris Wilson + +commit 2d2cfc12b1270c8451edc7d2dd5f79097b3a17d8 upstream. + +If we fail to dma-map the object, the most common cause is lack of space +inside the SW-IOTLB due to fragmentation. If we recreate the_sg_table +using segments of PAGE_SIZE (and single page allocations), we may succeed +in remapping the scatterlist. + +First became a significant problem for the mock selftests after commit +5584f1b1d73e ("drm/i915: fix i915 running as dom0 under Xen") increased +the max_order. + +Fixes: 920cf4194954 ("drm/i915: Introduce an internal allocator for disposable private objects") +Fixes: 5584f1b1d73e ("drm/i915: fix i915 running as dom0 under Xen") +Signed-off-by: Chris Wilson +Cc: Tvrtko Ursulin +Link: http://patchwork.freedesktop.org/patch/msgid/20170202132721.12711-1-chris@chris-wilson.co.uk +Reviewed-by: Tvrtko Ursulin +(cherry picked from commit bb96dcf5830e5d81a1da2e2a14e6c0f7dfc64348) +Signed-off-by: Jani Nikula +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/i915_gem_internal.c | 37 +++++++++++++++++++------------ + 1 file changed, 23 insertions(+), 14 deletions(-) + +--- a/drivers/gpu/drm/i915/i915_gem_internal.c ++++ b/drivers/gpu/drm/i915/i915_gem_internal.c +@@ -46,24 +46,12 @@ static struct sg_table * + i915_gem_object_get_pages_internal(struct drm_i915_gem_object *obj) + { + struct drm_i915_private *i915 = to_i915(obj->base.dev); +- unsigned int npages = obj->base.size / PAGE_SIZE; + struct sg_table *st; + struct scatterlist *sg; ++ unsigned int npages; + int max_order; + gfp_t gfp; + +- st = kmalloc(sizeof(*st), GFP_KERNEL); +- if (!st) +- return ERR_PTR(-ENOMEM); +- +- if (sg_alloc_table(st, npages, GFP_KERNEL)) { +- kfree(st); +- return ERR_PTR(-ENOMEM); +- } +- +- sg = st->sgl; +- st->nents = 0; +- + max_order = MAX_ORDER; + #ifdef CONFIG_SWIOTLB + if (swiotlb_nr_tbl()) { +@@ -85,6 +73,20 @@ i915_gem_object_get_pages_internal(struc + gfp |= __GFP_DMA32; + } + ++create_st: ++ st = kmalloc(sizeof(*st), GFP_KERNEL); ++ if (!st) ++ return ERR_PTR(-ENOMEM); ++ ++ npages = obj->base.size / PAGE_SIZE; ++ if (sg_alloc_table(st, npages, GFP_KERNEL)) { ++ kfree(st); ++ return ERR_PTR(-ENOMEM); ++ } ++ ++ sg = st->sgl; ++ st->nents = 0; ++ + do { + int order = min(fls(npages) - 1, max_order); + struct page *page; +@@ -112,8 +114,15 @@ i915_gem_object_get_pages_internal(struc + sg = __sg_next(sg); + } while (1); + +- if (i915_gem_gtt_prepare_pages(obj, st)) ++ if (i915_gem_gtt_prepare_pages(obj, st)) { ++ /* Failed to dma-map try again with single page sg segments */ ++ if (get_order(st->sgl->length)) { ++ internal_free_pages(st); ++ max_order = 0; ++ goto create_st; ++ } + goto err; ++ } + + /* Mark the pages as dontneed whilst they are still pinned. As soon + * as they are unpinned they are allowed to be reaped by the shrinker, diff --git a/queue-4.10/series b/queue-4.10/series index 4275a87955c..42ff0cbbee1 100644 --- a/queue-4.10/series +++ b/queue-4.10/series @@ -60,3 +60,8 @@ drm-atomic-fix-an-error-code-in-mode_fixup.patch drm-i915-gvt-disable-access-to-stolen-memory-as-a-guest.patch drm-cancel-drm_fb_helper_dirty_work-on-unload.patch drm-cancel-drm_fb_helper_resume_work-on-unload.patch +drm-i915-recreate-internal-objects-with-single-page-segments-if-dmar-fails.patch +drm-i915-avoid-spurious-warns-about-the-wrong-pipe-in-the-pps-code.patch +drm-i915-check-for-timeout-completion-when-waiting-for-the-rq-to-submitted.patch +drm-i915-pass-timeout-0-on-to-i915_gem_object_wait_fence.patch +drm-i915-fix-not-finding-the-vbt-when-it-overlaps-with-opregion_asle_ext.patch