• Paulo Zanoni's avatar
    drm/i915: properly alternate between DVI and HDMI · 0c14c7f9
    Paulo Zanoni authored
    This solves problems that happen when you alternate between HDMI and
    DVI on the same port. I can reproduce these problems using DP->HDMI
    and DP->DVI adapters on a DP port.
    
    When you first plug HDMI and then plug DVI, you need to stop sending
    DIPs, even if the port is in DVI mode (see the HDMI register spec). If
    you don't stop sending DIPs, you'll see a pink vertical line on the
    left side of the screen, some modes will give you a black screen, some
    modes won't work correctly.
    
    When you first plug DVI and then plug HDMI, you need to properly
    enable the DIPs, otherwise the HW won't send them. After spending a
    lot of time investigating this, I concluded that if the DIPs are
    disabled, we should not write to the DIP register again because when
    we do this, we also set the AVI InfoFrame frequency to "once", and
    this seems to really confuse our hardware. Since this problem was not
    exactly easy to debug, I'm adopting the defensive behavior and not
    just avoing the "disable twice" sequence, but also explicitly
    selecting the AVI InfoFrame and setting its frequency to a correct
    one.
    
    Also, move the "is_dvi" check from intel_set_infoframe to the
    set_infoframes functions since now they're going to be the first ones
    to deal with the DIP registers.
    
    This patch adds the code to fix the problem, but it depends on the
    removal of some code that can't be removed right now and will come
    later in the patch series. The patch that we need is:
      - drm/i915: don't write 0 to DIP control at HDMI init
    
    [danvet: Paulo clarified that this additional patch is only required
    to make the fix complete, this patch here alone doesn't introduce a
    regression but only partially solves the problem of randomly clearing
    the dip registers.]
    
    V2: Be even more defensive by selecting AVI and setting its frequency
    outside the "is_dvi" check.
    Signed-off-by: default avatarPaulo Zanoni <paulo.r.zanoni@intel.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    0c14c7f9
intel_hdmi.c 25.3 KB