| From 6f409609ee19f1cb08c9a6212a6287a59f526657 Mon Sep 17 00:00:00 2001 |
| From: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Date: Thu, 4 Jul 2013 23:35:24 +0200 |
| Subject: drm/i915: kill lpt pch transcoder->crtc mapping code for fifo |
| underruns |
| |
| It's racy: There's no guarantee that we won't walk this code (due to a |
| pch fifo underrun interrupt) while someone is changing the pointers |
| around. |
| |
| The only reason we do this is to use the righ crtc for the pch fifo |
| underrun accounting. But we never expose this to userspace, so |
| essentially no one really cares if we use the "wrong" crtc. |
| |
| So let's just rip it out. |
| |
| With this patch fifo underrun code will always use crtc A for tracking |
| underruns on the (only) pch transcoder on LPT. |
| |
| v2: Add a big comment explaining what's going on. Requested by Paulo. |
| |
| v3: Fixup spelling in comment as spotted by Paulo. |
| |
| Cc: Paulo Zanoni <przanoni@gmail.com> |
| Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit de28075d5bb3e1e9f92d19da214b6a96f544b66d) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_irq.c | 40 +++++++++++++++------------------------- |
| 1 file changed, 15 insertions(+), 25 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c |
| index c21ea44ede4e..aeb2232a9e76 100644 |
| --- a/drivers/gpu/drm/i915/i915_irq.c |
| +++ b/drivers/gpu/drm/i915/i915_irq.c |
| @@ -202,13 +202,13 @@ static void ibx_display_interrupt_update(struct drm_i915_private *dev_priv, |
| #define ibx_disable_display_interrupt(dev_priv, bits) \ |
| ibx_display_interrupt_update((dev_priv), (bits), 0) |
| |
| -static void ibx_set_fifo_underrun_reporting(struct intel_crtc *crtc, |
| +static void ibx_set_fifo_underrun_reporting(struct drm_device *dev, |
| + enum transcoder pch_transcoder, |
| bool enable) |
| { |
| - struct drm_device *dev = crtc->base.dev; |
| struct drm_i915_private *dev_priv = dev->dev_private; |
| - uint32_t bit = (crtc->pipe == PIPE_A) ? SDE_TRANSA_FIFO_UNDER : |
| - SDE_TRANSB_FIFO_UNDER; |
| + uint32_t bit = (pch_transcoder == TRANSCODER_A) ? |
| + SDE_TRANSA_FIFO_UNDER : SDE_TRANSB_FIFO_UNDER; |
| |
| if (enable) |
| ibx_enable_display_interrupt(dev_priv, bit); |
| @@ -306,29 +306,19 @@ bool intel_set_pch_fifo_underrun_reporting(struct drm_device *dev, |
| bool enable) |
| { |
| struct drm_i915_private *dev_priv = dev->dev_private; |
| - enum pipe p; |
| - struct drm_crtc *crtc; |
| - struct intel_crtc *intel_crtc; |
| + struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pch_transcoder]; |
| + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
| unsigned long flags; |
| bool ret; |
| |
| - if (HAS_PCH_LPT(dev)) { |
| - crtc = NULL; |
| - for_each_pipe(p) { |
| - struct drm_crtc *c = dev_priv->pipe_to_crtc_mapping[p]; |
| - if (intel_pipe_has_type(c, INTEL_OUTPUT_ANALOG)) { |
| - crtc = c; |
| - break; |
| - } |
| - } |
| - if (!crtc) { |
| - DRM_ERROR("PCH FIFO underrun, but no CRTC using the PCH found\n"); |
| - return false; |
| - } |
| - } else { |
| - crtc = dev_priv->pipe_to_crtc_mapping[pch_transcoder]; |
| - } |
| - intel_crtc = to_intel_crtc(crtc); |
| + /* |
| + * NOTE: Pre-LPT has a fixed cpu pipe -> pch transcoder mapping, but LPT |
| + * has only one pch transcoder A that all pipes can use. To avoid racy |
| + * pch transcoder -> pipe lookups from interrupt code simply store the |
| + * underrun statistics in crtc A. Since we never expose this anywhere |
| + * nor use it outside of the fifo underrun code here using the "wrong" |
| + * crtc on LPT won't cause issues. |
| + */ |
| |
| spin_lock_irqsave(&dev_priv->irq_lock, flags); |
| |
| @@ -340,7 +330,7 @@ bool intel_set_pch_fifo_underrun_reporting(struct drm_device *dev, |
| intel_crtc->pch_fifo_underrun_disabled = !enable; |
| |
| if (HAS_PCH_IBX(dev)) |
| - ibx_set_fifo_underrun_reporting(intel_crtc, enable); |
| + ibx_set_fifo_underrun_reporting(dev, pch_transcoder, enable); |
| else |
| cpt_set_fifo_underrun_reporting(dev, pch_transcoder, enable); |
| |
| -- |
| 1.8.5.rc3 |
| |