previous part 2 tag + ttm regression fix, i915,vc4,core,uapi fixes
-----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJaF5aSAAoJEAx081l5xIa+TgcP/ijY7I5K7uJXq+KwCThM2g2Z 8MW0QM8u55Mk6PdNRQafVZSP6S/tyWS3gtjW2CmB6UFazNiQzJiVdoxeuKJerwob hyciMaYiEJ1x4Z4dJUxv7dtfdDH0duqES+rPE9znCvpW/PaR+6ohobVL2tH8QVRO 884QHTvmABU8xmfzmpViiLdrjNQaZtAzNMl0mD07NlfAI3bNpE/UIVd+vm1ADDPl avZZHjyAZFgiM9anuXPGpwOcA5LSiAkUHOKZMwfj5FOhEJjAwZy0z50Jnw/Wo7OX N8ymDk7vRv/Q/stOk2m/yMuoDrEtG3os4L0cyDXFIumEVVsqE7Y5WMw5tvDULw6E WaSYr+F7t0e9OwB6w5yKRp+t97lKK1O7KZ0HA8NW0EgERHD+8/XLojr8BBAqJqxH mo3DVMfU7fmm7uOIBrjHGdkyWEni/Bqk/Vxo6rOTKVeRYWiCA4fNHvM7TN7h8DZA VlDEHB3l2k44T0ONE4vo/LgEg1Ta7B3whv0qKykYbcNK8scEBU5iV1znT+zRzJYY /cwuT+BxfTgXCKAveMi6FKvjvIohR9TLyj7BS6/QUK4mD+9V5AnERcorZoO6/8qY qiPjVDvN1BNrueyHRg162AlRXqxnvt8LFdVt2QIn8kAuXHbXOn6RMUMP49OLGlB3 g0hpJ0MOwuHUKQcnW60d =3TmE -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
43f462f1c2
|
@ -4831,7 +4831,8 @@ void
|
|||
drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
|
||||
const struct drm_display_mode *mode,
|
||||
enum hdmi_quantization_range rgb_quant_range,
|
||||
bool rgb_quant_range_selectable)
|
||||
bool rgb_quant_range_selectable,
|
||||
bool is_hdmi2_sink)
|
||||
{
|
||||
/*
|
||||
* CEA-861:
|
||||
|
@ -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
|
||||
* (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."
|
||||
*
|
||||
* 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 =
|
||||
HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
|
||||
else
|
||||
|
|
|
@ -1030,6 +1030,7 @@ retry:
|
|||
e->event.base.type = DRM_EVENT_FLIP_COMPLETE;
|
||||
e->event.base.length = sizeof(e->event);
|
||||
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);
|
||||
if (ret) {
|
||||
kfree(e);
|
||||
|
|
|
@ -1628,7 +1628,7 @@ static int perform_bb_shadow(struct parser_exec_state *s)
|
|||
struct intel_shadow_bb_entry *entry_obj;
|
||||
struct intel_vgpu *vgpu = s->vgpu;
|
||||
unsigned long gma = 0;
|
||||
uint32_t bb_size;
|
||||
int bb_size;
|
||||
void *dst = NULL;
|
||||
int ret = 0;
|
||||
|
||||
|
|
|
@ -1714,6 +1714,7 @@ static int i915_drm_resume(struct drm_device *dev)
|
|||
intel_guc_resume(dev_priv);
|
||||
|
||||
intel_modeset_init_hw(dev);
|
||||
intel_init_clock_gating(dev_priv);
|
||||
|
||||
spin_lock_irq(&dev_priv->irq_lock);
|
||||
if (dev_priv->display.hpd_irq_setup)
|
||||
|
@ -2618,6 +2619,8 @@ static int intel_runtime_resume(struct device *kdev)
|
|||
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
|
||||
* 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)
|
|||
spin_lock_init(&mn->lock);
|
||||
mn->mn.ops = &i915_gem_userptr_notifier;
|
||||
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) {
|
||||
kfree(mn);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
@ -827,7 +829,7 @@ int i915_gem_init_userptr(struct drm_i915_private *dev_priv)
|
|||
|
||||
dev_priv->mm.userptr_wq =
|
||||
alloc_workqueue("i915-userptr-acquire",
|
||||
WQ_HIGHPRI | WQ_MEM_RECLAIM,
|
||||
WQ_HIGHPRI | WQ_UNBOUND,
|
||||
0);
|
||||
if (!dev_priv->mm.userptr_wq)
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -517,6 +517,7 @@ static void __intel_engine_remove_wait(struct intel_engine_cs *engine,
|
|||
|
||||
GEM_BUG_ON(RB_EMPTY_NODE(&wait->node));
|
||||
rb_erase(&wait->node, &b->waiters);
|
||||
RB_CLEAR_NODE(&wait->node);
|
||||
|
||||
out:
|
||||
GEM_BUG_ON(b->irq_wait == wait);
|
||||
|
|
|
@ -487,7 +487,8 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
|
|||
crtc_state->limited_color_range ?
|
||||
HDMI_QUANTIZATION_RANGE_LIMITED :
|
||||
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 */
|
||||
intel_write_infoframe(encoder, crtc_state, &frame);
|
||||
|
|
|
@ -434,6 +434,12 @@ void intel_uncore_resume_early(struct drm_i915_private *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)
|
||||
{
|
||||
i915_modparams.enable_rc6 =
|
||||
|
@ -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:
|
||||
* "render: timed out waiting for forcewake ack request."
|
||||
* 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);
|
||||
enable_rpm_wakeref_asserts(dev_priv);
|
||||
break;
|
||||
case MBI_PMIC_BUS_ACCESS_END:
|
||||
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
|
|||
void intel_uncore_fini(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_runtime_resume(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);
|
||||
|
|
|
@ -744,12 +744,14 @@ static void ttm_put_pages(struct page **pages, unsigned npages, int flags,
|
|||
}
|
||||
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
for (j = 0; j < HPAGE_PMD_NR; ++j)
|
||||
if (p++ != pages[i + j])
|
||||
break;
|
||||
if (!(flags & TTM_PAGE_FLAG_DMA32)) {
|
||||
for (j = 0; j < HPAGE_PMD_NR; ++j)
|
||||
if (p++ != pages[i + j])
|
||||
break;
|
||||
|
||||
if (j == HPAGE_PMD_NR)
|
||||
order = HPAGE_PMD_ORDER;
|
||||
if (j == HPAGE_PMD_NR)
|
||||
order = HPAGE_PMD_ORDER;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (page_count(pages[i]) != 1)
|
||||
|
@ -865,20 +867,22 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
|
|||
|
||||
i = 0;
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
while (npages >= HPAGE_PMD_NR) {
|
||||
gfp_t huge_flags = gfp_flags;
|
||||
if (!(gfp_flags & GFP_DMA32)) {
|
||||
while (npages >= HPAGE_PMD_NR) {
|
||||
gfp_t huge_flags = gfp_flags;
|
||||
|
||||
huge_flags |= GFP_TRANSHUGE;
|
||||
huge_flags &= ~__GFP_MOVABLE;
|
||||
huge_flags &= ~__GFP_COMP;
|
||||
p = alloc_pages(huge_flags, HPAGE_PMD_ORDER);
|
||||
if (!p)
|
||||
break;
|
||||
huge_flags |= GFP_TRANSHUGE;
|
||||
huge_flags &= ~__GFP_MOVABLE;
|
||||
huge_flags &= ~__GFP_COMP;
|
||||
p = alloc_pages(huge_flags, HPAGE_PMD_ORDER);
|
||||
if (!p)
|
||||
break;
|
||||
|
||||
for (j = 0; j < HPAGE_PMD_NR; ++j)
|
||||
pages[i++] = p++;
|
||||
for (j = 0; j < HPAGE_PMD_NR; ++j)
|
||||
pages[i++] = p++;
|
||||
|
||||
npages -= HPAGE_PMD_NR;
|
||||
npages -= HPAGE_PMD_NR;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -424,7 +424,8 @@ static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder)
|
|||
vc4_encoder->limited_rgb_range ?
|
||||
HDMI_QUANTIZATION_RANGE_LIMITED :
|
||||
HDMI_QUANTIZATION_RANGE_FULL,
|
||||
vc4_encoder->rgb_range_selectable);
|
||||
vc4_encoder->rgb_range_selectable,
|
||||
false);
|
||||
|
||||
vc4_hdmi_write_infoframe(encoder, &frame);
|
||||
}
|
||||
|
|
|
@ -208,6 +208,9 @@ vc4_irq_postinstall(struct drm_device *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. */
|
||||
V3D_WRITE(V3D_INTENA, V3D_DRIVER_IRQS);
|
||||
|
||||
|
@ -225,6 +228,9 @@ vc4_irq_uninstall(struct drm_device *dev)
|
|||
/* Clear any pending interrupts we might have left. */
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -362,7 +362,8 @@ void
|
|||
drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
|
||||
const struct drm_display_mode *mode,
|
||||
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.
|
||||
|
|
Loading…
Reference in New Issue