diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2015-10-30 13:23:22 -0400 |
---|---|---|
committer | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2015-11-10 09:23:28 -0500 |
commit | 0c241d5b2770d4a50d3367ed591d0d0236b69b51 (patch) | |
tree | 083cd90810c292e3bed7295d5a1caa4cafd6ab0b /drivers/gpu/drm/i915/intel_hdmi.c | |
parent | c465613bc97ed996f2278116c79d2c6adec3998d (diff) |
drm/i915: Disable FIFO underrun reporting around IBX transcoder B workaround
Doing the IBX transcoder B workaround causes underruns on
pipe/transcoder A. Just hide them by disabling underrun reporting for
pipe A around the workaround.
It might be possible to avoid the underruns by moving the workaround
to be applied only when enabling pipe A. But I was too lazy to try it
right now, and the current method has been proven to work, so didn't
want to change it too hastily.
Note that this can re-enable underrun reporting on pipe A if was
already disabled due to a previous actual underrun. But that's OK, we
may just get a second underrun report if another real underron occurrs
on pipe A.
v2: Note that pipe A underruns can get re-enabled due to this (Jani)
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> (v1)
Link: http://patchwork.freedesktop.org/patch/msgid/1446225802-11180-1-git-send-email-ville.syrjala@linux.intel.com
Diffstat (limited to 'drivers/gpu/drm/i915/intel_hdmi.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 013bd7d522ca..bccbe701649b 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
@@ -1108,6 +1108,13 @@ static void intel_disable_hdmi(struct intel_encoder *encoder) | |||
1108 | * matching DP port to be enabled on transcoder A. | 1108 | * matching DP port to be enabled on transcoder A. |
1109 | */ | 1109 | */ |
1110 | if (HAS_PCH_IBX(dev) && crtc->pipe == PIPE_B) { | 1110 | if (HAS_PCH_IBX(dev) && crtc->pipe == PIPE_B) { |
1111 | /* | ||
1112 | * We get CPU/PCH FIFO underruns on the other pipe when | ||
1113 | * doing the workaround. Sweep them under the rug. | ||
1114 | */ | ||
1115 | intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, false); | ||
1116 | intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, false); | ||
1117 | |||
1111 | temp &= ~SDVO_PIPE_B_SELECT; | 1118 | temp &= ~SDVO_PIPE_B_SELECT; |
1112 | temp |= SDVO_ENABLE; | 1119 | temp |= SDVO_ENABLE; |
1113 | /* | 1120 | /* |
@@ -1122,6 +1129,10 @@ static void intel_disable_hdmi(struct intel_encoder *encoder) | |||
1122 | temp &= ~SDVO_ENABLE; | 1129 | temp &= ~SDVO_ENABLE; |
1123 | I915_WRITE(intel_hdmi->hdmi_reg, temp); | 1130 | I915_WRITE(intel_hdmi->hdmi_reg, temp); |
1124 | POSTING_READ(intel_hdmi->hdmi_reg); | 1131 | POSTING_READ(intel_hdmi->hdmi_reg); |
1132 | |||
1133 | intel_wait_for_vblank_if_active(dev_priv->dev, PIPE_A); | ||
1134 | intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true); | ||
1135 | intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true); | ||
1125 | } | 1136 | } |
1126 | 1137 | ||
1127 | intel_hdmi->set_infoframes(&encoder->base, false, NULL); | 1138 | intel_hdmi->set_infoframes(&encoder->base, false, NULL); |