On Thu, 2025-11-27 at 19:49 +0200, Imre Deak wrote:
> Use intel_dp_effective_data_rate() to calculate the required link BW for
> compressed streams on non-UHBR DP-SST links. This ensures that the BW is
> calculated the same way for all DP output types and DSC/non-DSC modes,
> during mode validation as well as during state computation.
> 
> This approach also allows for accounting with BW overhead due to DSC,
> FEC being enabled on a link. Acounting for these will be added by
> follow-up changes.
> 
> Signed-off-by: Imre Deak <[email protected]>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c | 27 +++++++++++++++----------
>  1 file changed, 16 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index aa55a81a9a9bf..4044bdbceaef5 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -2025,15 +2025,19 @@ static bool intel_dp_dsc_supports_format(const struct 
> intel_connector *connector
>       return drm_dp_dsc_sink_supports_format(connector->dp.dsc_dpcd, 
> sink_dsc_format);
>  }
>  
> -static bool is_bw_sufficient_for_dsc_config(int dsc_bpp_x16, u32 link_clock,
> -                                         u32 lane_count, u32 mode_clock,
> -                                         enum intel_output_format 
> output_format,
> -                                         int timeslots)
> +static bool is_bw_sufficient_for_dsc_config(struct intel_dp *intel_dp,
> +                                         int link_clock, int lane_count,
> +                                         int mode_clock, int mode_hdisplay,
> +                                         int dsc_slice_count, int 
> link_bpp_x16,
> +                                         unsigned long bw_overhead_flags)
>  {
> -     u32 available_bw, required_bw;
> +     int available_bw;
> +     int required_bw;
>  
> -     available_bw = (link_clock * lane_count * timeslots * 16)  / 8;
> -     required_bw = dsc_bpp_x16 * (intel_dp_mode_to_fec_clock(mode_clock));
> +     available_bw = intel_dp_max_link_data_rate(intel_dp, link_clock, 
> lane_count);
> +     required_bw = intel_dp_link_required(link_clock, lane_count,
> +                                          mode_clock, mode_hdisplay,
> +                                          link_bpp_x16, bw_overhead_flags);
>  
>       return available_bw >= required_bw;
>  }
> @@ -2081,11 +2085,12 @@ static int dsc_compute_link_config(struct intel_dp 
> *intel_dp,
>                               if (ret)
>                                       continue;
>                       } else {
> -                             if 
> (!is_bw_sufficient_for_dsc_config(dsc_bpp_x16, link_rate,
> -                                                                  lane_count,
> +                             if (!is_bw_sufficient_for_dsc_config(intel_dp,
> +                                                                  link_rate, 
> lane_count,
>                                                                    
> adjusted_mode->crtc_clock,
> -                                                                  
> pipe_config->output_format,
> -                                                                  timeslots))
> +                                                                  
> adjusted_mode->hdisplay,
> +                                                                  
> pipe_config->dsc.slice_count,
> +                                                                  
> dsc_bpp_x16, 0))
>                                       continue;
>                       }
>  

Reviewed-by: Luca Coelho <[email protected]>

--
Cheers,
Luca.

Reply via email to