• V
    drm/i915: Work around DISPLAY_PHY_CONTROL register corruption on CHV · 70722468
    Ville Syrjälä 提交于
    Sometimes (exactly when is a bit unclear) DISPLAY_PHY_CONTROL appears to
    get corrupted. The values I've managed to read from it seem to have some
    pattern but vary quite a lot. The corruption doesn't seem to just happen
    when the register is accessed, but can also happen spontaneosly during
    modeset. When this happens during a modeset things go south and the
    display doesn't light up.
    
    I've managed to hit the problemn when toggling HDMI on port D on and
    off. When things get corrupted the display doesn't light up, but as soon
    as I manually write the correct value to the register the display comes
    up.
    
    First I was suspicious that we ourselves accidentally overwrite it with
    garbage, but didn't catch anything with the reg_rw tracepoint. Also I
    sprinkled check all over the modeset path to see exactly when the
    corruption happens, and eg. the read back value was fine just before
    intel_dp_set_m(), and corrupted immediately after it. I also made my
    check function repair the register value whenever it was wrong, and with
    this approach the corruption repeated several times during the modeset
    operation, always seeming to trigger in the same exact calls to the
    check function, while other calls to the function never caught anything.
    
    So far I've not seen this problem occurring when carefully avoiding all
    read accesses to DISPLAY_PHY_CONTROL. Not sure if that's just pure luck
    or an actual workaround, but we can hope it works. So let's avoid reading
    the register and instead track the desired value of the register in dev_priv.
    
    v2: Read out the power well state to determine initial register value
    v3: Use DPIO_CHx names instead of raw numbers
    Signed-off-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
    Reviewed-by: NDeepak S <deepak.s@linux.intel.com>
    Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
    70722468
i915_drv.h 100.6 KB