aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2014-09-30 04:56:46 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-10-24 10:33:53 -0400
commit47339cd9ff07376df1639260ecc088adf1856bfe (patch)
tree998ddfe277a2380209eed2e7d9a17d77f2162422
parentcacc6c837b799b058d59d2af02c11140640cc1d2 (diff)
drm/i915: Extract intel_fifo_underrun.c
Prep work for some nice documentation. Requires that we export the display irq enable/disable functions on ilk/ibx. But we already export them for vlv/i915. So not more inconsistency. v2: Rebase on top of skl stage 1. Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
-rw-r--r--drivers/gpu/drm/i915/Makefile1
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h11
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c297
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h8
-rw-r--r--drivers/gpu/drm/i915/intel_fifo_underrun.c311
5 files changed, 334 insertions, 294 deletions
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 3a6bce047f6f..75fd7de9bf4b 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -45,6 +45,7 @@ i915-y += intel_renderstate_gen6.o \
45# modesetting core code 45# modesetting core code
46i915-y += intel_bios.o \ 46i915-y += intel_bios.o \
47 intel_display.o \ 47 intel_display.o \
48 intel_fifo_underrun.o \
48 intel_frontbuffer.o \ 49 intel_frontbuffer.o \
49 intel_modes.o \ 50 intel_modes.o \
50 intel_overlay.o \ 51 intel_overlay.o \
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 9962da202456..26724c54bd80 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2312,6 +2312,17 @@ i915_disable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe,
2312 2312
2313void valleyview_enable_display_irqs(struct drm_i915_private *dev_priv); 2313void valleyview_enable_display_irqs(struct drm_i915_private *dev_priv);
2314void valleyview_disable_display_irqs(struct drm_i915_private *dev_priv); 2314void valleyview_disable_display_irqs(struct drm_i915_private *dev_priv);
2315void
2316ironlake_enable_display_irq(struct drm_i915_private *dev_priv, u32 mask);
2317void
2318ironlake_disable_display_irq(struct drm_i915_private *dev_priv, u32 mask);
2319void ibx_display_interrupt_update(struct drm_i915_private *dev_priv,
2320 uint32_t interrupt_mask,
2321 uint32_t enabled_irq_mask);
2322#define ibx_enable_display_interrupt(dev_priv, bits) \
2323 ibx_display_interrupt_update((dev_priv), (bits), (bits))
2324#define ibx_disable_display_interrupt(dev_priv, bits) \
2325 ibx_display_interrupt_update((dev_priv), (bits), 0)
2315 2326
2316/* i915_gem.c */ 2327/* i915_gem.c */
2317int i915_gem_init_ioctl(struct drm_device *dev, void *data, 2328int i915_gem_init_ioctl(struct drm_device *dev, void *data,
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index f17bbf3ac136..536efa277b01 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -139,7 +139,7 @@ static const u32 hpd_status_i915[] = { /* i915 and valleyview are the same */
139} while (0) 139} while (0)
140 140
141/* For display hotplug interrupt */ 141/* For display hotplug interrupt */
142static void 142void
143ironlake_enable_display_irq(struct drm_i915_private *dev_priv, u32 mask) 143ironlake_enable_display_irq(struct drm_i915_private *dev_priv, u32 mask)
144{ 144{
145 assert_spin_locked(&dev_priv->irq_lock); 145 assert_spin_locked(&dev_priv->irq_lock);
@@ -154,7 +154,7 @@ ironlake_enable_display_irq(struct drm_i915_private *dev_priv, u32 mask)
154 } 154 }
155} 155}
156 156
157static void 157void
158ironlake_disable_display_irq(struct drm_i915_private *dev_priv, u32 mask) 158ironlake_disable_display_irq(struct drm_i915_private *dev_priv, u32 mask)
159{ 159{
160 assert_spin_locked(&dev_priv->irq_lock); 160 assert_spin_locked(&dev_priv->irq_lock);
@@ -238,24 +238,6 @@ void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
238 snb_update_pm_irq(dev_priv, mask, 0); 238 snb_update_pm_irq(dev_priv, mask, 0);
239} 239}
240 240
241static bool ivb_can_enable_err_int(struct drm_device *dev)
242{
243 struct drm_i915_private *dev_priv = dev->dev_private;
244 struct intel_crtc *crtc;
245 enum pipe pipe;
246
247 assert_spin_locked(&dev_priv->irq_lock);
248
249 for_each_pipe(dev_priv, pipe) {
250 crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
251
252 if (crtc->cpu_fifo_underrun_disabled)
253 return false;
254 }
255
256 return true;
257}
258
259/** 241/**
260 * bdw_update_pm_irq - update GT interrupt 2 242 * bdw_update_pm_irq - update GT interrupt 2
261 * @dev_priv: driver private 243 * @dev_priv: driver private
@@ -296,130 +278,15 @@ void gen8_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
296 bdw_update_pm_irq(dev_priv, mask, 0); 278 bdw_update_pm_irq(dev_priv, mask, 0);
297} 279}
298 280
299static bool cpt_can_enable_serr_int(struct drm_device *dev)
300{
301 struct drm_i915_private *dev_priv = dev->dev_private;
302 enum pipe pipe;
303 struct intel_crtc *crtc;
304
305 assert_spin_locked(&dev_priv->irq_lock);
306
307 for_each_pipe(dev_priv, pipe) {
308 crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
309
310 if (crtc->pch_fifo_underrun_disabled)
311 return false;
312 }
313
314 return true;
315}
316
317void i9xx_check_fifo_underruns(struct drm_device *dev)
318{
319 struct drm_i915_private *dev_priv = dev->dev_private;
320 struct intel_crtc *crtc;
321
322 spin_lock_irq(&dev_priv->irq_lock);
323
324 for_each_intel_crtc(dev, crtc) {
325 u32 reg = PIPESTAT(crtc->pipe);
326 u32 pipestat;
327
328 if (crtc->cpu_fifo_underrun_disabled)
329 continue;
330
331 pipestat = I915_READ(reg) & 0xffff0000;
332 if ((pipestat & PIPE_FIFO_UNDERRUN_STATUS) == 0)
333 continue;
334
335 I915_WRITE(reg, pipestat | PIPE_FIFO_UNDERRUN_STATUS);
336 POSTING_READ(reg);
337
338 DRM_ERROR("pipe %c underrun\n", pipe_name(crtc->pipe));
339 }
340
341 spin_unlock_irq(&dev_priv->irq_lock);
342}
343
344static void i9xx_set_fifo_underrun_reporting(struct drm_device *dev,
345 enum pipe pipe,
346 bool enable, bool old)
347{
348 struct drm_i915_private *dev_priv = dev->dev_private;
349 u32 reg = PIPESTAT(pipe);
350 u32 pipestat = I915_READ(reg) & 0xffff0000;
351
352 assert_spin_locked(&dev_priv->irq_lock);
353
354 if (enable) {
355 I915_WRITE(reg, pipestat | PIPE_FIFO_UNDERRUN_STATUS);
356 POSTING_READ(reg);
357 } else {
358 if (old && pipestat & PIPE_FIFO_UNDERRUN_STATUS)
359 DRM_ERROR("pipe %c underrun\n", pipe_name(pipe));
360 }
361}
362
363static void ironlake_set_fifo_underrun_reporting(struct drm_device *dev,
364 enum pipe pipe, bool enable)
365{
366 struct drm_i915_private *dev_priv = dev->dev_private;
367 uint32_t bit = (pipe == PIPE_A) ? DE_PIPEA_FIFO_UNDERRUN :
368 DE_PIPEB_FIFO_UNDERRUN;
369
370 if (enable)
371 ironlake_enable_display_irq(dev_priv, bit);
372 else
373 ironlake_disable_display_irq(dev_priv, bit);
374}
375
376static void ivybridge_set_fifo_underrun_reporting(struct drm_device *dev,
377 enum pipe pipe,
378 bool enable, bool old)
379{
380 struct drm_i915_private *dev_priv = dev->dev_private;
381 if (enable) {
382 I915_WRITE(GEN7_ERR_INT, ERR_INT_FIFO_UNDERRUN(pipe));
383
384 if (!ivb_can_enable_err_int(dev))
385 return;
386
387 ironlake_enable_display_irq(dev_priv, DE_ERR_INT_IVB);
388 } else {
389 ironlake_disable_display_irq(dev_priv, DE_ERR_INT_IVB);
390
391 if (old &&
392 I915_READ(GEN7_ERR_INT) & ERR_INT_FIFO_UNDERRUN(pipe)) {
393 DRM_ERROR("uncleared fifo underrun on pipe %c\n",