• Ville Syrjälä's avatar
    drm/i915: Enable DPLL VGA mode before P1/P2 divider write · c2b63374
    Ville Syrjälä authored
    Apparently writing the DPLL register P1/P2 divider fields won't trigger
    an actual change in the DPLL output unless VGA mode is enabled for
    prior to the register write that changes the P1/P2 dividers. The write
    with the new P1/P2 divider can itself disable VGA mode again without
    problems.
    
    I tested the behaviour on my 946GZ, and when manually frobbing the
    register with the display on, the behaviour is very clear. However I
    can't explain why this machine actually works. The P1/P2 divider
    changes caused by normal modesets do seem to make it through to the
    hardware somehow since I get a stable picture on the monitor with
    any resolution. Maybe it's the "three times for luck" stuff that
    somehow masks the problem, or something.
    
    But apparently there are machines (eg. Nick Bowler's G45) where that
    isn't the case and we fail to get the correct clock from the DPLL.
    
    Things used to work because we enabled VGA mode for disabled DPLLs,
    so when re-enabling the DPLL VGA mode was enabled just prior to the
    first register write, and hence the P1/P2 change went through without
    a hitch. That got changed in
    
    b8afb911 drm/i915: Keep GMCH DPLL VGA mode always disabled
    
    in the name of consistency. In order to keep the consistency part,
    leave VGA mode disabled for disabled DPLLs, but turn it on just prior
    to updating the P1/P2 dividers to make sure the hardware picks up
    on the new values.
    
    Cc: Nick Bowler <nbowler@draconx.ca>
    Reported-by: default avatarNick Bowler <nbowler@draconx.ca>
    Tested-by: default avatarNick Bowler <nbowler@draconx.ca>
    Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
    c2b63374
intel_display.c 431 KB