• Imre Deak's avatar
    drm/i915/skl: Work around incorrect BIOS WRPLL PDIV programming · 7a8a95f5
    Imre Deak authored
    The BIOS of at least one ASUS-Z170M system with an SKL I have programs
    the 101b WRPLL PDIV divider value, which is the encoding for PDIV=7 with
    bit#0 incorrectly set.
    
    This happens with the
    
    "3840x2160": 30 262750 3840 3888 3920 4000 2160 2163 2168 2191 0x48 0x9
    
    HDMI mode (scaled from a 1024x768 src fb) set by BIOS and the
    
    ref_clock=24000, dco_integer=383, dco_fraction=5802, pdiv=7, qdiv=1, kdiv=1
    
    WRPLL parameters (assuming PDIV=7 was the intended setting). This
    corresponds to 262749 PLL frequency/port clock.
    
    Later the driver sets the same mode for which it calculates the same
    dco_int/dco_frac/div WRPLL parameters (with the correct PDIV=7 encoding).
    
    Based on the above, let's assume that PDIV=7 was intended and the HW
    just ignores bit#0 in the PDIV register field for this setting, treating
    100b and 101b encodings the same way.
    
    While at it add the MISSING_CASE() for the p0,p2 divider decodings.
    
    v2: (Ville)
    - Add a define for the incorrect divider value.
    - Emit only a debug message when detecting the incorrect divider value.
    - Use fallthrough from the incorrect divider value case.
    - Add the MISSING_CASE()s.
    
    v3: Return 0 freq for incorrect divider values. (Ville)
    
    Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
    Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201006013555.1488262-1-imre.deak@intel.com
    7a8a95f5
i915_reg.h 492 KB