• C
    drm/i915/gvt: Make correct handling to vreg BXT_PHY_CTL_FAMILY · c8ab5ac3
    Colin Xu 提交于
    Guest kernel will write to BXT_PHY_CTL_FAMILY to reset DDI PHY
    and pull BXT_PHY_CTL to check PHY status. Previous handling will
    set/reset BXT_PHY_CTL of all PHYs at same time on receiving vreg
    write to some BXT_PHY_CTL_FAMILY. If some BXT_PHY_CTL is already
    enabled, following reset to another BXT_PHY_CTL_FAMILY will clear
    the enabled BXT_PHY_CTL, which result in guest kernel print:
    
    -----------------------------------
    [drm:intel_ddi_get_hw_state [i915]]
    *ERROR* Port B enabled but PHY powered down? (PHY_CTL 00000000)
    -----------------------------------
    
    The correct handling should operate BXT_PHY_CTL_FAMILY and
    BXT_PHY_CTL on the same DDI.
    
    v2: Use correct reg define. The naming looks confusing, however
        current i915_reg.h bind DPIO_PHY0 to _PHY_CTL_FAMILY_DDI and
        bind DPIO_PHY1 to _PHY_CTL_FAMILY_EDP, pairing to
        _BXT_PHY_CTL_DDI_A and _BXT_PHY_CTL_DDI_B respectively.
    v3: v2 incorrectly map _PHY_CTL_FAMILY_EDP to _BXT_PHY_CTL_DDI_A.
        BXT_PHY_CTL() looks up DDI using PORTx but not PHYx. Based on
        DPIO_PHY to DDI mapping, make correct vreg handle to BXT_PHY_CTL
        on receiving vreg write to BXT_PHY_CTL_FAMILY. (He, Min)
    
    Current mapping according to bxt_power_wells:
    dpio-common-a:
        >>> DPIO_PHY1
        >>> BXT_DPIO_CMN_A_POWER_DOMAINS
        >>> POWER_DOMAIN_PORT_DDI_A_LANES
        >>> PORT_A
    
    dpio-common-bc:
        >>> DPIO_PHY0
        >>> BXT_DPIO_CMN_BC_POWER_DOMAINS
        >>> POWER_DOMAIN_PORT_DDI_B_LANES | POWER_DOMAIN_PORT_DDI_C_LANES
        >>> PORT_B or PORT_C
    Signed-off-by: NColin Xu <colin.xu@intel.com>
    Reviewed-by: NHe, Min <min.he@intel.com>
    Signed-off-by: NZhenyu Wang <zhenyuw@linux.intel.com>
    c8ab5ac3
handlers.c 109.3 KB