On Fri, 19 Jun 2026, Nemesa Garg <[email protected]> wrote: > Add intel_dp_dsc_max_delta_bppx16() to parse sink dsc max > delta bpp from dpcd when DP_DSC_MAX_BPP_DELTA_AVAILABILITY > is set. This helper decodes the delta range for both RGB/YCbCr444 > and YCbCr420 formats from DP_DSC_MAX_BPP_DELTA. > > With this addition, the flow becomes: > 1. First, check for a format-specific range and use it to calculate > max compressed bpp. > 2. If not, check for sink supported max compressed bpp and > use that > 3. If this is also not there go with mandatory > max range supported bpp. > > v2: Reorder the check flow for max_bpp. [Ankit] > v3: Put RGB and YCbCr444 mask assignment in the same line. [Ankit] > v4: Zero max_bpp for reserved RGB/YCbCr444 delta values. [sashiko] > > Signed-off-by: Nemesa Garg <[email protected]> > Reviewed-by: Ankit Nautiyal <[email protected]>
Acked-by: Jani Nikula <[email protected]> for merging via drm-misc-next > --- > drivers/gpu/drm/i915/display/intel_dp.c | 43 +++++++++++++++++++++++-- > 1 file changed, 41 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c > b/drivers/gpu/drm/i915/display/intel_dp.c > index 3569e61e7fee..28b887ee5cf1 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp.c > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > @@ -2184,17 +2184,56 @@ static int dsc_compute_link_config(struct intel_dp > *intel_dp, > return -EINVAL; > } > > +static u16 intel_dp_dsc_max_delta_bppx16(const struct intel_connector > *connector, > + enum intel_output_format output_format) > +{ > + const u8 *dsc_dpcd = connector->dp.dsc_dpcd; > + u8 max_bpp_delta_v1 = dsc_dpcd[DP_DSC_MAX_BPP_DELTA_VERSION_1 - > DP_DSC_SUPPORT]; > + int max_bpp; > + > + if (!(dsc_dpcd[DP_DSC_MAX_BITS_PER_PIXEL_HI - DP_DSC_SUPPORT] & > + DP_DSC_MAX_BPP_DELTA_AVAILABILITY)) > + return 0; > + > + switch (output_format) { > + case INTEL_OUTPUT_FORMAT_RGB: > + case INTEL_OUTPUT_FORMAT_YCBCR444: > + max_bpp = max_bpp_delta_v1 & > DP_DSC_RGB_YCbCr444_MAX_BPP_DELTA_MASK; > + if (max_bpp >= 1 && max_bpp <= 21) > + max_bpp = max_bpp + DP_DSC_BPP_DELTA_444 - 1; > + else > + max_bpp = 0; > + break; > + case INTEL_OUTPUT_FORMAT_YCBCR420: > + max_bpp = (max_bpp_delta_v1 & > DP_DSC_NATIVE_YCbCr420_MAX_BPP_DELTA_MASK) >> > + DP_DSC_BPP_DELTA_SHIFT_420; > + if (max_bpp >= 1 && max_bpp <= 7) > + max_bpp = max_bpp + DP_DSC_BPP_DELTA_420 - 1; > + break; > + default: > + MISSING_CASE(output_format); > + return 0; > + } > + > + return max_bpp << 4; > +} > + > static > u16 intel_dp_dsc_max_sink_compressed_bppx16(const struct intel_connector > *connector, > enum intel_output_format > output_format, > int bpc) > { > - u16 max_bppx16 = drm_edp_dsc_sink_output_bpp(connector->dp.dsc_dpcd); > + u16 max_bppx16 = intel_dp_dsc_max_delta_bppx16(connector, > output_format); > + > + if (max_bppx16) > + return max_bppx16; > + > + max_bppx16 = drm_edp_dsc_sink_output_bpp(connector->dp.dsc_dpcd); > > if (max_bppx16) > return max_bppx16; > /* > - * If support not given in DPCD 67h, 68h use the Maximum Allowed bit > rate > + * If support not given in DPCD 67h, 68h, 6Eh, 6Fh use the Maximum > Allowed bit rate > * values as given in spec Table 2-157 DP v2.0 > */ > switch (output_format) { -- Jani Nikula, Intel
