aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-11-28 13:01:15 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2017-11-28 13:01:15 -0500
commit43f462f1c2e111d2882b48baeeff774ae42e7c56 (patch)
tree79132a0dbe5cf418025585ee315b5a441844d655
parent3c02a6d946657e1ae0688e0d89f2dd2cfe9afba8 (diff)
parentc209101fc1c91a318422733a3721ff6a9ff7899f (diff)
Merge tag 'drm-for-v4.15-part2-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie: - TTM regression fix for some virt gpus (bochs vga) - a few i915 stable fixes - one vc4 fix - one uapi fix * tag 'drm-for-v4.15-part2-fixes' of git://people.freedesktop.org/~airlied/linux: drm/ttm: don't attempt to use hugepages if dma32 requested (v2) drm/vblank: Pass crtc_id to page_flip_ioctl. drm/i915: Fix init_clock_gating for resume drm/i915: Mark the userptr invalidate workqueue as WQ_MEM_RECLAIM drm/i915: Clear breadcrumb node when cancelling signaling drm/i915/gvt: ensure -ve return value is handled correctly drm/i915: Re-register PMIC bus access notifier on runtime resume drm/i915: Fix false-positive assert_rpm_wakelock_held in i915_pmic_bus_access_notifier v2 drm/edid: Don't send non-zero YQ in AVI infoframe for HDMI 1.x sinks drm/vc4: Account for interrupts in flight
-rw-r--r--drivers/gpu/drm/drm_edid.c12
-rw-r--r--drivers/gpu/drm/drm_plane.c1
-rw-r--r--drivers/gpu/drm/i915/gvt/cmd_parser.c2
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c3
-rw-r--r--drivers/gpu/drm/i915/i915_gem_userptr.c6
-rw-r--r--drivers/gpu/drm/i915/intel_breadcrumbs.c1
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c3
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.c13
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.h1
-rw-r--r--drivers/gpu/drm/ttm/ttm_page_alloc.c36
-rw-r--r--drivers/gpu/drm/vc4/vc4_hdmi.c3
-rw-r--r--drivers/gpu/drm/vc4/vc4_irq.c6
-rw-r--r--include/drm/drm_edid.h3
13 files changed, 66 insertions, 24 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 2e8fb51282ef..5dfe14763871 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -4831,7 +4831,8 @@ void
4831drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame, 4831drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
4832 const struct drm_display_mode *mode, 4832 const struct drm_display_mode *mode,
4833 enum hdmi_quantization_range rgb_quant_range, 4833 enum hdmi_quantization_range rgb_quant_range,
4834 bool rgb_quant_range_selectable) 4834 bool rgb_quant_range_selectable,
4835 bool is_hdmi2_sink)
4835{ 4836{
4836 /* 4837 /*
4837 * CEA-861: 4838 * CEA-861:
@@ -4855,8 +4856,15 @@ drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
4855 * YQ-field to match the RGB Quantization Range being transmitted 4856 * YQ-field to match the RGB Quantization Range being transmitted
4856 * (e.g., when Limited Range RGB, set YQ=0 or when Full Range RGB, 4857 * (e.g., when Limited Range RGB, set YQ=0 or when Full Range RGB,
4857 * set YQ=1) and the Sink shall ignore the YQ-field." 4858 * set YQ=1) and the Sink shall ignore the YQ-field."
4859 *
4860 * Unfortunate certain sinks (eg. VIZ Model 67/E261VA) get confused
4861 * by non-zero YQ when receiving RGB. There doesn't seem to be any
4862 * good way to tell which version of CEA-861 the sink supports, so
4863 * we limit non-zero YQ to HDMI 2.0 sinks only as HDMI 2.0 is based
4864 * on on CEA-861-F.
4858 */ 4865 */
4859 if (rgb_quant_range == HDMI_QUANTIZATION_RANGE_LIMITED) 4866 if (!is_hdmi2_sink ||
4867 rgb_quant_range == HDMI_QUANTIZATION_RANGE_LIMITED)
4860 frame->ycc_quantization_range = 4868 frame->ycc_quantization_range =
4861 HDMI_YCC_QUANTIZATION_RANGE_LIMITED; 4869 HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
4862 else 4870 else
diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c
index 19404e34cd59..37a93cdffb4a 100644
--- a/drivers/gpu/drm/drm_plane.c
+++ b/drivers/gpu/drm/drm_plane.c
@@ -1030,6 +1030,7 @@ retry:
1030 e->event.base.type = DRM_EVENT_FLIP_COMPLETE; 1030 e->event.base.type = DRM_EVENT_FLIP_COMPLETE;
1031 e->event.base.length = sizeof(e->event); 1031 e->event.base.length = sizeof(e->event);
1032 e->event.vbl.user_data = page_flip->user_data; 1032 e->event.vbl.user_data = page_flip->user_data;
1033 e->event.vbl.crtc_id = crtc->base.id;
1033 ret = drm_event_reserve_init(dev, file_priv, &e->base, &e->event.base); 1034 ret = drm_event_reserve_init(dev, file_priv, &e->base, &e->event.base);
1034 if (ret) { 1035 if (ret) {
1035 kfree(e); 1036 kfree(e);
diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c
index 701a3c6f1669..85d4c57870fb 100644
--- a/drivers/gpu/drm/i915/gvt/cmd_parser.c
+++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c
@@ -1628,7 +1628,7 @@ static int perform_bb_shadow(struct parser_exec_state *s)
1628 struct intel_shadow_bb_entry *entry_obj; 1628 struct intel_shadow_bb_entry *entry_obj;
1629 struct intel_vgpu *vgpu = s->vgpu; 1629 struct intel_vgpu *vgpu = s->vgpu;
1630 unsigned long gma = 0; 1630 unsigned long gma = 0;
1631 uint32_t bb_size; 1631 int bb_size;
1632 void *dst = NULL; 1632 void *dst = NULL;
1633 int ret = 0; 1633 int ret = 0;
1634 1634
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 960d3d8b95b8..2cf10d17acfb 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1714,6 +1714,7 @@ static int i915_drm_resume(struct drm_device *dev)
1714 intel_guc_resume(dev_priv); 1714 intel_guc_resume(dev_priv);
1715 1715
1716 intel_modeset_init_hw(dev); 1716 intel_modeset_init_hw(dev);
1717 intel_init_clock_gating(dev_priv);
1717 1718
1718 spin_lock_irq(&dev_priv->irq_lock); 1719 spin_lock_irq(&dev_priv->irq_lock);
1719 if (dev_priv->display.hpd_irq_setup) 1720 if (dev_priv->display.hpd_irq_setup)
@@ -2618,6 +2619,8 @@ static int intel_runtime_resume(struct device *kdev)
2618 ret = vlv_resume_prepare(dev_priv, true); 2619 ret = vlv_resume_prepare(dev_priv, true);
2619 } 2620 }
2620 2621
2622 intel_uncore_runtime_resume(dev_priv);
2623
2621 /* 2624 /*
2622 * No point of rolling back things in case of an error, as the best 2625 * No point of rolling back things in case of an error, as the best
2623 * we can do is to hope that things will still work (and disable RPM). 2626 * we can do is to hope that things will still work (and disable RPM).
diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c
index 135fc750a837..382a77a1097e 100644
--- a/drivers/gpu/drm/i915/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/i915_gem_userptr.c
@@ -172,7 +172,9 @@ i915_mmu_notifier_create(struct mm_struct *mm)
172 spin_lock_init(&mn->lock); 172 spin_lock_init(&mn->lock);
173 mn->mn.ops = &i915_gem_userptr_notifier; 173 mn->mn.ops = &i915_gem_userptr_notifier;
174 mn->objects = RB_ROOT_CACHED; 174 mn->objects = RB_ROOT_CACHED;
175 mn->wq = alloc_workqueue("i915-userptr-release", WQ_UNBOUND, 0); 175 mn->wq = alloc_workqueue("i915-userptr-release",
176 WQ_UNBOUND | WQ_MEM_RECLAIM,
177 0);
176 if (mn->wq == NULL) { 178 if (mn->wq == NULL) {
177 kfree(mn); 179 kfree(mn);
178 return ERR_PTR(-ENOMEM); 180 return ERR_PTR(-ENOMEM);
@@ -827,7 +829,7 @@ int i915_gem_init_userptr(struct drm_i915_private *dev_priv)
827 829
828 dev_priv->mm.userptr_wq = 830 dev_priv->mm.userptr_wq =
829 alloc_workqueue("i915-userptr-acquire", 831 alloc_workqueue("i915-userptr-acquire",
830 WQ_HIGHPRI | WQ_MEM_RECLAIM, 832 WQ_HIGHPRI | WQ_UNBOUND,
831 0); 833 0);
832 if (!dev_priv->mm.userptr_wq) 834 if (!dev_priv->mm.userptr_wq)
833 return -ENOMEM; 835 return -ENOMEM;
diff --git a/drivers/gpu/drm/i915/intel_breadcrumbs.c b/drivers/gpu/drm/i915/intel_breadcrumbs.c
index 48e1ba01ccf8..5f8b9f1f40f1 100644
--- a/drivers/gpu/drm/i915/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c
@@ -517,6 +517,7 @@ static void __intel_engine_remove_wait(struct intel_engine_cs *engine,
517 517
518 GEM_BUG_ON(RB_EMPTY_NODE(&wait->node)); 518 GEM_BUG_ON(RB_EMPTY_NODE(&wait->node));
519 rb_erase(&wait->node, &b->waiters); 519 rb_erase(&wait->node, &b->waiters);
520 RB_CLEAR_NODE(&wait->node);
520 521
521out: 522out:
522 GEM_BUG_ON(b->irq_wait == wait); 523 GEM_BUG_ON(b->irq_wait == wait);
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 5132dc814788..4dea833f9d1b 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -487,7 +487,8 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
487 crtc_state->limited_color_range ? 487 crtc_state->limited_color_range ?
488 HDMI_QUANTIZATION_RANGE_LIMITED : 488 HDMI_QUANTIZATION_RANGE_LIMITED :
489 HDMI_QUANTIZATION_RANGE_FULL, 489 HDMI_QUANTIZATION_RANGE_FULL,
490 intel_hdmi->rgb_quant_range_selectable); 490 intel_hdmi->rgb_quant_range_selectable,
491 is_hdmi2_sink);
491 492
492 /* TODO: handle pixel repetition for YCBCR420 outputs */ 493 /* TODO: handle pixel repetition for YCBCR420 outputs */
493 intel_write_infoframe(encoder, crtc_state, &frame); 494 intel_write_infoframe(encoder, crtc_state, &frame);
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index 20e3c65c0999..8c2ce81f01c2 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -434,6 +434,12 @@ void intel_uncore_resume_early(struct drm_i915_private *dev_priv)
434 i915_check_and_clear_faults(dev_priv); 434 i915_check_and_clear_faults(dev_priv);
435} 435}
436 436
437void intel_uncore_runtime_resume(struct drm_i915_private *dev_priv)
438{
439 iosf_mbi_register_pmic_bus_access_notifier(
440 &dev_priv->uncore.pmic_bus_access_nb);
441}
442
437void intel_uncore_sanitize(struct drm_i915_private *dev_priv) 443void intel_uncore_sanitize(struct drm_i915_private *dev_priv)
438{ 444{
439 i915_modparams.enable_rc6 = 445 i915_modparams.enable_rc6 =
@@ -1240,8 +1246,15 @@ static int i915_pmic_bus_access_notifier(struct notifier_block *nb,
1240 * bus, which will be busy after this notification, leading to: 1246 * bus, which will be busy after this notification, leading to:
1241 * "render: timed out waiting for forcewake ack request." 1247 * "render: timed out waiting for forcewake ack request."
1242 * errors. 1248 * errors.
1249 *
1250 * The notifier is unregistered during intel_runtime_suspend(),
1251 * so it's ok to access the HW here without holding a RPM
1252 * wake reference -> disable wakeref asserts for the time of
1253 * the access.
1243 */ 1254 */
1255 disable_rpm_wakeref_asserts(dev_priv);
1244 intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); 1256 intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
1257 enable_rpm_wakeref_asserts(dev_priv);
1245 break; 1258 break;
1246 case MBI_PMIC_BUS_ACCESS_END: 1259 case MBI_PMIC_BUS_ACCESS_END:
1247 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); 1260 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
diff --git a/drivers/gpu/drm/i915/intel_uncore.h b/drivers/gpu/drm/i915/intel_uncore.h
index 582771251b57..9ce079b5dd0d 100644
--- a/drivers/gpu/drm/i915/intel_uncore.h
+++ b/drivers/gpu/drm/i915/intel_uncore.h
@@ -134,6 +134,7 @@ bool intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv
134void intel_uncore_fini(struct drm_i915_private *dev_priv); 134void intel_uncore_fini(struct drm_i915_private *dev_priv);
135void intel_uncore_suspend(struct drm_i915_private *dev_priv); 135void intel_uncore_suspend(struct drm_i915_private *dev_priv);
136void intel_uncore_resume_early(struct drm_i915_private *dev_priv); 136void intel_uncore_resume_early(struct drm_i915_private *dev_priv);
137void intel_uncore_runtime_resume(struct drm_i915_private *dev_priv);
137 138
138u64 intel_uncore_edram_size(struct drm_i915_private *dev_priv); 139u64 intel_uncore_edram_size(struct drm_i915_private *dev_priv);
139void assert_forcewakes_inactive(struct drm_i915_private *dev_priv); 140void assert_forcewakes_inactive(struct drm_i915_private *dev_priv);
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index 316f831ad5f0..b0551aa677b8 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -744,12 +744,14 @@ static void ttm_put_pages(struct page **pages, unsigned npages, int flags,
744 } 744 }
745 745
746#ifdef CONFIG_TRANSPARENT_HUGEPAGE 746#ifdef CONFIG_TRANSPARENT_HUGEPAGE
747 for (j = 0; j < HPAGE_PMD_NR; ++j) 747 if (!(flags & TTM_PAGE_FLAG_DMA32)) {
748 if (p++ != pages[i + j]) 748 for (j = 0; j < HPAGE_PMD_NR; ++j)
749 break; 749 if (p++ != pages[i + j])
750 break;
750 751
751 if (j == HPAGE_PMD_NR) 752 if (j == HPAGE_PMD_NR)
752 order = HPAGE_PMD_ORDER; 753 order = HPAGE_PMD_ORDER;
754 }
753#endif 755#endif
754 756
755 if (page_count(pages[i]) != 1) 757 if (page_count(pages[i]) != 1)
@@ -865,20 +867,22 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
865 867
866 i = 0; 868 i = 0;
867#ifdef CONFIG_TRANSPARENT_HUGEPAGE 869#ifdef CONFIG_TRANSPARENT_HUGEPAGE
868 while (npages >= HPAGE_PMD_NR) { 870 if (!(gfp_flags & GFP_DMA32)) {
869 gfp_t huge_flags = gfp_flags; 871 while (npages >= HPAGE_PMD_NR) {
872 gfp_t huge_flags = gfp_flags;
870 873
871 huge_flags |= GFP_TRANSHUGE; 874 huge_flags |= GFP_TRANSHUGE;
872 huge_flags &= ~__GFP_MOVABLE; 875 huge_flags &= ~__GFP_MOVABLE;
873 huge_flags &= ~__GFP_COMP; 876 huge_flags &= ~__GFP_COMP;
874 p = alloc_pages(huge_flags, HPAGE_PMD_ORDER); 877 p = alloc_pages(huge_flags, HPAGE_PMD_ORDER);
875 if (!p) 878 if (!p)
876 break; 879 break;
877 880
878 for (j = 0; j < HPAGE_PMD_NR; ++j) 881 for (j = 0; j < HPAGE_PMD_NR; ++j)
879 pages[i++] = p++; 882 pages[i++] = p++;
880 883
881 npages -= HPAGE_PMD_NR; 884 npages -= HPAGE_PMD_NR;
885 }
882 } 886 }
883#endif 887#endif
884 888
diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index fa37a1c07cf6..0b2088264039 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -424,7 +424,8 @@ static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder)
424 vc4_encoder->limited_rgb_range ? 424 vc4_encoder->limited_rgb_range ?
425 HDMI_QUANTIZATION_RANGE_LIMITED : 425 HDMI_QUANTIZATION_RANGE_LIMITED :
426 HDMI_QUANTIZATION_RANGE_FULL, 426 HDMI_QUANTIZATION_RANGE_FULL,
427 vc4_encoder->rgb_range_selectable); 427 vc4_encoder->rgb_range_selectable,
428 false);
428 429
429 vc4_hdmi_write_infoframe(encoder, &frame); 430 vc4_hdmi_write_infoframe(encoder, &frame);
430} 431}
diff --git a/drivers/gpu/drm/vc4/vc4_irq.c b/drivers/gpu/drm/vc4/vc4_irq.c
index 7d7af3a93d94..61b2e5377993 100644
--- a/drivers/gpu/drm/vc4/vc4_irq.c
+++ b/drivers/gpu/drm/vc4/vc4_irq.c
@@ -208,6 +208,9 @@ vc4_irq_postinstall(struct drm_device *dev)
208{ 208{
209 struct vc4_dev *vc4 = to_vc4_dev(dev); 209 struct vc4_dev *vc4 = to_vc4_dev(dev);
210 210
211 /* Undo the effects of a previous vc4_irq_uninstall. */
212 enable_irq(dev->irq);
213
211 /* Enable both the render done and out of memory interrupts. */ 214 /* Enable both the render done and out of memory interrupts. */
212 V3D_WRITE(V3D_INTENA, V3D_DRIVER_IRQS); 215 V3D_WRITE(V3D_INTENA, V3D_DRIVER_IRQS);
213 216
@@ -225,6 +228,9 @@ vc4_irq_uninstall(struct drm_device *dev)
225 /* Clear any pending interrupts we might have left. */ 228 /* Clear any pending interrupts we might have left. */
226 V3D_WRITE(V3D_INTCTL, V3D_DRIVER_IRQS); 229 V3D_WRITE(V3D_INTCTL, V3D_DRIVER_IRQS);
227 230
231 /* Finish any interrupt handler still in flight. */
232 disable_irq(dev->irq);
233
228 cancel_work_sync(&vc4->overflow_mem_work); 234 cancel_work_sync(&vc4->overflow_mem_work);
229} 235}
230 236
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
index 6f35909b8add..2ec41d032e56 100644
--- a/include/drm/drm_edid.h
+++ b/include/drm/drm_edid.h
@@ -362,7 +362,8 @@ void
362drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame, 362drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
363 const struct drm_display_mode *mode, 363 const struct drm_display_mode *mode,
364 enum hdmi_quantization_range rgb_quant_range, 364 enum hdmi_quantization_range rgb_quant_range,
365 bool rgb_quant_range_selectable); 365 bool rgb_quant_range_selectable,
366 bool is_hdmi2_sink);
366 367
367/** 368/**
368 * drm_eld_mnl - Get ELD monitor name length in bytes. 369 * drm_eld_mnl - Get ELD monitor name length in bytes.