> > +
> > + /*
> > + * This needs to be added to give PHY time to set everything up this
> was a requirement
> > + * to get the display up and running.
> > + */
> > + udelay(150);
>
> How was this delay value derived?
While doing power on we came up with this empirical value after a lot of trial
and error.
Regards,
Suraj Kandpal
>
> Thanks and Regards,
> Arun R Murthy
> -------------------
>
> > + intel_clear_response_ready_flag(encoder, lane);
> > + intel_lt_phy_clear_status_p2p(encoder, lane);
> > +
> > + return 0;
> > +}
> > +
> > +static void __intel_lt_phy_p2p_write(struct intel_encoder *encoder,
> > + int lane, u16 addr, u8 data,
> > + i915_reg_t mac_reg_addr,
> > + u8 expected_mac_val)
> > +{
> > + struct intel_display *display = to_intel_display(encoder);
> > + enum phy phy = intel_encoder_to_phy(encoder);
> > + int i, status;
> > +
> > + assert_dc_off(display);
> > +
> > + /* 3 tries is assumed to be enough to write successfully */
> > + for (i = 0; i < 3; i++) {
> > + status = __intel_lt_phy_p2p_write_once(encoder, lane, addr,
> data, mac_reg_addr,
> > + expected_mac_val);
> > +
> > + if (status == 0)
> > + return;
> > + }
> > +
> > + drm_err_once(display->drm,
> > + "PHY %c P2P Write %04x failed after %d retries.\n",
> > +phy_name(phy), addr, i); }
> > +
> > +static void intel_lt_phy_p2p_write(struct intel_encoder *encoder,
> > + u8 lane_mask, u16 addr, u8 data,
> > + i915_reg_t mac_reg_addr,
> > + u8 expected_mac_val)
> > +{
> > + int lane;
> > +
> > + for_each_lt_phy_lane_in_mask(lane_mask, lane)
> > + __intel_lt_phy_p2p_write(encoder, lane, addr, data,
> mac_reg_addr,
> > +expected_mac_val); }
> > +
> > static void
> > intel_lt_phy_setup_powerdown(struct intel_encoder *encoder, u8
> lane_count)
> > {
> > @@ -1417,6 +1528,10 @@ void intel_lt_phy_pll_enable(struct
> intel_encoder *encoder,
> > * register at offset 0xC00 for Owned PHY Lanes*.
> > */
> > /* 6.3. Clear P2P transaction Ready bit. */
> > + intel_lt_phy_p2p_write(encoder, owned_lane_mask,
> LT_PHY_RATE_UPDATE,
> > + LT_PHY_RATE_CONTROL_VDR_UPDATE,
> LT_PHY_MAC_VDR,
> > + LT_PHY_PCLKIN_GATE);
> > +
> > /* 7. Program PORT_CLOCK_CTL[PCLK PLL Request LN0] = 0.
> */
> > /* 8. Poll for PORT_CLOCK_CTL[PCLK PLL Ack LN0]= 0. */
> > /*
> > diff --git a/drivers/gpu/drm/i915/display/intel_lt_phy_regs.h
> > b/drivers/gpu/drm/i915/display/intel_lt_phy_regs.h
> > index a4aa2a3e0425..5fb4331c387f 100644
> > --- a/drivers/gpu/drm/i915/display/intel_lt_phy_regs.h
> > +++ b/drivers/gpu/drm/i915/display/intel_lt_phy_regs.h
> > @@ -9,12 +9,17 @@
> > #include "i915_reg_defs.h"
> > #include "intel_display_limits.h"
> >
> > +#define XE3PLPD_MSGBUS_TIMEOUT_FAST_US 500
> > #define XE3PLPD_MACCLK_TURNON_LATENCY_MS 1
> > #define XE3PLPD_MACCLK_TURNON_LATENCY_US 21
> > #define XE3PLPD_RATE_CALIB_DONE_LATENCY_US 50
> > #define XE3PLPD_RESET_START_LATENCY_US 10
> > #define XE3PLPD_RESET_END_LATENCY_US 200
> >
> > +/* LT Phy MAC Register */
> > +#define LT_PHY_MAC_VDR _MMIO(0xC00)
> > +#define LT_PHY_PCLKIN_GATE REG_BIT8(0)
> > +
> > /* LT Phy Vendor Register */
> > #define LT_PHY_VDR_0_CONFIG 0xC02
> > #define LT_PHY_VDR_DP_PLL_ENABLE REG_BIT(7)
> > @@ -29,6 +34,7 @@
> > #define LT_PHY_VDR_X_DATAY(idx, y) ((0xC06 + (3 - (y))) + 0x6 *
> (idx))
> >
> > #define LT_PHY_RATE_UPDATE 0xCC4
> > +#define LT_PHY_RATE_CONTROL_VDR_UPDATE REG_BIT8(0)
> >
> > #define _XE3PLPD_PORT_BUF_CTL5(idx)
> _MMIO(_PICK_EVEN_2RANGES(idx, PORT_TC1, \
> >
> _XELPDP_PORT_BUF_CTL1_LN0_A, \ @@ -41,4 +47,13 @@
> > #define XE3PLPD_MACCLK_RATE_MASK REG_GENMASK(4, 0)
> > #define XE3PLPD_MACCLK_RATE_DEF
> REG_FIELD_PREP(XE3PLPD_MACCLK_RATE_MASK, 0x1F)
> >
> > +#define _XE3PLPD_PORT_P2M_MSGBUS_STATUS_P2P(idx, lane)
> _MMIO(_PICK_EVEN_2RANGES(idx, PORT_TC1, \
> > +
> _XELPDP_PORT_M2P_MSGBUS_CTL_LN0_A, \
> > +
> _XELPDP_PORT_M2P_MSGBUS_CTL_LN0_B, \
> > +
> _XELPDP_PORT_M2P_MSGBUS_CTL_LN0_USBC1, \
> > +
> _XELPDP_PORT_M2P_MSGBUS_CTL_LN0_USBC2) \
> > +
> + 0x60 + (lane) * 0x4)
> > +#define XE3PLPD_PORT_P2M_MSGBUS_STATUS_P2P(port, lane)
> _XE3PLPD_PORT_P2M_MSGBUS_STATUS_P2P(__xe2lpd_port_idx(port), \
> > +
> lane)
> > +#define XE3LPD_PORT_P2M_ADDR_MASK
> REG_GENMASK(11, 0)
> > #endif /* __INTEL_LT_PHY_REGS_H__ */