On Mon, 2025-04-28 at 16:31 +0300, Imre Deak wrote: > The maximum link bpp - determined by the link BW for instance - can be > fractional, handle this properly during computing the link bpp on SST. > > This keeps the pipe joiner specific maximum link bpp as a rounded-down > integer value still, changing that to a fractional value is left for > later. > > v2: Align the min/max bpp value to the bpp step. > > Signed-off-by: Imre Deak <imre.d...@intel.com> > --- > drivers/gpu/drm/i915/display/intel_dp.c | 17 ++++++++--------- > 1 file changed, 8 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c > b/drivers/gpu/drm/i915/display/intel_dp.c > index 42b45598a0134..7abc5286f4ccc 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp.c > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > @@ -27,6 +27,8 @@ > > #include <linux/export.h> > #include <linux/i2c.h> > +#include <linux/log2.h> > +#include <linux/math.h> > #include <linux/notifier.h> > #include <linux/seq_buf.h> > #include <linux/slab.h> > @@ -938,6 +940,7 @@ static u32 ultrajoiner_ram_max_bpp(u32 mode_hdisplay) > return ultrajoiner_ram_bits() / mode_hdisplay; > } > > +/* TODO: return a bpp_x16 value */ > static > u32 get_max_compressed_bpp_with_joiner(struct intel_display *display, > u32 mode_clock, u32 mode_hdisplay, > @@ -2152,24 +2155,16 @@ static int dsc_compute_compressed_bpp(struct intel_dp > *intel_dp, > const struct intel_connector *connector = > to_intel_connector(conn_state->connector); > const struct drm_display_mode *adjusted_mode = > &pipe_config->hw.adjusted_mode; > int output_bpp; > - int dsc_min_bpp; > - int dsc_max_bpp; > int min_bpp_x16, max_bpp_x16, bpp_step_x16; > int dsc_joiner_max_bpp; > int num_joined_pipes = intel_crtc_num_joined_pipes(pipe_config); > int bpp_x16; > int ret; > > - dsc_min_bpp = fxp_q4_to_int_roundup(limits->link.min_bpp_x16); > - > dsc_joiner_max_bpp = get_max_compressed_bpp_with_joiner(display, > adjusted_mode->clock, > > adjusted_mode->hdisplay, > > num_joined_pipes); > - dsc_max_bpp = min(dsc_joiner_max_bpp, > fxp_q4_to_int(limits->link.max_bpp_x16)); > - > - /* FIXME: remove the round trip via integers */ > - min_bpp_x16 = fxp_q4_from_int(dsc_min_bpp); > - max_bpp_x16 = fxp_q4_from_int(dsc_max_bpp); > + max_bpp_x16 = min(fxp_q4_from_int(dsc_joiner_max_bpp), > limits->link.max_bpp_x16); > > bpp_step_x16 = intel_dp_dsc_bpp_step_x16(connector); > > @@ -2177,6 +2172,10 @@ static int dsc_compute_compressed_bpp(struct intel_dp > *intel_dp, > output_bpp = intel_dp_output_bpp(pipe_config->output_format, pipe_bpp); > max_bpp_x16 = min(max_bpp_x16, fxp_q4_from_int(output_bpp) - > bpp_step_x16); > > + drm_WARN_ON(display->drm, !is_power_of_2(bpp_step_x16)); > + min_bpp_x16 = round_up(limits->link.min_bpp_x16, bpp_step_x16); > + max_bpp_x16 = round_down(max_bpp_x16, bpp_step_x16); > + > for (bpp_x16 = max_bpp_x16; bpp_x16 >= min_bpp_x16; bpp_x16 -= > bpp_step_x16) { > if (!intel_dp_dsc_valid_compressed_bpp(intel_dp, bpp_x16)) > continue;
Reviewed-by: Luca Coelho <luciano.coe...@intel.com> -- Cheers, Luca.