[Intel-gfx] [PATCH] drm/i915/mtl: Reset only one lane in case of MFD
Murthy, Arun R
arun.r.murthy at intel.com
Tue May 30 08:49:42 UTC 2023
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of Mika
> Kahola
> Sent: Wednesday, May 24, 2023 8:32 PM
> To: intel-gfx at lists.freedesktop.org
> Subject: [Intel-gfx] [PATCH] drm/i915/mtl: Reset only one lane in case of MFD
>
> In case when only two or less lanes are owned such as MFD (DP-alt with x2
> lanes) we need to reset only one lane (lane0). With only x2 lanes we don't
> need to poll for the phy current status on both lanes since only the owned
> lane will respond.
>
> Signed-off-by: Mika Kahola <mika.kahola at intel.com>
> ---
Reviewed-by: Arun R Murthy <arun.r.murthy at intel.com>
Thanks and Regards,
Arun R Murthy
--------------------
> drivers/gpu/drm/i915/display/intel_cx0_phy.c | 39 ++++++++++++--------
> 1 file changed, 23 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> index ee6902118860..b8c812c5b33f 100644
> --- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> +++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> @@ -2528,13 +2528,23 @@ static u32 intel_cx0_get_pclk_refclk_ack(u8
> lane_mask)
> return val;
> }
>
> -/* FIXME: Some Type-C cases need not reset both the lanes. Handle those
> cases. */ -static void intel_cx0_phy_lane_reset(struct drm_i915_private
> *i915, enum port port,
> +static void intel_cx0_phy_lane_reset(struct drm_i915_private *i915,
> + struct intel_encoder *encoder,
> bool lane_reversal)
> {
> + enum port port = encoder->port;
> enum phy phy = intel_port_to_phy(i915, port);
> + u8 fia_max =
> +intel_tc_port_fia_max_lane_count(enc_to_dig_port(encoder));
> u8 lane_mask = lane_reversal ? INTEL_CX0_LANE1 :
> INTEL_CX0_LANE0;
> + u32 lane_pipe_reset = fia_max > 2 ?
> + XELPDP_LANE_PIPE_RESET(0) |
> + XELPDP_LANE_PIPE_RESET(1) :
> + XELPDP_LANE_PIPE_RESET(0);
> + u32 lane_phy_current_status = fia_max > 2 ?
> + XELPDP_LANE_PHY_CURRENT_STATUS(0)
> |
> + XELPDP_LANE_PHY_CURRENT_STATUS(1) :
> + XELPDP_LANE_PHY_CURRENT_STATUS(0);
>
> if (__intel_de_wait_for_register(i915, XELPDP_PORT_BUF_CTL1(port),
>
> XELPDP_PORT_BUF_SOC_PHY_READY,
> @@ -2545,23 +2555,24 @@ static void intel_cx0_phy_lane_reset(struct
> drm_i915_private *i915, enum port po
>
> intel_de_rmw(i915, XELPDP_PORT_BUF_CTL2(port),
> XELPDP_LANE_PIPE_RESET(0) |
> XELPDP_LANE_PIPE_RESET(1),
> - XELPDP_LANE_PIPE_RESET(0) |
> XELPDP_LANE_PIPE_RESET(1));
> + lane_pipe_reset);
>
> if (__intel_de_wait_for_register(i915, XELPDP_PORT_BUF_CTL2(port),
> -
> XELPDP_LANE_PHY_CURRENT_STATUS(0) |
> -
> XELPDP_LANE_PHY_CURRENT_STATUS(1),
> -
> XELPDP_LANE_PHY_CURRENT_STATUS(0) |
> -
> XELPDP_LANE_PHY_CURRENT_STATUS(1),
> + lane_phy_current_status,
> lane_phy_current_status,
>
> XELPDP_PORT_RESET_START_TIMEOUT_US, 0, NULL))
> drm_warn(&i915->drm, "PHY %c failed to bring out of Lane
> reset after %dus.\n",
> phy_name(phy),
> XELPDP_PORT_RESET_START_TIMEOUT_US);
>
> intel_de_rmw(i915, XELPDP_PORT_CLOCK_CTL(port),
> -
> intel_cx0_get_pclk_refclk_request(INTEL_CX0_BOTH_LANES),
> + intel_cx0_get_pclk_refclk_request(fia_max > 2 ?
> + INTEL_CX0_BOTH_LANES :
> + INTEL_CX0_LANE0),
> intel_cx0_get_pclk_refclk_request(lane_mask));
>
> if (__intel_de_wait_for_register(i915,
> XELPDP_PORT_CLOCK_CTL(port),
> -
> intel_cx0_get_pclk_refclk_ack(INTEL_CX0_BOTH_LANES),
> +
> intel_cx0_get_pclk_refclk_ack(fia_max > 2 ?
> +
> INTEL_CX0_BOTH_LANES :
> +
> INTEL_CX0_LANE0),
>
> intel_cx0_get_pclk_refclk_ack(lane_mask),
>
> XELPDP_REFCLK_ENABLE_TIMEOUT_US, 0, NULL))
> drm_warn(&i915->drm, "PHY %c failed to request refclk after
> %dus.\n", @@ -2571,13 +2582,9 @@ static void
> intel_cx0_phy_lane_reset(struct drm_i915_private *i915, enum port po
> CX0_P2_STATE_RESET);
> intel_cx0_setup_powerdown(i915, port);
>
> - intel_de_rmw(i915, XELPDP_PORT_BUF_CTL2(port),
> - XELPDP_LANE_PIPE_RESET(0) |
> XELPDP_LANE_PIPE_RESET(1),
> - 0);
> + intel_de_rmw(i915, XELPDP_PORT_BUF_CTL2(port), lane_pipe_reset,
> 0);
>
> - if (intel_de_wait_for_clear(i915, XELPDP_PORT_BUF_CTL2(port),
> - XELPDP_LANE_PHY_CURRENT_STATUS(0) |
> - XELPDP_LANE_PHY_CURRENT_STATUS(1),
> + if (intel_de_wait_for_clear(i915, XELPDP_PORT_BUF_CTL2(port),
> +lane_phy_current_status,
> XELPDP_PORT_RESET_END_TIMEOUT))
> drm_warn(&i915->drm, "PHY %c failed to bring out of Lane
> reset after %dms.\n",
> phy_name(phy),
> XELPDP_PORT_RESET_END_TIMEOUT); @@ -2705,7 +2712,7 @@ static void
> intel_cx0pll_enable(struct intel_encoder *encoder,
> intel_program_port_clock_ctl(encoder, crtc_state, lane_reversal);
>
> /* 2. Bring PHY out of reset. */
> - intel_cx0_phy_lane_reset(i915, encoder->port, lane_reversal);
> + intel_cx0_phy_lane_reset(i915, encoder, lane_reversal);
>
> /*
> * 3. Change Phy power state to Ready.
> --
> 2.34.1
More information about the Intel-gfx
mailing list