Commit 43f462f1 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 3c02a6d9 c209101f
...@@ -4831,7 +4831,8 @@ void ...@@ -4831,7 +4831,8 @@ void
drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame, drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
const struct drm_display_mode *mode, const struct drm_display_mode *mode,
enum hdmi_quantization_range rgb_quant_range, enum hdmi_quantization_range rgb_quant_range,
bool rgb_quant_range_selectable) bool rgb_quant_range_selectable,
bool is_hdmi2_sink)
{ {
/* /*
* CEA-861: * CEA-861:
...@@ -4855,8 +4856,15 @@ drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame, ...@@ -4855,8 +4856,15 @@ drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
* YQ-field to match the RGB Quantization Range being transmitted * YQ-field to match the RGB Quantization Range being transmitted
* (e.g., when Limited Range RGB, set YQ=0 or when Full Range RGB, * (e.g., when Limited Range RGB, set YQ=0 or when Full Range RGB,
* set YQ=1) and the Sink shall ignore the YQ-field." * set YQ=1) and the Sink shall ignore the YQ-field."
*
* Unfortunate certain sinks (eg. VIZ Model 67/E261VA) get confused
* by non-zero YQ when receiving RGB. There doesn't seem to be any
* good way to tell which version of CEA-861 the sink supports, so
* we limit non-zero YQ to HDMI 2.0 sinks only as HDMI 2.0 is based
* on on CEA-861-F.
*/ */
if (rgb_quant_range == HDMI_QUANTIZATION_RANGE_LIMITED) if (!is_hdmi2_sink ||
rgb_quant_range == HDMI_QUANTIZATION_RANGE_LIMITED)
frame->ycc_quantization_range = frame->ycc_quantization_range =
HDMI_YCC_QUANTIZATION_RANGE_LIMITED; HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
else else
......
...@@ -1030,6 +1030,7 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev, ...@@ -1030,6 +1030,7 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,
e->event.base.type = DRM_EVENT_FLIP_COMPLETE; e->event.base.type = DRM_EVENT_FLIP_COMPLETE;
e->event.base.length = sizeof(e->event); e->event.base.length = sizeof(e->event);
e->event.vbl.user_data = page_flip->user_data; e->event.vbl.user_data = page_flip->user_data;
e->event.vbl.crtc_id = crtc->base.id;
ret = drm_event_reserve_init(dev, file_priv, &e->base, &e->event.base); ret = drm_event_reserve_init(dev, file_priv, &e->base, &e->event.base);
if (ret) { if (ret) {
kfree(e); kfree(e);
......
...@@ -1628,7 +1628,7 @@ static int perform_bb_shadow(struct parser_exec_state *s) ...@@ -1628,7 +1628,7 @@ static int perform_bb_shadow(struct parser_exec_state *s)
struct intel_shadow_bb_entry *entry_obj; struct intel_shadow_bb_entry *entry_obj;
struct intel_vgpu *vgpu = s->vgpu; struct intel_vgpu *vgpu = s->vgpu;
unsigned long gma = 0; unsigned long gma = 0;
uint32_t bb_size; int bb_size;
void *dst = NULL; void *dst = NULL;
int ret = 0; int ret = 0;
......
...@@ -1714,6 +1714,7 @@ static int i915_drm_resume(struct drm_device *dev) ...@@ -1714,6 +1714,7 @@ static int i915_drm_resume(struct drm_device *dev)
intel_guc_resume(dev_priv); intel_guc_resume(dev_priv);
intel_modeset_init_hw(dev); intel_modeset_init_hw(dev);
intel_init_clock_gating(dev_priv);
spin_lock_irq(&dev_priv->irq_lock); spin_lock_irq(&dev_priv->irq_lock);
if (dev_priv->display.hpd_irq_setup) if (dev_priv->display.hpd_irq_setup)
...@@ -2618,6 +2619,8 @@ static int intel_runtime_resume(struct device *kdev) ...@@ -2618,6 +2619,8 @@ static int intel_runtime_resume(struct device *kdev)
ret = vlv_resume_prepare(dev_priv, true); ret = vlv_resume_prepare(dev_priv, true);
} }
intel_uncore_runtime_resume(dev_priv);
/* /*
* No point of rolling back things in case of an error, as the best * No point of rolling back things in case of an error, as the best
* we can do is to hope that things will still work (and disable RPM). * we can do is to hope that things will still work (and disable RPM).
......
...@@ -172,7 +172,9 @@ i915_mmu_notifier_create(struct mm_struct *mm) ...@@ -172,7 +172,9 @@ i915_mmu_notifier_create(struct mm_struct *mm)
spin_lock_init(&mn->lock); spin_lock_init(&mn->lock);
mn->mn.ops = &i915_gem_userptr_notifier; mn->mn.ops = &i915_gem_userptr_notifier;
mn->objects = RB_ROOT_CACHED; mn->objects = RB_ROOT_CACHED;
mn->wq = alloc_workqueue("i915-userptr-release", WQ_UNBOUND, 0); mn->wq = alloc_workqueue("i915-userptr-release",
WQ_UNBOUND | WQ_MEM_RECLAIM,
0);
if (mn->wq == NULL) { if (mn->wq == NULL) {
kfree(mn); kfree(mn);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -827,7 +829,7 @@ int i915_gem_init_userptr(struct drm_i915_private *dev_priv) ...@@ -827,7 +829,7 @@ int i915_gem_init_userptr(struct drm_i915_private *dev_priv)
dev_priv->mm.userptr_wq = dev_priv->mm.userptr_wq =
alloc_workqueue("i915-userptr-acquire", alloc_workqueue("i915-userptr-acquire",
WQ_HIGHPRI | WQ_MEM_RECLAIM, WQ_HIGHPRI | WQ_UNBOUND,
0); 0);
if (!dev_priv->mm.userptr_wq) if (!dev_priv->mm.userptr_wq)
return -ENOMEM; return -ENOMEM;
......
...@@ -517,6 +517,7 @@ static void __intel_engine_remove_wait(struct intel_engine_cs *engine, ...@@ -517,6 +517,7 @@ static void __intel_engine_remove_wait(struct intel_engine_cs *engine,
GEM_BUG_ON(RB_EMPTY_NODE(&wait->node)); GEM_BUG_ON(RB_EMPTY_NODE(&wait->node));
rb_erase(&wait->node, &b->waiters); rb_erase(&wait->node, &b->waiters);
RB_CLEAR_NODE(&wait->node);
out: out:
GEM_BUG_ON(b->irq_wait == wait); GEM_BUG_ON(b->irq_wait == wait);
......
...@@ -487,7 +487,8 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder, ...@@ -487,7 +487,8 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
crtc_state->limited_color_range ? crtc_state->limited_color_range ?
HDMI_QUANTIZATION_RANGE_LIMITED : HDMI_QUANTIZATION_RANGE_LIMITED :
HDMI_QUANTIZATION_RANGE_FULL, HDMI_QUANTIZATION_RANGE_FULL,
intel_hdmi->rgb_quant_range_selectable); intel_hdmi->rgb_quant_range_selectable,
is_hdmi2_sink);
/* TODO: handle pixel repetition for YCBCR420 outputs */ /* TODO: handle pixel repetition for YCBCR420 outputs */
intel_write_infoframe(encoder, crtc_state, &frame); intel_write_infoframe(encoder, crtc_state, &frame);
......
...@@ -434,6 +434,12 @@ void intel_uncore_resume_early(struct drm_i915_private *dev_priv) ...@@ -434,6 +434,12 @@ void intel_uncore_resume_early(struct drm_i915_private *dev_priv)
i915_check_and_clear_faults(dev_priv); i915_check_and_clear_faults(dev_priv);
} }
void intel_uncore_runtime_resume(struct drm_i915_private *dev_priv)
{
iosf_mbi_register_pmic_bus_access_notifier(
&dev_priv->uncore.pmic_bus_access_nb);
}
void intel_uncore_sanitize(struct drm_i915_private *dev_priv) void intel_uncore_sanitize(struct drm_i915_private *dev_priv)
{ {
i915_modparams.enable_rc6 = i915_modparams.enable_rc6 =
...@@ -1240,8 +1246,15 @@ static int i915_pmic_bus_access_notifier(struct notifier_block *nb, ...@@ -1240,8 +1246,15 @@ static int i915_pmic_bus_access_notifier(struct notifier_block *nb,
* bus, which will be busy after this notification, leading to: * bus, which will be busy after this notification, leading to:
* "render: timed out waiting for forcewake ack request." * "render: timed out waiting for forcewake ack request."
* errors. * errors.
*
* The notifier is unregistered during intel_runtime_suspend(),
* so it's ok to access the HW here without holding a RPM
* wake reference -> disable wakeref asserts for the time of
* the access.
*/ */
disable_rpm_wakeref_asserts(dev_priv);
intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
enable_rpm_wakeref_asserts(dev_priv);
break; break;
case MBI_PMIC_BUS_ACCESS_END: case MBI_PMIC_BUS_ACCESS_END:
intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
......
...@@ -134,6 +134,7 @@ bool intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv ...@@ -134,6 +134,7 @@ bool intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv
void intel_uncore_fini(struct drm_i915_private *dev_priv); void intel_uncore_fini(struct drm_i915_private *dev_priv);
void intel_uncore_suspend(struct drm_i915_private *dev_priv); void intel_uncore_suspend(struct drm_i915_private *dev_priv);
void intel_uncore_resume_early(struct drm_i915_private *dev_priv); void intel_uncore_resume_early(struct drm_i915_private *dev_priv);
void intel_uncore_runtime_resume(struct drm_i915_private *dev_priv);
u64 intel_uncore_edram_size(struct drm_i915_private *dev_priv); u64 intel_uncore_edram_size(struct drm_i915_private *dev_priv);
void assert_forcewakes_inactive(struct drm_i915_private *dev_priv); void assert_forcewakes_inactive(struct drm_i915_private *dev_priv);
......
...@@ -744,12 +744,14 @@ static void ttm_put_pages(struct page **pages, unsigned npages, int flags, ...@@ -744,12 +744,14 @@ static void ttm_put_pages(struct page **pages, unsigned npages, int flags,
} }
#ifdef CONFIG_TRANSPARENT_HUGEPAGE #ifdef CONFIG_TRANSPARENT_HUGEPAGE
if (!(flags & TTM_PAGE_FLAG_DMA32)) {
for (j = 0; j < HPAGE_PMD_NR; ++j) for (j = 0; j < HPAGE_PMD_NR; ++j)
if (p++ != pages[i + j]) if (p++ != pages[i + j])
break; break;
if (j == HPAGE_PMD_NR) if (j == HPAGE_PMD_NR)
order = HPAGE_PMD_ORDER; order = HPAGE_PMD_ORDER;
}
#endif #endif
if (page_count(pages[i]) != 1) if (page_count(pages[i]) != 1)
...@@ -865,6 +867,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, ...@@ -865,6 +867,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
i = 0; i = 0;
#ifdef CONFIG_TRANSPARENT_HUGEPAGE #ifdef CONFIG_TRANSPARENT_HUGEPAGE
if (!(gfp_flags & GFP_DMA32)) {
while (npages >= HPAGE_PMD_NR) { while (npages >= HPAGE_PMD_NR) {
gfp_t huge_flags = gfp_flags; gfp_t huge_flags = gfp_flags;
...@@ -880,6 +883,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, ...@@ -880,6 +883,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
npages -= HPAGE_PMD_NR; npages -= HPAGE_PMD_NR;
} }
}
#endif #endif
while (npages) { while (npages) {
......
...@@ -424,7 +424,8 @@ static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder) ...@@ -424,7 +424,8 @@ static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder)
vc4_encoder->limited_rgb_range ? vc4_encoder->limited_rgb_range ?
HDMI_QUANTIZATION_RANGE_LIMITED : HDMI_QUANTIZATION_RANGE_LIMITED :
HDMI_QUANTIZATION_RANGE_FULL, HDMI_QUANTIZATION_RANGE_FULL,
vc4_encoder->rgb_range_selectable); vc4_encoder->rgb_range_selectable,
false);
vc4_hdmi_write_infoframe(encoder, &frame); vc4_hdmi_write_infoframe(encoder, &frame);
} }
......
...@@ -208,6 +208,9 @@ vc4_irq_postinstall(struct drm_device *dev) ...@@ -208,6 +208,9 @@ vc4_irq_postinstall(struct drm_device *dev)
{ {
struct vc4_dev *vc4 = to_vc4_dev(dev); struct vc4_dev *vc4 = to_vc4_dev(dev);
/* Undo the effects of a previous vc4_irq_uninstall. */
enable_irq(dev->irq);
/* Enable both the render done and out of memory interrupts. */ /* Enable both the render done and out of memory interrupts. */
V3D_WRITE(V3D_INTENA, V3D_DRIVER_IRQS); V3D_WRITE(V3D_INTENA, V3D_DRIVER_IRQS);
...@@ -225,6 +228,9 @@ vc4_irq_uninstall(struct drm_device *dev) ...@@ -225,6 +228,9 @@ vc4_irq_uninstall(struct drm_device *dev)
/* Clear any pending interrupts we might have left. */ /* Clear any pending interrupts we might have left. */
V3D_WRITE(V3D_INTCTL, V3D_DRIVER_IRQS); V3D_WRITE(V3D_INTCTL, V3D_DRIVER_IRQS);
/* Finish any interrupt handler still in flight. */
disable_irq(dev->irq);
cancel_work_sync(&vc4->overflow_mem_work); cancel_work_sync(&vc4->overflow_mem_work);
} }
......
...@@ -362,7 +362,8 @@ void ...@@ -362,7 +362,8 @@ void
drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame, drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
const struct drm_display_mode *mode, const struct drm_display_mode *mode,
enum hdmi_quantization_range rgb_quant_range, enum hdmi_quantization_range rgb_quant_range,
bool rgb_quant_range_selectable); bool rgb_quant_range_selectable,
bool is_hdmi2_sink);
/** /**
* drm_eld_mnl - Get ELD monitor name length in bytes. * drm_eld_mnl - Get ELD monitor name length in bytes.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment