Skip to content

Commit a168f5b

Browse files
committed
drm/i915: Don't mark PCH underrun reporting as disabled for transcoder B/C on LPT-H
Marking PCH transcoder FIFO underrun reporting as disabled for transcoder B/C on LPT-H will block us from enabling the south error interrupt. So let's only mark transcoder A underrun reporting as disabled initially. This is a little tricky to hit since you need a machine with LPT-H, and the BIOS must enable either pipe B or C at boot. Then i915 would mark the "transcoder B/C" underrun reporting as disabled and never enable it again, meaning south interrupts would never get enabled either. The only other interrupt in there is actually the poison interrupt which, if we could ever trigger it, would just result in a little error in dmesg. Here's the resulting change in SDEIMR on my HSW when I boot it with multiple displays attached: - (0x000c4004): 0xf115ffff + (0x000c4004): 0xf114ffff My previous attempt [1] tried to fix this a little differently, but Daniel requested I do this instead. [1] https://lists.freedesktop.org/archives/intel-gfx/2015-November/081420.html Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1470416417-15021-1-git-send-email-ville.syrjala@linux.intel.com Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
1 parent 09fa8bb commit a168f5b

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

drivers/gpu/drm/i915/intel_display.c

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15771,6 +15771,13 @@ static bool intel_encoder_has_connectors(struct intel_encoder *encoder)
1577115771
return false;
1577215772
}
1577315773

15774+
static bool has_pch_trancoder(struct drm_i915_private *dev_priv,
15775+
enum transcoder pch_transcoder)
15776+
{
15777+
return HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv) ||
15778+
(HAS_PCH_LPT_H(dev_priv) && pch_transcoder == TRANSCODER_A);
15779+
}
15780+
1577415781
static void intel_sanitize_crtc(struct intel_crtc *crtc)
1577515782
{
1577615783
struct drm_device *dev = crtc->base.dev;
@@ -15849,7 +15856,17 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
1584915856
* worst a fifo underrun happens which also sets this to false.
1585015857
*/
1585115858
crtc->cpu_fifo_underrun_disabled = true;
15852-
crtc->pch_fifo_underrun_disabled = true;
15859+
/*
15860+
* We track the PCH trancoder underrun reporting state
15861+
* within the crtc. With crtc for pipe A housing the underrun
15862+
* reporting state for PCH transcoder A, crtc for pipe B housing
15863+
* it for PCH transcoder B, etc. LPT-H has only PCH transcoder A,
15864+
* and marking underrun reporting as disabled for the non-existing
15865+
* PCH transcoders B and C would prevent enabling the south
15866+
* error interrupt (see cpt_can_enable_serr_int()).
15867+
*/
15868+
if (has_pch_trancoder(dev_priv, (enum transcoder)crtc->pipe))
15869+
crtc->pch_fifo_underrun_disabled = true;
1585315870
}
1585415871
}
1585515872

0 commit comments

Comments
 (0)