On Mon, Nov 13, 2023 at 10:11:09PM +0200, Imre Deak wrote:
> Atm the allocated MST PBN value is calculated from the TU size (number
> of allocated MTP slots) as
> 
>   PBN = TU * pbn_div
> 
> pbn_div being the link BW for each MTP slot. For DP 1.4 link rates this
> worked, as pbn_div there is guraranteed to be an integer number, however
> on UHBR this isn't the case. To get a PBN, TU pair where TU is a
> properly rounded-up value covering all the BW corresponding to PBN,
> calculate first PBN and from PBN the TU value.
> 
> Signed-off-by: Imre Deak <imre.d...@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp_mst.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c 
> b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index b943dbf394a22..a32ab0b4fc9d7 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -170,6 +170,7 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct 
> intel_encoder *encoder,
>  
>       for (bpp = max_bpp; bpp >= min_bpp; bpp -= step) {
>               struct intel_link_m_n remote_m_n;
> +             int alloc_tu;
>               int link_bpp;
>  
>               drm_dbg_kms(&i915->drm, "Trying bpp %d\n", bpp);
> @@ -200,9 +201,14 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct 
> intel_encoder *encoder,
>                * crtc_state->dp_m_n.tu), provided that the driver doesn't
>                * enable SSC on the corresponding link.
>                */
> +             crtc_state->pbn = 
> DIV_ROUND_UP_ULL(mul_u32_u32(mst_state->pbn_div * 64,
> +                                                            
> remote_m_n.data_m),
> +                                                remote_m_n.data_n);

I realized this may allocate fewer PBNs than required, since the actual
pbn_div value is not an integer. Also PBN can be calculated in a more direct
way from the effective pixel data rate, so I'd like to do that instead.

I'll send a new version with the above changes.

> +
> +             alloc_tu = DIV_ROUND_UP_ULL(crtc_state->pbn, 
> mst_state->pbn_div);


> +             drm_WARN_ON(&i915->drm, alloc_tu < remote_m_n.tu);
>               drm_WARN_ON(&i915->drm, remote_m_n.tu < crtc_state->dp_m_n.tu);
> -             crtc_state->dp_m_n.tu = remote_m_n.tu;
> -             crtc_state->pbn = remote_m_n.tu * mst_state->pbn_div;
> +             crtc_state->dp_m_n.tu = alloc_tu;
>  
>               slots = drm_dp_atomic_find_time_slots(state, &intel_dp->mst_mgr,
>                                                     connector->port,
> -- 
> 2.39.2
> 

Reply via email to