[Intel-gfx] [PATCH 1/2] drm/i915/dp: Optimize the FRL configuration for HDMI2.1 PCON

Shankar, Uma uma.shankar at intel.com
Wed Nov 3 11:11:03 UTC 2021



> -----Original Message-----
> From: Nautiyal, Ankit K <ankit.k.nautiyal at intel.com>
> Sent: Friday, October 29, 2021 11:32 AM
> To: intel-gfx at lists.freedesktop.org
> Cc: Sharma, Swati2 <swati2.sharma at intel.com>; Shankar, Uma
> <uma.shankar at intel.com>
> Subject: [PATCH 1/2] drm/i915/dp: Optimize the FRL configuration for HDMI2.1
> PCON
> 
> Currently the HDMI2.1 PCON's frl link config DPCD registers are reset and configured
> even if they are already configured.
> Also the HDMI Link Mode does not settle to FRL MODE immediately after HDMI Link
> Status is active.
> 
> This patch:
> -Checks if the PCON is already configured for FRL.
> -Include HDMI Link Mode in wait for loop along with HDMI Link status DPCD.

Looks good to me.
Reviewed-by: Uma Shankar <uma.shankar at intel.com>

> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal at intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c | 37 +++++++++++++++----------
>  1 file changed, 23 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index 6d5988f0f067..f5fd106e555c 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -2198,6 +2198,18 @@ static int intel_dp_hdmi_sink_max_frl(struct intel_dp
> *intel_dp)
>  	return max_frl_rate;
>  }
> 
> +static bool
> +intel_dp_pcon_is_frl_trained(struct intel_dp *intel_dp,
> +			     u8 max_frl_bw_mask, u8 *frl_trained_mask) {
> +	if (drm_dp_pcon_hdmi_link_active(&intel_dp->aux) &&
> +	    drm_dp_pcon_hdmi_link_mode(&intel_dp->aux, frl_trained_mask) ==
> DP_PCON_HDMI_MODE_FRL &&
> +	    *frl_trained_mask >= max_frl_bw_mask)
> +		return true;
> +
> +	return false;
> +}
> +
>  static int intel_dp_pcon_start_frl_training(struct intel_dp *intel_dp)  {  #define
> TIMEOUT_FRL_READY_MS 500 @@ -2208,10 +2220,6 @@ static int
> intel_dp_pcon_start_frl_training(struct intel_dp *intel_dp)
>  	u8 max_frl_bw_mask = 0, frl_trained_mask;
>  	bool is_active;
> 
> -	ret = drm_dp_pcon_reset_frl_config(&intel_dp->aux);
> -	if (ret < 0)
> -		return ret;
> -
>  	max_pcon_frl_bw = intel_dp->dfp.pcon_max_frl_bw;
>  	drm_dbg(&i915->drm, "PCON max rate = %d Gbps\n", max_pcon_frl_bw);
> 
> @@ -2223,6 +2231,12 @@ static int intel_dp_pcon_start_frl_training(struct intel_dp
> *intel_dp)
>  	if (max_frl_bw <= 0)
>  		return -EINVAL;
> 
> +	max_frl_bw_mask = intel_dp_pcon_set_frl_mask(max_frl_bw);
> +	drm_dbg(&i915->drm, "MAX_FRL_BW_MASK = %u\n", max_frl_bw_mask);
> +
> +	if (intel_dp_pcon_is_frl_trained(intel_dp, max_frl_bw_mask,
> &frl_trained_mask))
> +		goto frl_trained;
> +
>  	ret = drm_dp_pcon_frl_prepare(&intel_dp->aux, false);
>  	if (ret < 0)
>  		return ret;
> @@ -2232,7 +2246,6 @@ static int intel_dp_pcon_start_frl_training(struct intel_dp
> *intel_dp)
>  	if (!is_active)
>  		return -ETIMEDOUT;
> 
> -	max_frl_bw_mask = intel_dp_pcon_set_frl_mask(max_frl_bw);
>  	ret = drm_dp_pcon_frl_configure_1(&intel_dp->aux, max_frl_bw,
>  					  DP_PCON_ENABLE_SEQUENTIAL_LINK);
>  	if (ret < 0)
> @@ -2248,19 +2261,15 @@ static int intel_dp_pcon_start_frl_training(struct
> intel_dp *intel_dp)
>  	 * Wait for FRL to be completed
>  	 * Check if the HDMI Link is up and active.
>  	 */
> -	wait_for(is_active = drm_dp_pcon_hdmi_link_active(&intel_dp->aux) ==
> true, TIMEOUT_HDMI_LINK_ACTIVE_MS);
> +	wait_for(is_active =
> +		 intel_dp_pcon_is_frl_trained(intel_dp, max_frl_bw_mask,
> &frl_trained_mask),
> +		 TIMEOUT_HDMI_LINK_ACTIVE_MS);
> 
>  	if (!is_active)
>  		return -ETIMEDOUT;
> 
> -	/* Verify HDMI Link configuration shows FRL Mode */
> -	if (drm_dp_pcon_hdmi_link_mode(&intel_dp->aux, &frl_trained_mask) !=
> -	    DP_PCON_HDMI_MODE_FRL) {
> -		drm_dbg(&i915->drm, "HDMI couldn't be trained in FRL Mode\n");
> -		return -EINVAL;
> -	}
> -	drm_dbg(&i915->drm, "MAX_FRL_MASK = %u, FRL_TRAINED_MASK =
> %u\n", max_frl_bw_mask, frl_trained_mask);
> -
> +frl_trained:
> +	drm_dbg(&i915->drm, "FRL_TRAINED_MASK = %u\n", frl_trained_mask);
>  	intel_dp->frl.trained_rate_gbps =
> intel_dp_pcon_get_frl_mask(frl_trained_mask);
>  	intel_dp->frl.is_trained = true;
>  	drm_dbg(&i915->drm, "FRL trained with : %d Gbps\n", intel_dp-
> >frl.trained_rate_gbps);
> --
> 2.25.1



More information about the Intel-gfx mailing list