aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2013-11-07 05:05:45 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-11-08 12:10:13 -0500
commit7167d7c677ef066c56df276dc35b044c4840151a (patch)
tree0b60984efaa0f482ef74b8f486c4491dd0adc41e /drivers/gpu
parent0fbe7870d7e97d6fa595652a8f8eaf159e4bb6c9 (diff)
drm/i915: Optimize gen8_enable|disable_vblank functions
Let's cache the IMR value like on other platforms. This is needed to implement the underrun reporting since then we'll have two places that change the same register at runtime. Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c18
1 files changed, 6 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index a06de99ed3fa..9ea0df2c7109 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -2203,17 +2203,14 @@ static int gen8_enable_vblank(struct drm_device *dev, int pipe)
2203{ 2203{
2204 struct drm_i915_private *dev_priv = dev->dev_private; 2204 struct drm_i915_private *dev_priv = dev->dev_private;
2205 unsigned long irqflags; 2205 unsigned long irqflags;
2206 uint32_t imr;
2207 2206
2208 if (!i915_pipe_enabled(dev, pipe)) 2207 if (!i915_pipe_enabled(dev, pipe))
2209 return -EINVAL; 2208 return -EINVAL;
2210 2209
2211 spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 2210 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
2212 imr = I915_READ(GEN8_DE_PIPE_IMR(pipe)); 2211 dev_priv->de_irq_mask[pipe] &= ~GEN8_PIPE_VBLANK;
2213 if ((imr & GEN8_PIPE_VBLANK) == 1) { 2212 I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]);
2214 I915_WRITE(GEN8_DE_PIPE_IMR(pipe), imr & ~GEN8_PIPE_VBLANK); 2213 POSTING_READ(GEN8_DE_PIPE_IMR(pipe));
2215 POSTING_READ(GEN8_DE_PIPE_IMR(pipe));
2216 }
2217 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 2214 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
2218 return 0; 2215 return 0;
2219} 2216}
@@ -2270,17 +2267,14 @@ static void gen8_disable_vblank(struct drm_device *dev, int pipe)
2270{ 2267{
2271 struct drm_i915_private *dev_priv = dev->dev_private; 2268 struct drm_i915_private *dev_priv = dev->dev_private;
2272 unsigned long irqflags; 2269 unsigned long irqflags;
2273 uint32_t imr;
2274 2270
2275 if (!i915_pipe_enabled(dev, pipe)) 2271 if (!i915_pipe_enabled(dev, pipe))
2276 return; 2272 return;
2277 2273
2278 spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 2274 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
2279 imr = I915_READ(GEN8_DE_PIPE_IMR(pipe)); 2275 dev_priv->de_irq_mask[pipe] |= GEN8_PIPE_VBLANK;
2280 if ((imr & GEN8_PIPE_VBLANK) == 0) { 2276 I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]);
2281 I915_WRITE(GEN8_DE_PIPE_IMR(pipe), imr | GEN8_PIPE_VBLANK); 2277 POSTING_READ(GEN8_DE_PIPE_IMR(pipe));
2282 POSTING_READ(GEN8_DE_PIPE_IMR(pipe));
2283 }
2284 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 2278 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
2285} 2279}
2286 2280