aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_irq.c
diff options
context:
space:
mode:
authorDhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>2018-04-04 21:37:17 -0400
committerRodrigo Vivi <rodrigo.vivi@intel.com>2018-04-20 17:28:16 -0400
commit54fd3149598cc2f74cf0708d614470da2331a374 (patch)
tree62130a352a1b15a3affa2ee5e62a962478d0b6b6 /drivers/gpu/drm/i915/i915_irq.c
parente04f7ece1c4530b4f0db182b5596fadf48628f22 (diff)
drm/i915/psr: Control PSR interrupts via debugfs
Interrupts other than the one for AUX errors are required only for debug, so unmask them via debugfs when the user requests debug. User can make such a request with echo 1 > <DEBUG_FS>/dri/0/i915_edp_psr_debug There are no locks to serialize PSR debug enabling from irq_postinstall() and debugfs for simplicity. As irq_postinstall() is called only during module initialization/resume and IGT subtests aren't expected to modify PSR debug at those times, we should be safe. v2: Unroll loops (Ville) Avoid resetting error mask bits. v3: Unmask interrupts in postinstall() if debug was still enabled. Avoid RMW (Ville) v4: Avoid extra IMR write introduced in the previous version.(Jose) Style changes, renames (Jose). Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com> Reviewed-by: Jose Roberto de Souza <jose.souza@intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180405013717.24254-1-dhinakaran.pandiyan@intel.com
Diffstat (limited to 'drivers/gpu/drm/i915/i915_irq.c')
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c51
1 files changed, 12 insertions, 39 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index ab9aac88a00b..96547e091e23 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -2452,40 +2452,6 @@ static void ilk_display_irq_handler(struct drm_i915_private *dev_priv,
2452 ironlake_rps_change_irq_handler(dev_priv); 2452 ironlake_rps_change_irq_handler(dev_priv);
2453} 2453}
2454 2454
2455static void hsw_edp_psr_irq_handler(struct drm_i915_private *dev_priv)
2456{
2457 u32 edp_psr_iir = I915_READ(EDP_PSR_IIR);
2458 u32 edp_psr_imr = I915_READ(EDP_PSR_IMR);
2459 u32 mask = BIT(TRANSCODER_EDP);
2460 enum transcoder cpu_transcoder;
2461
2462 if (INTEL_GEN(dev_priv) >= 8)
2463 mask |= BIT(TRANSCODER_A) |
2464 BIT(TRANSCODER_B) |
2465 BIT(TRANSCODER_C);
2466
2467 for_each_cpu_transcoder_masked(dev_priv, cpu_transcoder, mask) {
2468 if (edp_psr_iir & EDP_PSR_ERROR(cpu_transcoder))
2469 DRM_DEBUG_KMS("Transcoder %s PSR error\n",
2470 transcoder_name(cpu_transcoder));
2471
2472 if (edp_psr_iir & EDP_PSR_PRE_ENTRY(cpu_transcoder)) {
2473 DRM_DEBUG_KMS("Transcoder %s PSR prepare entry in 2 vblanks\n",
2474 transcoder_name(cpu_transcoder));
2475 edp_psr_imr |= EDP_PSR_PRE_ENTRY(cpu_transcoder);
2476 }
2477
2478 if (edp_psr_iir & EDP_PSR_POST_EXIT(cpu_transcoder)) {
2479 DRM_DEBUG_KMS("Transcoder %s PSR exit completed\n",
2480 transcoder_name(cpu_transcoder));
2481 edp_psr_imr &= ~EDP_PSR_PRE_ENTRY(cpu_transcoder);
2482 }
2483 }
2484
2485 I915_WRITE(EDP_PSR_IMR, edp_psr_imr);
2486 I915_WRITE(EDP_PSR_IIR, edp_psr_iir);
2487}
2488
2489static void ivb_display_irq_handler(struct drm_i915_private *dev_priv, 2455static void ivb_display_irq_handler(struct drm_i915_private *dev_priv,
2490 u32 de_iir) 2456 u32 de_iir)
2491{ 2457{
@@ -2498,8 +2464,12 @@ static void ivb_display_irq_handler(struct drm_i915_private *dev_priv,
2498 if (de_iir & DE_ERR_INT_IVB) 2464 if (de_iir & DE_ERR_INT_IVB)
2499 ivb_err_int_handler(dev_priv); 2465 ivb_err_int_handler(dev_priv);
2500 2466
2501 if (de_iir & DE_EDP_PSR_INT_HSW) 2467 if (de_iir & DE_EDP_PSR_INT_HSW) {
2502 hsw_edp_psr_irq_handler(dev_priv); 2468 u32 psr_iir = I915_READ(EDP_PSR_IIR);
2469
2470 intel_psr_irq_handler(dev_priv, psr_iir);
2471 I915_WRITE(EDP_PSR_IIR, psr_iir);
2472 }
2503 2473
2504 if (de_iir & DE_AUX_CHANNEL_A_IVB) 2474 if (de_iir & DE_AUX_CHANNEL_A_IVB)
2505 dp_aux_irq_handler(dev_priv); 2475 dp_aux_irq_handler(dev_priv);
@@ -2641,7 +2611,10 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
2641 } 2611 }
2642 2612
2643 if (iir & GEN8_DE_EDP_PSR) { 2613 if (iir & GEN8_DE_EDP_PSR) {
2644 hsw_edp_psr_irq_handler(dev_priv); 2614 u32 psr_iir = I915_READ(EDP_PSR_IIR);
2615
2616 intel_psr_irq_handler(dev_priv, psr_iir);
2617 I915_WRITE(EDP_PSR_IIR, psr_iir);
2645 found = true; 2618 found = true;
2646 } 2619 }
2647 2620
@@ -3820,7 +3793,7 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
3820 3793
3821 if (IS_HASWELL(dev_priv)) { 3794 if (IS_HASWELL(dev_priv)) {
3822 gen3_assert_iir_is_zero(dev_priv, EDP_PSR_IIR); 3795 gen3_assert_iir_is_zero(dev_priv, EDP_PSR_IIR);
3823 I915_WRITE(EDP_PSR_IMR, 0); 3796 intel_psr_irq_control(dev_priv, dev_priv->psr.debug);
3824 display_mask |= DE_EDP_PSR_INT_HSW; 3797 display_mask |= DE_EDP_PSR_INT_HSW;
3825 } 3798 }
3826 3799
@@ -3960,7 +3933,7 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
3960 de_port_enables |= GEN8_PORT_DP_A_HOTPLUG; 3933 de_port_enables |= GEN8_PORT_DP_A_HOTPLUG;
3961 3934
3962 gen3_assert_iir_is_zero(dev_priv, EDP_PSR_IIR); 3935 gen3_assert_iir_is_zero(dev_priv, EDP_PSR_IIR);
3963 I915_WRITE(EDP_PSR_IMR, 0); 3936 intel_psr_irq_control(dev_priv, dev_priv->psr.debug);
3964 3937
3965 for_each_pipe(dev_priv, pipe) { 3938 for_each_pipe(dev_priv, pipe) {
3966 dev_priv->de_irq_mask[pipe] = ~de_pipe_masked; 3939 dev_priv->de_irq_mask[pipe] = ~de_pipe_masked;