On pe, 2016-10-07 at 10:28 +0300, Ander Conselvan de Oliveira wrote: > The port registers related to the phys in broxton map to different > channels and specific phys. Make that mapping explicit. > > v2: Pass enum dpio_phy to macros instead of mmio base. (Imre) > > v3: Fix typo in macros. (Imre) > > Signed-off-by: Ander Conselvan de Oliveira > --- > drivers/gpu/drm/i915/i915_drv.h | 2 + > drivers/gpu/drm/i915/i915_reg.h | 141 ++++++++++++++++++---------------- > drivers/gpu/drm/i915/intel_dpio_phy.c | 80 +++++++++++++++---- > drivers/gpu/drm/i915/intel_dpll_mgr.c | 84 +++++++++++--------- > 4 files changed, 185 insertions(+), 122 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 77f1374..c3fa29a 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -3735,6 +3735,8 @@ u32 vlv_flisdsi_read(struct drm_i915_private *dev_priv, u32 reg); > void vlv_flisdsi_write(struct drm_i915_private *dev_priv, u32 reg, u32 val); > > /* intel_dpio_phy.c */ > +void bxt_port_to_phy_channel(enum port port, > + u32 *phy, enum dpio_channel *ch); Type of phy doesn't match the function definition, should be enum dpio_phy. > void bxt_ddi_phy_set_signal_level(struct drm_i915_private *dev_priv, > enum port port, u32 margin, u32 scale, > u32 enable, u32 deemphasis); > diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h > index d3802c6..8f4612c 100644 > --- a/drivers/gpu/drm/i915/i915_reg.h > +++ b/drivers/gpu/drm/i915/i915_reg.h > @@ -1187,7 +1187,19 @@ enum skl_disp_power_wells { > #define DPIO_UPAR_SHIFT 30 > > /* BXT PHY registers */ > -#define _BXT_PHY(phy, a, b) _MMIO_PIPE((phy), (a), (b)) > +#define _BXT_PHY0_BASE 0x6C000 > +#define _BXT_PHY1_BASE 0x162000 > +#define BXT_PHY_BASE(phy) _PIPE((phy), _BXT_PHY0_BASE, \ > + _BXT_PHY1_BASE) > + > +#define _BXT_PHY(phy, reg) \ > + _MMIO(BXT_PHY_BASE(phy) - _BXT_PHY0_BASE + (reg)) > + > +#define _BXT_PHY_CH(phy, ch, reg_ch0, reg_ch1) \ > + (BXT_PHY_BASE(phy) + _PIPE((ch), (reg_ch0) - _BXT_PHY0_BASE, \ > + (reg_ch1) - _BXT_PHY0_BASE)) > +#define _MMIO_BXT_PHY_CH(phy, ch, reg_ch0, reg_ch1) \ > + _MMIO(_BXT_PHY_CH(phy, ch, reg_ch0, reg_ch1)) > > #define BXT_P_CR_GT_DISP_PWRON _MMIO(0x138090) > #define GT_DISPLAY_POWER_ON(phy) (1 << (phy)) > @@ -1204,8 +1216,8 @@ enum skl_disp_power_wells { > #define _PHY_CTL_FAMILY_EDP 0x64C80 > #define _PHY_CTL_FAMILY_DDI 0x64C90 > #define COMMON_RESET_DIS (1 << 31) > -#define BXT_PHY_CTL_FAMILY(phy) _BXT_PHY((phy), _PHY_CTL_FAMILY_DDI, \ > - _PHY_CTL_FAMILY_EDP) > +#define BXT_PHY_CTL_FAMILY(phy) _MMIO_PIPE((phy), _PHY_CTL_FAMILY_DDI, \ > + _PHY_CTL_FAMILY_EDP) > > /* BXT PHY PLL registers */ > #define _PORT_PLL_A 0x46074 > @@ -1225,18 +1237,18 @@ enum skl_disp_power_wells { > #define PORT_PLL_P2_SHIFT 8 > #define PORT_PLL_P2_MASK (0x1f << PORT_PLL_P2_SHIFT) > #define PORT_PLL_P2(x) ((x) << PORT_PLL_P2_SHIFT) > -#define BXT_PORT_PLL_EBB_0(port) _MMIO_PORT3(port, _PORT_PLL_EBB_0_A, \ > - _PORT_PLL_EBB_0_B, \ > - _PORT_PLL_EBB_0_C) > +#define BXT_PORT_PLL_EBB_0(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \ > + _PORT_PLL_EBB_0_B, \ > + _PORT_PLL_EBB_0_C) > > #define _PORT_PLL_EBB_4_A 0x162038 > #define _PORT_PLL_EBB_4_B 0x6C038 > #define _PORT_PLL_EBB_4_C 0x6C344 > #define PORT_PLL_10BIT_CLK_ENABLE (1 << 13) > #define PORT_PLL_RECALIBRATE (1 << 14) > -#define BXT_PORT_PLL_EBB_4(port) _MMIO_PORT3(port, _PORT_PLL_EBB_4_A, \ > - _PORT_PLL_EBB_4_B, \ > - _PORT_PLL_EBB_4_C) > +#define BXT_PORT_PLL_EBB_4(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \ > + _PORT_PLL_EBB_4_B, \ > + _PORT_PLL_EBB_4_C) > > #define _PORT_PLL_0_A 0x162100 > #define _PORT_PLL_0_B 0x6C100 > @@ -1267,62 +1279,56 @@ enum skl_disp_power_wells { > #define PORT_PLL_DCO_AMP_DEFAULT 15 > #define PORT_PLL_DCO_AMP_MASK 0x3c00 > #define PORT_PLL_DCO_AMP(x) ((x)<<10) > -#define _PORT_PLL_BASE(port) _PORT3(port, _PORT_PLL_0_A, \ > - _PORT_PLL_0_B, \ > - _PORT_PLL_0_C) > -#define BXT_PORT_PLL(port, idx) _MMIO(_PORT_PLL_BASE(port) + (idx) * 4) > +#define _PORT_PLL_BASE(phy, ch) _BXT_PHY_CH(phy, ch, \ > + _PORT_PLL_0_B, \ > + _PORT_PLL_0_C) > +#define BXT_PORT_PLL(phy, ch, idx) _MMIO(_PORT_PLL_BASE(phy, ch) + \ > + (idx) * 4) > > /* BXT PHY common lane registers */ > #define _PORT_CL1CM_DW0_A 0x162000 > #define _PORT_CL1CM_DW0_BC 0x6C000 > #define PHY_POWER_GOOD (1 << 16) > #define PHY_RESERVED (1 << 7) > -#define BXT_PORT_CL1CM_DW0(phy) _BXT_PHY((phy), _PORT_CL1CM_DW0_BC, \ > - _PORT_CL1CM_DW0_A) > +#define BXT_PORT_CL1CM_DW0(phy) _BXT_PHY((phy), _PORT_CL1CM_DW0_BC) > > #define _PORT_CL1CM_DW9_A 0x162024 > #define _PORT_CL1CM_DW9_BC 0x6C024 > #define IREF0RC_OFFSET_SHIFT 8 > #define IREF0RC_OFFSET_MASK (0xFF << IREF0RC_OFFSET_SHIFT) > -#define BXT_PORT_CL1CM_DW9(phy) _BXT_PHY((phy), _PORT_CL1CM_DW9_BC, \ > - _PORT_CL1CM_DW9_A) > +#define BXT_PORT_CL1CM_DW9(phy) _BXT_PHY((phy), _PORT_CL1CM_DW9_BC) > > #define _PORT_CL1CM_DW10_A 0x162028 > #define _PORT_CL1CM_DW10_BC 0x6C028 > #define IREF1RC_OFFSET_SHIFT 8 > #define IREF1RC_OFFSET_MASK (0xFF << IREF1RC_OFFSET_SHIFT) > -#define BXT_PORT_CL1CM_DW10(phy) _BXT_PHY((phy), _PORT_CL1CM_DW10_BC, \ > - _PORT_CL1CM_DW10_A) > +#define BXT_PORT_CL1CM_DW10(phy) _BXT_PHY((phy), _PORT_CL1CM_DW10_BC) > > #define _PORT_CL1CM_DW28_A 0x162070 > #define _PORT_CL1CM_DW28_BC 0x6C070 > #define OCL1_POWER_DOWN_EN (1 << 23) > #define DW28_OLDO_DYN_PWR_DOWN_EN (1 << 22) > #define SUS_CLK_CONFIG 0x3 > -#define BXT_PORT_CL1CM_DW28(phy) _BXT_PHY((phy), _PORT_CL1CM_DW28_BC, \ > - _PORT_CL1CM_DW28_A) > +#define BXT_PORT_CL1CM_DW28(phy) _BXT_PHY((phy), _PORT_CL1CM_DW28_BC) > > #define _PORT_CL1CM_DW30_A 0x162078 > #define _PORT_CL1CM_DW30_BC 0x6C078 > #define OCL2_LDOFUSE_PWR_DIS (1 << 6) > -#define BXT_PORT_CL1CM_DW30(phy) _BXT_PHY((phy), _PORT_CL1CM_DW30_BC, \ > - _PORT_CL1CM_DW30_A) > +#define BXT_PORT_CL1CM_DW30(phy) _BXT_PHY((phy), _PORT_CL1CM_DW30_BC) > > /* The spec defines this only for BXT PHY0, but lets assume that this > * would exist for PHY1 too if it had a second channel. > */ > #define _PORT_CL2CM_DW6_A 0x162358 > #define _PORT_CL2CM_DW6_BC 0x6C358 > -#define BXT_PORT_CL2CM_DW6(phy) _BXT_PHY((phy), _PORT_CL2CM_DW6_BC, \ > - _PORT_CL2CM_DW6_A) > +#define BXT_PORT_CL2CM_DW6(phy) _BXT_PHY((phy), _PORT_CL2CM_DW6_BC) > #define DW6_OLDO_DYN_PWR_DOWN_EN (1 << 28) > > /* BXT PHY Ref registers */ > #define _PORT_REF_DW3_A 0x16218C > #define _PORT_REF_DW3_BC 0x6C18C > #define GRC_DONE (1 << 22) > -#define BXT_PORT_REF_DW3(phy) _BXT_PHY((phy), _PORT_REF_DW3_BC, \ > - _PORT_REF_DW3_A) > +#define BXT_PORT_REF_DW3(phy) _BXT_PHY((phy), _PORT_REF_DW3_BC) > > #define _PORT_REF_DW6_A 0x162198 > #define _PORT_REF_DW6_BC 0x6C198 > @@ -1333,15 +1339,13 @@ enum skl_disp_power_wells { > #define GRC_CODE_SLOW_SHIFT 8 > #define GRC_CODE_SLOW_MASK (0xFF << GRC_CODE_SLOW_SHIFT) > #define GRC_CODE_NOM_MASK 0xFF > -#define BXT_PORT_REF_DW6(phy) _BXT_PHY((phy), _PORT_REF_DW6_BC, \ > - _PORT_REF_DW6_A) > +#define BXT_PORT_REF_DW6(phy) _BXT_PHY((phy), _PORT_REF_DW6_BC) > > #define _PORT_REF_DW8_A 0x1621A0 > #define _PORT_REF_DW8_BC 0x6C1A0 > #define GRC_DIS (1 << 15) > #define GRC_RDY_OVRD (1 << 1) > -#define BXT_PORT_REF_DW8(phy) _BXT_PHY((phy), _PORT_REF_DW8_BC, \ > - _PORT_REF_DW8_A) > +#define BXT_PORT_REF_DW8(phy) _BXT_PHY((phy), _PORT_REF_DW8_BC) > > /* BXT PHY PCS registers */ > #define _PORT_PCS_DW10_LN01_A 0x162428 > @@ -1350,12 +1354,13 @@ enum skl_disp_power_wells { > #define _PORT_PCS_DW10_GRP_A 0x162C28 > #define _PORT_PCS_DW10_GRP_B 0x6CC28 > #define _PORT_PCS_DW10_GRP_C 0x6CE28 > -#define BXT_PORT_PCS_DW10_LN01(port) _MMIO_PORT3(port, _PORT_PCS_DW10_LN01_A, \ > - _PORT_PCS_DW10_LN01_B, \ > - _PORT_PCS_DW10_LN01_C) > -#define BXT_PORT_PCS_DW10_GRP(port) _MMIO_PORT3(port, _PORT_PCS_DW10_GRP_A, \ > - _PORT_PCS_DW10_GRP_B, \ > - _PORT_PCS_DW10_GRP_C) > +#define BXT_PORT_PCS_DW10_LN01(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \ > + _PORT_PCS_DW10_LN01_B, \ > + _PORT_PCS_DW10_LN01_C) > +#define BXT_PORT_PCS_DW10_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \ > + _PORT_PCS_DW10_GRP_B, \ > + _PORT_PCS_DW10_GRP_C) > + > #define TX2_SWING_CALC_INIT (1 << 31) > #define TX1_SWING_CALC_INIT (1 << 30) > > @@ -1370,15 +1375,15 @@ enum skl_disp_power_wells { > #define _PORT_PCS_DW12_GRP_C 0x6CE30 > #define LANESTAGGER_STRAP_OVRD (1 << 6) > #define LANE_STAGGER_MASK 0x1F > -#define BXT_PORT_PCS_DW12_LN01(port) _MMIO_PORT3(port, _PORT_PCS_DW12_LN01_A, \ > - _PORT_PCS_DW12_LN01_B, \ > - _PORT_PCS_DW12_LN01_C) > -#define BXT_PORT_PCS_DW12_LN23(port) _MMIO_PORT3(port, _PORT_PCS_DW12_LN23_A, \ > - _PORT_PCS_DW12_LN23_B, \ > - _PORT_PCS_DW12_LN23_C) > -#define BXT_PORT_PCS_DW12_GRP(port) _MMIO_PORT3(port, _PORT_PCS_DW12_GRP_A, \ > - _PORT_PCS_DW12_GRP_B, \ > - _PORT_PCS_DW12_GRP_C) > +#define BXT_PORT_PCS_DW12_LN01(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \ > + _PORT_PCS_DW12_LN01_B, \ > + _PORT_PCS_DW12_LN01_C) > +#define BXT_PORT_PCS_DW12_LN23(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \ > + _PORT_PCS_DW12_LN23_B, \ > + _PORT_PCS_DW12_LN23_C) > +#define BXT_PORT_PCS_DW12_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \ > + _PORT_PCS_DW12_GRP_B, \ > + _PORT_PCS_DW12_GRP_C) > > /* BXT PHY TX registers */ > #define _BXT_LANE_OFFSET(lane) (((lane) >> 1) * 0x200 + \ > @@ -1390,12 +1395,12 @@ enum skl_disp_power_wells { > #define _PORT_TX_DW2_GRP_A 0x162D08 > #define _PORT_TX_DW2_GRP_B 0x6CD08 > #define _PORT_TX_DW2_GRP_C 0x6CF08 > -#define BXT_PORT_TX_DW2_GRP(port) _MMIO_PORT3(port, _PORT_TX_DW2_GRP_A, \ > - _PORT_TX_DW2_GRP_B, \ > - _PORT_TX_DW2_GRP_C) > -#define BXT_PORT_TX_DW2_LN0(port) _MMIO_PORT3(port, _PORT_TX_DW2_LN0_A, \ > - _PORT_TX_DW2_LN0_B, \ > - _PORT_TX_DW2_LN0_C) > +#define BXT_PORT_TX_DW2_LN0(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \ > + _PORT_TX_DW2_LN0_B, \ > + _PORT_TX_DW2_LN0_C) > +#define BXT_PORT_TX_DW2_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \ > + _PORT_TX_DW2_GRP_B, \ > + _PORT_TX_DW2_GRP_C) > #define MARGIN_000_SHIFT 16 > #define MARGIN_000 (0xFF << MARGIN_000_SHIFT) > #define UNIQ_TRANS_SCALE_SHIFT 8 > @@ -1407,12 +1412,12 @@ enum skl_disp_power_wells { > #define _PORT_TX_DW3_GRP_A 0x162D0C > #define _PORT_TX_DW3_GRP_B 0x6CD0C > #define _PORT_TX_DW3_GRP_C 0x6CF0C > -#define BXT_PORT_TX_DW3_GRP(port) _MMIO_PORT3(port, _PORT_TX_DW3_GRP_A, \ > - _PORT_TX_DW3_GRP_B, \ > - _PORT_TX_DW3_GRP_C) > -#define BXT_PORT_TX_DW3_LN0(port) _MMIO_PORT3(port, _PORT_TX_DW3_LN0_A, \ > - _PORT_TX_DW3_LN0_B, \ > - _PORT_TX_DW3_LN0_C) > +#define BXT_PORT_TX_DW3_LN0(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \ > + _PORT_TX_DW3_LN0_B, \ > + _PORT_TX_DW3_LN0_C) > +#define BXT_PORT_TX_DW3_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \ > + _PORT_TX_DW3_GRP_B, \ > + _PORT_TX_DW3_GRP_C) > #define SCALE_DCOMP_METHOD (1 << 26) > #define UNIQUE_TRANGE_EN_METHOD (1 << 27) > > @@ -1422,12 +1427,12 @@ enum skl_disp_power_wells { > #define _PORT_TX_DW4_GRP_A 0x162D10 > #define _PORT_TX_DW4_GRP_B 0x6CD10 > #define _PORT_TX_DW4_GRP_C 0x6CF10 > -#define BXT_PORT_TX_DW4_LN0(port) _MMIO_PORT3(port, _PORT_TX_DW4_LN0_A, \ > - _PORT_TX_DW4_LN0_B, \ > - _PORT_TX_DW4_LN0_C) > -#define BXT_PORT_TX_DW4_GRP(port) _MMIO_PORT3(port, _PORT_TX_DW4_GRP_A, \ > - _PORT_TX_DW4_GRP_B, \ > - _PORT_TX_DW4_GRP_C) > +#define BXT_PORT_TX_DW4_LN0(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \ > + _PORT_TX_DW4_LN0_B, \ > + _PORT_TX_DW4_LN0_C) > +#define BXT_PORT_TX_DW4_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \ > + _PORT_TX_DW4_GRP_B, \ > + _PORT_TX_DW4_GRP_C) > #define DEEMPH_SHIFT 24 > #define DE_EMPHASIS (0xFF << DEEMPH_SHIFT) > > @@ -1436,10 +1441,10 @@ enum skl_disp_power_wells { > #define _PORT_TX_DW14_LN0_C 0x6C938 > #define LATENCY_OPTIM_SHIFT 30 > #define LATENCY_OPTIM (1 << LATENCY_OPTIM_SHIFT) > -#define BXT_PORT_TX_DW14_LN(port, lane) _MMIO(_PORT3((port), _PORT_TX_DW14_LN0_A, \ > - _PORT_TX_DW14_LN0_B, \ > - _PORT_TX_DW14_LN0_C) + \ > - _BXT_LANE_OFFSET(lane)) > +#define BXT_PORT_TX_DW14_LN(phy, ch, lane) \ > + _MMIO(_BXT_PHY_CH(phy, ch, _PORT_TX_DW14_LN0_B, \ > + _PORT_TX_DW14_LN0_C) + \ > + _BXT_LANE_OFFSET(lane)) > > /* UAIMI scratch pad register 1 */ > #define UAIMI_SPR1 _MMIO(0x4F074) > diff --git a/drivers/gpu/drm/i915/intel_dpio_phy.c b/drivers/gpu/drm/i915/intel_dpio_phy.c > index 6711e3a..0d2cb6b 100644 > --- a/drivers/gpu/drm/i915/intel_dpio_phy.c > +++ b/drivers/gpu/drm/i915/intel_dpio_phy.c > @@ -167,26 +167,58 @@ static u32 bxt_phy_port_mask(const struct bxt_ddi_phy_info *phy_info) > BIT(phy_info->channel[DPIO_CH0].port); > } > > +void bxt_port_to_phy_channel(enum port port, > + enum dpio_phy *phy, enum dpio_channel *ch) > +{ > + const struct bxt_ddi_phy_info *phy_info; > + int i; > + > + for (i = 0; i < ARRAY_SIZE(bxt_ddi_phy_info); i++) { > + phy_info = &bxt_ddi_phy_info[i]; > + > + if (port == phy_info->channel[DPIO_CH0].port) { > + *phy = i; > + *ch = DPIO_CH0; > + return; > + } > + > + if (phy_info->dual_channel && > + port == phy_info->channel[DPIO_CH1].port) { > + *phy = i; > + *ch = DPIO_CH1; > + return; > + } > + } > + > + WARN(1, "PHY not found for PORT %c", port_name(port)); > + *phy = DPIO_PHY0; > + *ch = DPIO_CH0; > +} > + > void bxt_ddi_phy_set_signal_level(struct drm_i915_private *dev_priv, > enum port port, u32 margin, u32 scale, > u32 enable, u32 deemphasis) > { > u32 val; > + u32 phy; This and similar places should be enum dpio_phy according to the above change. > + enum dpio_channel ch; > + > + bxt_port_to_phy_channel(port, &phy, &ch); > > /* > * While we write to the group register to program all lanes at once we > * can read only lane registers and we pick lanes 0/1 for that. > */ > - val = I915_READ(BXT_PORT_PCS_DW10_LN01(port)); > + val = I915_READ(BXT_PORT_PCS_DW10_LN01(phy, ch)); > val &= ~(TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT); > - I915_WRITE(BXT_PORT_PCS_DW10_GRP(port), val); > + I915_WRITE(BXT_PORT_PCS_DW10_GRP(phy, ch), val); > > - val = I915_READ(BXT_PORT_TX_DW2_LN0(port)); > + val = I915_READ(BXT_PORT_TX_DW2_LN0(phy, ch)); > val &= ~(MARGIN_000 | UNIQ_TRANS_SCALE); > val |= margin << MARGIN_000_SHIFT | scale << UNIQ_TRANS_SCALE_SHIFT; > - I915_WRITE(BXT_PORT_TX_DW2_GRP(port), val); > + I915_WRITE(BXT_PORT_TX_DW2_GRP(phy, ch), val); > > - val = I915_READ(BXT_PORT_TX_DW3_LN0(port)); > + val = I915_READ(BXT_PORT_TX_DW3_LN0(phy, ch)); > val &= ~SCALE_DCOMP_METHOD; > if (enable) > val |= SCALE_DCOMP_METHOD; > @@ -194,16 +226,16 @@ void bxt_ddi_phy_set_signal_level(struct drm_i915_private *dev_priv, > if ((val & UNIQUE_TRANGE_EN_METHOD) && !(val & SCALE_DCOMP_METHOD)) > DRM_ERROR("Disabled scaling while ouniqetrangenmethod was set"); > > - I915_WRITE(BXT_PORT_TX_DW3_GRP(port), val); > + I915_WRITE(BXT_PORT_TX_DW3_GRP(phy, ch), val); > > - val = I915_READ(BXT_PORT_TX_DW4_LN0(port)); > + val = I915_READ(BXT_PORT_TX_DW4_LN0(phy, ch)); > val &= ~DE_EMPHASIS; > val |= deemphasis << DEEMPH_SHIFT; > - I915_WRITE(BXT_PORT_TX_DW4_GRP(port), val); > + I915_WRITE(BXT_PORT_TX_DW4_GRP(phy, ch), val); > > - val = I915_READ(BXT_PORT_PCS_DW10_LN01(port)); > + val = I915_READ(BXT_PORT_PCS_DW10_LN01(phy, ch)); > val |= TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT; > - I915_WRITE(BXT_PORT_PCS_DW10_GRP(port), val); > + I915_WRITE(BXT_PORT_PCS_DW10_GRP(phy, ch), val); > } > > bool bxt_ddi_phy_is_enabled(struct drm_i915_private *dev_priv, > @@ -256,7 +288,11 @@ bool bxt_ddi_phy_is_enabled(struct drm_i915_private *dev_priv, > > static u32 bxt_get_grc(struct drm_i915_private *dev_priv, enum dpio_phy phy) > { > - u32 val = I915_READ(BXT_PORT_REF_DW6(phy)); > + const struct bxt_ddi_phy_info *phy_info; > + u32 val; > + > + phy_info = &bxt_ddi_phy_info[phy]; > + val = I915_READ(BXT_PORT_REF_DW6(phy)); > > return (val & GRC_CODE_MASK) >> GRC_CODE_SHIFT; > } > @@ -264,6 +300,10 @@ static u32 bxt_get_grc(struct drm_i915_private *dev_priv, enum dpio_phy phy) > static void bxt_phy_wait_grc_done(struct drm_i915_private *dev_priv, > enum dpio_phy phy) > { > + const struct bxt_ddi_phy_info *phy_info; > + > + phy_info = &bxt_ddi_phy_info[phy]; > + This isn't used. > if (intel_wait_for_register(dev_priv, > BXT_PORT_REF_DW3(phy), > GRC_DONE, GRC_DONE, > @@ -489,8 +529,8 @@ bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv, > grc_code; > mask = GRC_CODE_FAST_MASK | GRC_CODE_SLOW_MASK | > GRC_CODE_NOM_MASK; > - ok &= _CHK(BXT_PORT_REF_DW6(phy), mask, grc_code, > - "BXT_PORT_REF_DW6(%d)", phy); > + ok &= _CHK(BXT_PORT_REF_DW6(phy), mask, > + grc_code, "BXT_PORT_REF_DW6(%d)", phy); Redundant w/s change. With the above fixed this is: Reviewed-by: Imre Deak <imre.deak@xxxxxxxxx> > > mask = GRC_DIS | GRC_RDY_OVRD; > ok &= _CHK(BXT_PORT_REF_DW8(phy), mask, mask, > @@ -525,10 +565,14 @@ void bxt_ddi_phy_set_lane_optim_mask(struct intel_encoder *encoder, > struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); > struct drm_i915_private *dev_priv = to_i915(dport->base.base.dev); > enum port port = dport->port; > + u32 phy; > + enum dpio_channel ch; > int lane; > > + bxt_port_to_phy_channel(port, &phy, &ch); > + > for (lane = 0; lane < 4; lane++) { > - u32 val = I915_READ(BXT_PORT_TX_DW14_LN(port, lane)); > + u32 val = I915_READ(BXT_PORT_TX_DW14_LN(phy, ch, lane)); > > /* > * Note that on CHV this flag is called UPAR, but has > @@ -538,7 +582,7 @@ void bxt_ddi_phy_set_lane_optim_mask(struct intel_encoder *encoder, > if (lane_lat_optim_mask & BIT(lane)) > val |= LATENCY_OPTIM; > > - I915_WRITE(BXT_PORT_TX_DW14_LN(port, lane), val); > + I915_WRITE(BXT_PORT_TX_DW14_LN(phy, ch, lane), val); > } > } > > @@ -548,12 +592,16 @@ bxt_ddi_phy_get_lane_lat_optim_mask(struct intel_encoder *encoder) > struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); > struct drm_i915_private *dev_priv = to_i915(dport->base.base.dev); > enum port port = dport->port; > + u32 phy; > + enum dpio_channel ch; > int lane; > uint8_t mask; > > + bxt_port_to_phy_channel(port, &phy, &ch); > + > mask = 0; > for (lane = 0; lane < 4; lane++) { > - u32 val = I915_READ(BXT_PORT_TX_DW14_LN(port, lane)); > + u32 val = I915_READ(BXT_PORT_TX_DW14_LN(phy, ch, lane)); > > if (val & LATENCY_OPTIM) > mask |= BIT(lane); > diff --git a/drivers/gpu/drm/i915/intel_dpll_mgr.c b/drivers/gpu/drm/i915/intel_dpll_mgr.c > index 1c59ca5..a4a9f05 100644 > --- a/drivers/gpu/drm/i915/intel_dpll_mgr.c > +++ b/drivers/gpu/drm/i915/intel_dpll_mgr.c > @@ -1371,6 +1371,10 @@ static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv, > { > uint32_t temp; > enum port port = (enum port)pll->id; /* 1:1 port->PLL mapping */ > + u32 phy; > + enum dpio_channel ch; > + > + bxt_port_to_phy_channel(port, &phy, &ch); > > /* Non-SSC reference */ > temp = I915_READ(BXT_PORT_PLL_ENABLE(port)); > @@ -1378,72 +1382,72 @@ static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv, > I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp); > > /* Disable 10 bit clock */ > - temp = I915_READ(BXT_PORT_PLL_EBB_4(port)); > + temp = I915_READ(BXT_PORT_PLL_EBB_4(phy, ch)); > temp &= ~PORT_PLL_10BIT_CLK_ENABLE; > - I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp); > + I915_WRITE(BXT_PORT_PLL_EBB_4(phy, ch), temp); > > /* Write P1 & P2 */ > - temp = I915_READ(BXT_PORT_PLL_EBB_0(port)); > + temp = I915_READ(BXT_PORT_PLL_EBB_0(phy, ch)); > temp &= ~(PORT_PLL_P1_MASK | PORT_PLL_P2_MASK); > temp |= pll->config.hw_state.ebb0; > - I915_WRITE(BXT_PORT_PLL_EBB_0(port), temp); > + I915_WRITE(BXT_PORT_PLL_EBB_0(phy, ch), temp); > > /* Write M2 integer */ > - temp = I915_READ(BXT_PORT_PLL(port, 0)); > + temp = I915_READ(BXT_PORT_PLL(phy, ch, 0)); > temp &= ~PORT_PLL_M2_MASK; > temp |= pll->config.hw_state.pll0; > - I915_WRITE(BXT_PORT_PLL(port, 0), temp); > + I915_WRITE(BXT_PORT_PLL(phy, ch, 0), temp); > > /* Write N */ > - temp = I915_READ(BXT_PORT_PLL(port, 1)); > + temp = I915_READ(BXT_PORT_PLL(phy, ch, 1)); > temp &= ~PORT_PLL_N_MASK; > temp |= pll->config.hw_state.pll1; > - I915_WRITE(BXT_PORT_PLL(port, 1), temp); > + I915_WRITE(BXT_PORT_PLL(phy, ch, 1), temp); > > /* Write M2 fraction */ > - temp = I915_READ(BXT_PORT_PLL(port, 2)); > + temp = I915_READ(BXT_PORT_PLL(phy, ch, 2)); > temp &= ~PORT_PLL_M2_FRAC_MASK; > temp |= pll->config.hw_state.pll2; > - I915_WRITE(BXT_PORT_PLL(port, 2), temp); > + I915_WRITE(BXT_PORT_PLL(phy, ch, 2), temp); > > /* Write M2 fraction enable */ > - temp = I915_READ(BXT_PORT_PLL(port, 3)); > + temp = I915_READ(BXT_PORT_PLL(phy, ch, 3)); > temp &= ~PORT_PLL_M2_FRAC_ENABLE; > temp |= pll->config.hw_state.pll3; > - I915_WRITE(BXT_PORT_PLL(port, 3), temp); > + I915_WRITE(BXT_PORT_PLL(phy, ch, 3), temp); > > /* Write coeff */ > - temp = I915_READ(BXT_PORT_PLL(port, 6)); > + temp = I915_READ(BXT_PORT_PLL(phy, ch, 6)); > temp &= ~PORT_PLL_PROP_COEFF_MASK; > temp &= ~PORT_PLL_INT_COEFF_MASK; > temp &= ~PORT_PLL_GAIN_CTL_MASK; > temp |= pll->config.hw_state.pll6; > - I915_WRITE(BXT_PORT_PLL(port, 6), temp); > + I915_WRITE(BXT_PORT_PLL(phy, ch, 6), temp); > > /* Write calibration val */ > - temp = I915_READ(BXT_PORT_PLL(port, 8)); > + temp = I915_READ(BXT_PORT_PLL(phy, ch, 8)); > temp &= ~PORT_PLL_TARGET_CNT_MASK; > temp |= pll->config.hw_state.pll8; > - I915_WRITE(BXT_PORT_PLL(port, 8), temp); > + I915_WRITE(BXT_PORT_PLL(phy, ch, 8), temp); > > - temp = I915_READ(BXT_PORT_PLL(port, 9)); > + temp = I915_READ(BXT_PORT_PLL(phy, ch, 9)); > temp &= ~PORT_PLL_LOCK_THRESHOLD_MASK; > temp |= pll->config.hw_state.pll9; > - I915_WRITE(BXT_PORT_PLL(port, 9), temp); > + I915_WRITE(BXT_PORT_PLL(phy, ch, 9), temp); > > - temp = I915_READ(BXT_PORT_PLL(port, 10)); > + temp = I915_READ(BXT_PORT_PLL(phy, ch, 10)); > temp &= ~PORT_PLL_DCO_AMP_OVR_EN_H; > temp &= ~PORT_PLL_DCO_AMP_MASK; > temp |= pll->config.hw_state.pll10; > - I915_WRITE(BXT_PORT_PLL(port, 10), temp); > + I915_WRITE(BXT_PORT_PLL(phy, ch, 10), temp); > > /* Recalibrate with new settings */ > - temp = I915_READ(BXT_PORT_PLL_EBB_4(port)); > + temp = I915_READ(BXT_PORT_PLL_EBB_4(phy, ch)); > temp |= PORT_PLL_RECALIBRATE; > - I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp); > + I915_WRITE(BXT_PORT_PLL_EBB_4(phy, ch), temp); > temp &= ~PORT_PLL_10BIT_CLK_ENABLE; > temp |= pll->config.hw_state.ebb4; > - I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp); > + I915_WRITE(BXT_PORT_PLL_EBB_4(phy, ch), temp); > > /* Enable PLL */ > temp = I915_READ(BXT_PORT_PLL_ENABLE(port)); > @@ -1459,11 +1463,11 @@ static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv, > * While we write to the group register to program all lanes at once we > * can read only lane registers and we pick lanes 0/1 for that. > */ > - temp = I915_READ(BXT_PORT_PCS_DW12_LN01(port)); > + temp = I915_READ(BXT_PORT_PCS_DW12_LN01(phy, ch)); > temp &= ~LANE_STAGGER_MASK; > temp &= ~LANESTAGGER_STRAP_OVRD; > temp |= pll->config.hw_state.pcsdw12; > - I915_WRITE(BXT_PORT_PCS_DW12_GRP(port), temp); > + I915_WRITE(BXT_PORT_PCS_DW12_GRP(phy, ch), temp); > } > > static void bxt_ddi_pll_disable(struct drm_i915_private *dev_priv, > @@ -1485,6 +1489,10 @@ static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv, > enum port port = (enum port)pll->id; /* 1:1 port->PLL mapping */ > uint32_t val; > bool ret; > + u32 phy; > + enum dpio_channel ch; > + > + bxt_port_to_phy_channel(port, &phy, &ch); > > if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS)) > return false; > @@ -1495,36 +1503,36 @@ static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv, > if (!(val & PORT_PLL_ENABLE)) > goto out; > > - hw_state->ebb0 = I915_READ(BXT_PORT_PLL_EBB_0(port)); > + hw_state->ebb0 = I915_READ(BXT_PORT_PLL_EBB_0(phy, ch)); > hw_state->ebb0 &= PORT_PLL_P1_MASK | PORT_PLL_P2_MASK; > > - hw_state->ebb4 = I915_READ(BXT_PORT_PLL_EBB_4(port)); > + hw_state->ebb4 = I915_READ(BXT_PORT_PLL_EBB_4(phy, ch)); > hw_state->ebb4 &= PORT_PLL_10BIT_CLK_ENABLE; > > - hw_state->pll0 = I915_READ(BXT_PORT_PLL(port, 0)); > + hw_state->pll0 = I915_READ(BXT_PORT_PLL(phy, ch, 0)); > hw_state->pll0 &= PORT_PLL_M2_MASK; > > - hw_state->pll1 = I915_READ(BXT_PORT_PLL(port, 1)); > + hw_state->pll1 = I915_READ(BXT_PORT_PLL(phy, ch, 1)); > hw_state->pll1 &= PORT_PLL_N_MASK; > > - hw_state->pll2 = I915_READ(BXT_PORT_PLL(port, 2)); > + hw_state->pll2 = I915_READ(BXT_PORT_PLL(phy, ch, 2)); > hw_state->pll2 &= PORT_PLL_M2_FRAC_MASK; > > - hw_state->pll3 = I915_READ(BXT_PORT_PLL(port, 3)); > + hw_state->pll3 = I915_READ(BXT_PORT_PLL(phy, ch, 3)); > hw_state->pll3 &= PORT_PLL_M2_FRAC_ENABLE; > > - hw_state->pll6 = I915_READ(BXT_PORT_PLL(port, 6)); > + hw_state->pll6 = I915_READ(BXT_PORT_PLL(phy, ch, 6)); > hw_state->pll6 &= PORT_PLL_PROP_COEFF_MASK | > PORT_PLL_INT_COEFF_MASK | > PORT_PLL_GAIN_CTL_MASK; > > - hw_state->pll8 = I915_READ(BXT_PORT_PLL(port, 8)); > + hw_state->pll8 = I915_READ(BXT_PORT_PLL(phy, ch, 8)); > hw_state->pll8 &= PORT_PLL_TARGET_CNT_MASK; > > - hw_state->pll9 = I915_READ(BXT_PORT_PLL(port, 9)); > + hw_state->pll9 = I915_READ(BXT_PORT_PLL(phy, ch, 9)); > hw_state->pll9 &= PORT_PLL_LOCK_THRESHOLD_MASK; > > - hw_state->pll10 = I915_READ(BXT_PORT_PLL(port, 10)); > + hw_state->pll10 = I915_READ(BXT_PORT_PLL(phy, ch, 10)); > hw_state->pll10 &= PORT_PLL_DCO_AMP_OVR_EN_H | > PORT_PLL_DCO_AMP_MASK; > > @@ -1533,11 +1541,11 @@ static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv, > * can read only lane registers. We configure all lanes the same way, so > * here just read out lanes 0/1 and output a note if lanes 2/3 differ. > */ > - hw_state->pcsdw12 = I915_READ(BXT_PORT_PCS_DW12_LN01(port)); > - if (I915_READ(BXT_PORT_PCS_DW12_LN23(port)) != hw_state->pcsdw12) > + hw_state->pcsdw12 = I915_READ(BXT_PORT_PCS_DW12_LN01(phy, ch)); > + if (I915_READ(BXT_PORT_PCS_DW12_LN23(phy, ch)) != hw_state->pcsdw12) > DRM_DEBUG_DRIVER("lane stagger config different for lane 01 (%08x) and 23 (%08x)\n", > hw_state->pcsdw12, > - I915_READ(BXT_PORT_PCS_DW12_LN23(port))); > + I915_READ(BXT_PORT_PCS_DW12_LN23(phy, ch))); > hw_state->pcsdw12 &= LANE_STAGGER_MASK | LANESTAGGER_STRAP_OVRD; > > ret = true; _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx