diff mbox series

[02/17] drm/i915/dp: Track the pipe and link bpp limits separately

Message ID 20230817161456.3857111-3-imre.deak@intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915: Improve BW management on shared display links | expand

Commit Message

Imre Deak Aug. 17, 2023, 4:14 p.m. UTC
A follow-up patch will need to limit the output link bpp both in the
non-DSC and DSC configuration, so track the pipe and link bpp limits
separately in the link_config_limits struct.

Use .4 fixed point format for link bpp matching the 1/16 bpp granularity
in DSC mode and for now keep this limit matching the pipe bpp limit.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c     | 17 +++++++++++------
 drivers/gpu/drm/i915/display/intel_dp.h     |  9 ++++++++-
 drivers/gpu/drm/i915/display/intel_dp_mst.c | 17 +++++++++++------
 3 files changed, 30 insertions(+), 13 deletions(-)

Comments

Jani Nikula Aug. 17, 2023, 4:27 p.m. UTC | #1
On Thu, 17 Aug 2023, Imre Deak <imre.deak@intel.com> wrote:
> A follow-up patch will need to limit the output link bpp both in the
> non-DSC and DSC configuration, so track the pipe and link bpp limits
> separately in the link_config_limits struct.
>
> Use .4 fixed point format for link bpp matching the 1/16 bpp granularity
> in DSC mode and for now keep this limit matching the pipe bpp limit.
>
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c     | 17 +++++++++++------
>  drivers/gpu/drm/i915/display/intel_dp.h     |  9 ++++++++-
>  drivers/gpu/drm/i915/display/intel_dp_mst.c | 17 +++++++++++------
>  3 files changed, 30 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 89de444cfc4da..f4952fcfb16e9 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -1419,7 +1419,7 @@ intel_dp_adjust_compliance_config(struct intel_dp *intel_dp,
>  	if (intel_dp->compliance.test_data.bpc != 0) {
>  		int bpp = 3 * intel_dp->compliance.test_data.bpc;
>  
> -		limits->min_bpp = limits->max_bpp = bpp;
> +		limits->pipe.min_bpp = limits->pipe.max_bpp = bpp;
>  		pipe_config->dither_force_disable = bpp == 6 * 3;
>  
>  		drm_dbg_kms(&i915->drm, "Setting pipe_bpp to %d\n", bpp);
> @@ -1481,7 +1481,9 @@ intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
>  	int bpp, i, lane_count, clock = intel_dp_mode_clock(pipe_config, conn_state);
>  	int mode_rate, link_rate, link_avail;
>  
> -	for (bpp = limits->max_bpp; bpp >= limits->min_bpp; bpp -= 2 * 3) {
> +	for (bpp = limits->link.max_bpp >> 4;
> +	     bpp >= limits->link.min_bpp >> 4;

I think I'd like to see some helpers for the >> 4 and << 4, to make this
self-documenting code.

to_bpp_int(), to_bpp_x16(), or something along those lines maybe.

With proper variable/member naming, you'd get:

	bpp = to_bpp_int(bpp_x16);
        bpp_x16 = to_bpp_x16(bpp);

And it would be obvious what's going on.

> +	     bpp -= 2 * 3) {
>  		int output_bpp = intel_dp_output_bpp(pipe_config->output_format, bpp);
>  
>  		mode_rate = intel_dp_link_required(clock, output_bpp);
> @@ -1812,9 +1814,9 @@ intel_dp_compute_config_limits(struct intel_dp *intel_dp,
>  	limits->min_lane_count = 1;
>  	limits->max_lane_count = intel_dp_max_lane_count(intel_dp);
>  
> -	limits->min_bpp = intel_dp_min_bpp(crtc_state->output_format);
> -	limits->max_bpp = intel_dp_max_bpp(intel_dp, crtc_state,
> -					   respect_downstream_limits);
> +	limits->pipe.min_bpp = intel_dp_min_bpp(crtc_state->output_format);
> +	limits->pipe.max_bpp = intel_dp_max_bpp(intel_dp, crtc_state,
> +						     respect_downstream_limits);
>  
>  	if (intel_dp->use_max_params) {
>  		/*
> @@ -1831,10 +1833,13 @@ intel_dp_compute_config_limits(struct intel_dp *intel_dp,
>  
>  	intel_dp_adjust_compliance_config(intel_dp, crtc_state, limits);
>  
> +	limits->link.min_bpp = limits->pipe.min_bpp << 4;
> +	limits->link.max_bpp = limits->pipe.max_bpp << 4;
> +
>  	drm_dbg_kms(&i915->drm, "DP link computation with max lane count %i "
>  		    "max rate %d max bpp %d pixel clock %iKHz\n",
>  		    limits->max_lane_count, limits->max_rate,
> -		    limits->max_bpp, adjusted_mode->crtc_clock);
> +		    limits->link.max_bpp >> 4, adjusted_mode->crtc_clock);
>  }
>  
>  static int
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
> index 22099de3ca458..a1789419c0d19 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp.h
> @@ -26,7 +26,14 @@ struct intel_encoder;
>  struct link_config_limits {
>  	int min_rate, max_rate;
>  	int min_lane_count, max_lane_count;
> -	int min_bpp, max_bpp;
> +	struct {
> +		/* Uncompressed DSC input or link output bpp in 1 bpp units */
> +		int min_bpp, max_bpp;
> +	} pipe;
> +	struct {
> +		/* Compressed or uncompressed link output bpp in 1/16 bpp units */
> +		int min_bpp, max_bpp;

The 1/16 bpp units is a source of confusion, and I think we should start
denoting them in naming.

min_bpp_x16, max_bpp_x16

> +	} link;
>  };
>  
>  void intel_edp_fixup_vbt_bpp(struct intel_encoder *encoder, int pipe_bpp);
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index 998d8a186cc6f..1809643538d08 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -156,8 +156,10 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
>  		&crtc_state->hw.adjusted_mode;
>  	int slots = -EINVAL;
>  
> -	slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state, limits->max_bpp,
> -						     limits->min_bpp, limits,
> +	slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state,
> +						     limits->link.max_bpp >> 4,
> +						     limits->link.min_bpp >> 4,
> +						     limits,
>  						     conn_state, 2 * 3, false);
>  
>  	if (slots < 0)
> @@ -200,8 +202,8 @@ static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
>  	else
>  		dsc_max_bpc = min_t(u8, 10, conn_state->max_requested_bpc);
>  
> -	max_bpp = min_t(u8, dsc_max_bpc * 3, limits->max_bpp);
> -	min_bpp = limits->min_bpp;
> +	max_bpp = min_t(u8, dsc_max_bpc * 3, limits->pipe.max_bpp);
> +	min_bpp = limits->pipe.min_bpp;
>  
>  	num_bpc = drm_dp_dsc_sink_supported_input_bpcs(intel_dp->dsc_dpcd,
>  						       dsc_bpc);
> @@ -318,7 +320,7 @@ intel_dp_mst_compute_config_limits(struct intel_dp *intel_dp,
>  	limits->min_lane_count = limits->max_lane_count =
>  		intel_dp_max_lane_count(intel_dp);
>  
> -	limits->min_bpp = intel_dp_min_bpp(crtc_state->output_format);
> +	limits->pipe.min_bpp = intel_dp_min_bpp(crtc_state->output_format);
>  	/*
>  	 * FIXME: If all the streams can't fit into the link with
>  	 * their current pipe_bpp we should reduce pipe_bpp across
> @@ -327,9 +329,12 @@ intel_dp_mst_compute_config_limits(struct intel_dp *intel_dp,
>  	 * MST streams previously. This hack should be removed once
>  	 * we have the proper retry logic in place.
>  	 */
> -	limits->max_bpp = min(crtc_state->pipe_bpp, 24);
> +	limits->pipe.max_bpp = min(crtc_state->pipe_bpp, 24);
>  
>  	intel_dp_adjust_compliance_config(intel_dp, crtc_state, limits);
> +
> +	limits->link.min_bpp = limits->pipe.min_bpp << 4;
> +	limits->link.max_bpp = limits->pipe.max_bpp << 4;
>  }
>  
>  static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
Suraj Kandpal Aug. 18, 2023, 8:24 a.m. UTC | #2
> 
> On Thu, 17 Aug 2023, Imre Deak <imre.deak@intel.com> wrote:
> > A follow-up patch will need to limit the output link bpp both in the
> > non-DSC and DSC configuration, so track the pipe and link bpp limits
> > separately in the link_config_limits struct.
> >
> > Use .4 fixed point format for link bpp matching the 1/16 bpp
> > granularity in DSC mode and for now keep this limit matching the pipe bpp
> limit.
> >
> > Signed-off-by: Imre Deak <imre.deak@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_dp.c     | 17 +++++++++++------
> >  drivers/gpu/drm/i915/display/intel_dp.h     |  9 ++++++++-
> >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 17 +++++++++++------
> >  3 files changed, 30 insertions(+), 13 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> > b/drivers/gpu/drm/i915/display/intel_dp.c
> > index 89de444cfc4da..f4952fcfb16e9 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > @@ -1419,7 +1419,7 @@ intel_dp_adjust_compliance_config(struct
> intel_dp *intel_dp,
> >  	if (intel_dp->compliance.test_data.bpc != 0) {
> >  		int bpp = 3 * intel_dp->compliance.test_data.bpc;
> >
> > -		limits->min_bpp = limits->max_bpp = bpp;
> > +		limits->pipe.min_bpp = limits->pipe.max_bpp = bpp;
> >  		pipe_config->dither_force_disable = bpp == 6 * 3;
> >
> >  		drm_dbg_kms(&i915->drm, "Setting pipe_bpp to %d\n",
> bpp); @@
> > -1481,7 +1481,9 @@ intel_dp_compute_link_config_wide(struct intel_dp
> *intel_dp,
> >  	int bpp, i, lane_count, clock = intel_dp_mode_clock(pipe_config,
> conn_state);
> >  	int mode_rate, link_rate, link_avail;
> >
> > -	for (bpp = limits->max_bpp; bpp >= limits->min_bpp; bpp -= 2 * 3) {
> > +	for (bpp = limits->link.max_bpp >> 4;
> > +	     bpp >= limits->link.min_bpp >> 4;
> 
> I think I'd like to see some helpers for the >> 4 and << 4, to make this self-
> documenting code.
> 
> to_bpp_int(), to_bpp_x16(), or something along those lines maybe.
> 
> With proper variable/member naming, you'd get:
> 
> 	bpp = to_bpp_int(bpp_x16);
>         bpp_x16 = to_bpp_x16(bpp);
> 
> And it would be obvious what's going on.
> 
> > +	     bpp -= 2 * 3) {
> >  		int output_bpp = intel_dp_output_bpp(pipe_config-
> >output_format,
> > bpp);
> >
> >  		mode_rate = intel_dp_link_required(clock, output_bpp); @@
> -1812,9
> > +1814,9 @@ intel_dp_compute_config_limits(struct intel_dp *intel_dp,
> >  	limits->min_lane_count = 1;
> >  	limits->max_lane_count = intel_dp_max_lane_count(intel_dp);
> >
> > -	limits->min_bpp = intel_dp_min_bpp(crtc_state->output_format);
> > -	limits->max_bpp = intel_dp_max_bpp(intel_dp, crtc_state,
> > -					   respect_downstream_limits);
> > +	limits->pipe.min_bpp = intel_dp_min_bpp(crtc_state-
> >output_format);
> > +	limits->pipe.max_bpp = intel_dp_max_bpp(intel_dp, crtc_state,
> > +
> respect_downstream_limits);
> >
> >  	if (intel_dp->use_max_params) {
> >  		/*
> > @@ -1831,10 +1833,13 @@ intel_dp_compute_config_limits(struct
> intel_dp
> > *intel_dp,
> >
> >  	intel_dp_adjust_compliance_config(intel_dp, crtc_state, limits);
> >
> > +	limits->link.min_bpp = limits->pipe.min_bpp << 4;
> > +	limits->link.max_bpp = limits->pipe.max_bpp << 4;
> > +
> >  	drm_dbg_kms(&i915->drm, "DP link computation with max lane
> count %i "
> >  		    "max rate %d max bpp %d pixel clock %iKHz\n",
> >  		    limits->max_lane_count, limits->max_rate,
> > -		    limits->max_bpp, adjusted_mode->crtc_clock);
> > +		    limits->link.max_bpp >> 4, adjusted_mode->crtc_clock);
> >  }
> >
> >  static int
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.h
> > b/drivers/gpu/drm/i915/display/intel_dp.h
> > index 22099de3ca458..a1789419c0d19 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.h
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.h
> > @@ -26,7 +26,14 @@ struct intel_encoder;  struct link_config_limits {
> >  	int min_rate, max_rate;
> >  	int min_lane_count, max_lane_count;
> > -	int min_bpp, max_bpp;
> > +	struct {
> > +		/* Uncompressed DSC input or link output bpp in 1 bpp units
> */
> > +		int min_bpp, max_bpp;
> > +	} pipe;
> > +	struct {
> > +		/* Compressed or uncompressed link output bpp in 1/16 bpp
> units */
> > +		int min_bpp, max_bpp;
> 
> The 1/16 bpp units is a source of confusion, and I think we should start
> denoting them in naming.
> 
> min_bpp_x16, max_bpp_x16
> 
> > +	} link;
> >  };

Also a small question here do we need to track both pipe and link bpp separately
When we can have the helper mentioned above maybe we can call it
pipe_to_link_bpp
Also if it is really required to track link bpp for dsc and non dsc scenario won't it be
Better to have link_dsc and link_non_dsc structs rather than pipe and link since both
are bpp for link with dsc enablement differentiation.

Regards,
Suraj Kandpal


> >
> >  void intel_edp_fixup_vbt_bpp(struct intel_encoder *encoder, int
> > pipe_bpp); diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > index 998d8a186cc6f..1809643538d08 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > @@ -156,8 +156,10 @@ static int
> intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
> >  		&crtc_state->hw.adjusted_mode;
> >  	int slots = -EINVAL;
> >
> > -	slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state,
> limits->max_bpp,
> > -						     limits->min_bpp, limits,
> > +	slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state,
> > +						     limits->link.max_bpp >> 4,
> > +						     limits->link.min_bpp >> 4,
> > +						     limits,
> >  						     conn_state, 2 * 3, false);
> >
> >  	if (slots < 0)
> > @@ -200,8 +202,8 @@ static int
> intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
> >  	else
> >  		dsc_max_bpc = min_t(u8, 10, conn_state-
> >max_requested_bpc);
> >
> > -	max_bpp = min_t(u8, dsc_max_bpc * 3, limits->max_bpp);
> > -	min_bpp = limits->min_bpp;
> > +	max_bpp = min_t(u8, dsc_max_bpc * 3, limits->pipe.max_bpp);
> > +	min_bpp = limits->pipe.min_bpp;
> >
> >  	num_bpc = drm_dp_dsc_sink_supported_input_bpcs(intel_dp-
> >dsc_dpcd,
> >  						       dsc_bpc);
> > @@ -318,7 +320,7 @@ intel_dp_mst_compute_config_limits(struct
> intel_dp *intel_dp,
> >  	limits->min_lane_count = limits->max_lane_count =
> >  		intel_dp_max_lane_count(intel_dp);
> >
> > -	limits->min_bpp = intel_dp_min_bpp(crtc_state->output_format);
> > +	limits->pipe.min_bpp = intel_dp_min_bpp(crtc_state-
> >output_format);
> >  	/*
> >  	 * FIXME: If all the streams can't fit into the link with
> >  	 * their current pipe_bpp we should reduce pipe_bpp across @@ -
> 327,9
> > +329,12 @@ intel_dp_mst_compute_config_limits(struct intel_dp
> *intel_dp,
> >  	 * MST streams previously. This hack should be removed once
> >  	 * we have the proper retry logic in place.
> >  	 */
> > -	limits->max_bpp = min(crtc_state->pipe_bpp, 24);
> > +	limits->pipe.max_bpp = min(crtc_state->pipe_bpp, 24);
> >
> >  	intel_dp_adjust_compliance_config(intel_dp, crtc_state, limits);
> > +
> > +	limits->link.min_bpp = limits->pipe.min_bpp << 4;
> > +	limits->link.max_bpp = limits->pipe.max_bpp << 4;
> >  }
> >
> >  static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
> 
> --
> Jani Nikula, Intel Open Source Graphics Center
Imre Deak Aug. 18, 2023, 1:26 p.m. UTC | #3
On Thu, Aug 17, 2023 at 07:27:24PM +0300, Jani Nikula wrote:
> On Thu, 17 Aug 2023, Imre Deak <imre.deak@intel.com> wrote:
> > A follow-up patch will need to limit the output link bpp both in the
> > non-DSC and DSC configuration, so track the pipe and link bpp limits
> > separately in the link_config_limits struct.
> >
> > Use .4 fixed point format for link bpp matching the 1/16 bpp granularity
> > in DSC mode and for now keep this limit matching the pipe bpp limit.
> >
> > Signed-off-by: Imre Deak <imre.deak@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_dp.c     | 17 +++++++++++------
> >  drivers/gpu/drm/i915/display/intel_dp.h     |  9 ++++++++-
> >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 17 +++++++++++------
> >  3 files changed, 30 insertions(+), 13 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> > index 89de444cfc4da..f4952fcfb16e9 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > @@ -1419,7 +1419,7 @@ intel_dp_adjust_compliance_config(struct intel_dp *intel_dp,
> >  	if (intel_dp->compliance.test_data.bpc != 0) {
> >  		int bpp = 3 * intel_dp->compliance.test_data.bpc;
> >  
> > -		limits->min_bpp = limits->max_bpp = bpp;
> > +		limits->pipe.min_bpp = limits->pipe.max_bpp = bpp;
> >  		pipe_config->dither_force_disable = bpp == 6 * 3;
> >  
> >  		drm_dbg_kms(&i915->drm, "Setting pipe_bpp to %d\n", bpp);
> > @@ -1481,7 +1481,9 @@ intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
> >  	int bpp, i, lane_count, clock = intel_dp_mode_clock(pipe_config, conn_state);
> >  	int mode_rate, link_rate, link_avail;
> >  
> > -	for (bpp = limits->max_bpp; bpp >= limits->min_bpp; bpp -= 2 * 3) {
> > +	for (bpp = limits->link.max_bpp >> 4;
> > +	     bpp >= limits->link.min_bpp >> 4;
> 
> I think I'd like to see some helpers for the >> 4 and << 4, to make this
> self-documenting code.

I wondered about more generic fixed point helpers, but didn't find any.

> to_bpp_int(), to_bpp_x16(), or something along those lines maybe.
> 
> With proper variable/member naming, you'd get:
> 
> 	bpp = to_bpp_int(bpp_x16);
>         bpp_x16 = to_bpp_x16(bpp);
> 
> And it would be obvious what's going on.

Yes, makes sense, will add these.

> 
> > +	     bpp -= 2 * 3) {
> >  		int output_bpp = intel_dp_output_bpp(pipe_config->output_format, bpp);
> >  
> >  		mode_rate = intel_dp_link_required(clock, output_bpp);
> > @@ -1812,9 +1814,9 @@ intel_dp_compute_config_limits(struct intel_dp *intel_dp,
> >  	limits->min_lane_count = 1;
> >  	limits->max_lane_count = intel_dp_max_lane_count(intel_dp);
> >  
> > -	limits->min_bpp = intel_dp_min_bpp(crtc_state->output_format);
> > -	limits->max_bpp = intel_dp_max_bpp(intel_dp, crtc_state,
> > -					   respect_downstream_limits);
> > +	limits->pipe.min_bpp = intel_dp_min_bpp(crtc_state->output_format);
> > +	limits->pipe.max_bpp = intel_dp_max_bpp(intel_dp, crtc_state,
> > +						     respect_downstream_limits);
> >  
> >  	if (intel_dp->use_max_params) {
> >  		/*
> > @@ -1831,10 +1833,13 @@ intel_dp_compute_config_limits(struct intel_dp *intel_dp,
> >  
> >  	intel_dp_adjust_compliance_config(intel_dp, crtc_state, limits);
> >  
> > +	limits->link.min_bpp = limits->pipe.min_bpp << 4;
> > +	limits->link.max_bpp = limits->pipe.max_bpp << 4;
> > +
> >  	drm_dbg_kms(&i915->drm, "DP link computation with max lane count %i "
> >  		    "max rate %d max bpp %d pixel clock %iKHz\n",
> >  		    limits->max_lane_count, limits->max_rate,
> > -		    limits->max_bpp, adjusted_mode->crtc_clock);
> > +		    limits->link.max_bpp >> 4, adjusted_mode->crtc_clock);
> >  }
> >  
> >  static int
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
> > index 22099de3ca458..a1789419c0d19 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.h
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.h
> > @@ -26,7 +26,14 @@ struct intel_encoder;
> >  struct link_config_limits {
> >  	int min_rate, max_rate;
> >  	int min_lane_count, max_lane_count;
> > -	int min_bpp, max_bpp;
> > +	struct {
> > +		/* Uncompressed DSC input or link output bpp in 1 bpp units */
> > +		int min_bpp, max_bpp;
> > +	} pipe;
> > +	struct {
> > +		/* Compressed or uncompressed link output bpp in 1/16 bpp units */
> > +		int min_bpp, max_bpp;
> 
> The 1/16 bpp units is a source of confusion, and I think we should start
> denoting them in naming.
> 
> min_bpp_x16, max_bpp_x16

Ok, will change these.

> 
> > +	} link;
> >  };
> >  
> >  void intel_edp_fixup_vbt_bpp(struct intel_encoder *encoder, int pipe_bpp);
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > index 998d8a186cc6f..1809643538d08 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > @@ -156,8 +156,10 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
> >  		&crtc_state->hw.adjusted_mode;
> >  	int slots = -EINVAL;
> >  
> > -	slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state, limits->max_bpp,
> > -						     limits->min_bpp, limits,
> > +	slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state,
> > +						     limits->link.max_bpp >> 4,
> > +						     limits->link.min_bpp >> 4,
> > +						     limits,
> >  						     conn_state, 2 * 3, false);
> >  
> >  	if (slots < 0)
> > @@ -200,8 +202,8 @@ static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
> >  	else
> >  		dsc_max_bpc = min_t(u8, 10, conn_state->max_requested_bpc);
> >  
> > -	max_bpp = min_t(u8, dsc_max_bpc * 3, limits->max_bpp);
> > -	min_bpp = limits->min_bpp;
> > +	max_bpp = min_t(u8, dsc_max_bpc * 3, limits->pipe.max_bpp);
> > +	min_bpp = limits->pipe.min_bpp;
> >  
> >  	num_bpc = drm_dp_dsc_sink_supported_input_bpcs(intel_dp->dsc_dpcd,
> >  						       dsc_bpc);
> > @@ -318,7 +320,7 @@ intel_dp_mst_compute_config_limits(struct intel_dp *intel_dp,
> >  	limits->min_lane_count = limits->max_lane_count =
> >  		intel_dp_max_lane_count(intel_dp);
> >  
> > -	limits->min_bpp = intel_dp_min_bpp(crtc_state->output_format);
> > +	limits->pipe.min_bpp = intel_dp_min_bpp(crtc_state->output_format);
> >  	/*
> >  	 * FIXME: If all the streams can't fit into the link with
> >  	 * their current pipe_bpp we should reduce pipe_bpp across
> > @@ -327,9 +329,12 @@ intel_dp_mst_compute_config_limits(struct intel_dp *intel_dp,
> >  	 * MST streams previously. This hack should be removed once
> >  	 * we have the proper retry logic in place.
> >  	 */
> > -	limits->max_bpp = min(crtc_state->pipe_bpp, 24);
> > +	limits->pipe.max_bpp = min(crtc_state->pipe_bpp, 24);
> >  
> >  	intel_dp_adjust_compliance_config(intel_dp, crtc_state, limits);
> > +
> > +	limits->link.min_bpp = limits->pipe.min_bpp << 4;
> > +	limits->link.max_bpp = limits->pipe.max_bpp << 4;
> >  }
> >  
> >  static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
> 
> -- 
> Jani Nikula, Intel Open Source Graphics Center
Imre Deak Aug. 18, 2023, 2:06 p.m. UTC | #4
On Fri, Aug 18, 2023 at 11:24:26AM +0300, Kandpal, Suraj wrote:
> [...]
> > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.h
> > > b/drivers/gpu/drm/i915/display/intel_dp.h
> > > index 22099de3ca458..a1789419c0d19 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_dp.h
> > > +++ b/drivers/gpu/drm/i915/display/intel_dp.h
> > > @@ -26,7 +26,14 @@ struct intel_encoder;  struct link_config_limits {
> > >     int min_rate, max_rate;
> > >     int min_lane_count, max_lane_count;
> > > -   int min_bpp, max_bpp;
> > > +   struct {
> > > +           /* Uncompressed DSC input or link output bpp in 1 bpp units */
> > > +           int min_bpp, max_bpp;
> > > +   } pipe;
> > > +   struct {
> > > +           /* Compressed or uncompressed link output bpp in 1/16 bpp units */
> > > +           int min_bpp, max_bpp;
> >
> > The 1/16 bpp units is a source of confusion, and I think we should start
> > denoting them in naming.
> >
> > min_bpp_x16, max_bpp_x16
> >
> > > +   } link;
> > >  };
> 
> Also a small question here do we need to track both pipe and link bpp
> separately When we can have the helper mentioned above maybe we can
> call it pipe_to_link_bpp
>
> Also if it is really required to track link bpp for dsc and non dsc
> scenario won't it be Better to have link_dsc and link_non_dsc structs
> rather than pipe and link since both are bpp for link with dsc
> enablement differentiation.

They are separate things, which can be set independently within their
own valid range. pipe bpp is about the format pixels are handled by the
display engine (pipe) internally, while link bpp is about the format of
pixels on the link.

For instance for DSC a given link bpp (which is limited by the BW on the
link) could be used with different pipe bpp settings (limited by other
platform specific constraints).

> 
> Regards,
> Suraj Kandpal
> 
> 
> > >
> > >  void intel_edp_fixup_vbt_bpp(struct intel_encoder *encoder, int
> > > pipe_bpp); diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > index 998d8a186cc6f..1809643538d08 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > @@ -156,8 +156,10 @@ static int
> > intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
> > >             &crtc_state->hw.adjusted_mode;
> > >     int slots = -EINVAL;
> > >
> > > -   slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state,
> > limits->max_bpp,
> > > -                                                limits->min_bpp, limits,
> > > +   slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state,
> > > +                                                limits->link.max_bpp >> 4,
> > > +                                                limits->link.min_bpp >> 4,
> > > +                                                limits,
> > >                                                  conn_state, 2 * 3, false);
> > >
> > >     if (slots < 0)
> > > @@ -200,8 +202,8 @@ static int
> > intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
> > >     else
> > >             dsc_max_bpc = min_t(u8, 10, conn_state-
> > >max_requested_bpc);
> > >
> > > -   max_bpp = min_t(u8, dsc_max_bpc * 3, limits->max_bpp);
> > > -   min_bpp = limits->min_bpp;
> > > +   max_bpp = min_t(u8, dsc_max_bpc * 3, limits->pipe.max_bpp);
> > > +   min_bpp = limits->pipe.min_bpp;
> > >
> > >     num_bpc = drm_dp_dsc_sink_supported_input_bpcs(intel_dp-
> > >dsc_dpcd,
> > >                                                    dsc_bpc);
> > > @@ -318,7 +320,7 @@ intel_dp_mst_compute_config_limits(struct
> > intel_dp *intel_dp,
> > >     limits->min_lane_count = limits->max_lane_count =
> > >             intel_dp_max_lane_count(intel_dp);
> > >
> > > -   limits->min_bpp = intel_dp_min_bpp(crtc_state->output_format);
> > > +   limits->pipe.min_bpp = intel_dp_min_bpp(crtc_state-
> > >output_format);
> > >     /*
> > >      * FIXME: If all the streams can't fit into the link with
> > >      * their current pipe_bpp we should reduce pipe_bpp across @@ -
> > 327,9
> > > +329,12 @@ intel_dp_mst_compute_config_limits(struct intel_dp
> > *intel_dp,
> > >      * MST streams previously. This hack should be removed once
> > >      * we have the proper retry logic in place.
> > >      */
> > > -   limits->max_bpp = min(crtc_state->pipe_bpp, 24);
> > > +   limits->pipe.max_bpp = min(crtc_state->pipe_bpp, 24);
> > >
> > >     intel_dp_adjust_compliance_config(intel_dp, crtc_state, limits);
> > > +
> > > +   limits->link.min_bpp = limits->pipe.min_bpp << 4;
> > > +   limits->link.max_bpp = limits->pipe.max_bpp << 4;
> > >  }
> > >
> > >  static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
> >
> > --
> > Jani Nikula, Intel Open Source Graphics Center
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 89de444cfc4da..f4952fcfb16e9 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1419,7 +1419,7 @@  intel_dp_adjust_compliance_config(struct intel_dp *intel_dp,
 	if (intel_dp->compliance.test_data.bpc != 0) {
 		int bpp = 3 * intel_dp->compliance.test_data.bpc;
 
-		limits->min_bpp = limits->max_bpp = bpp;
+		limits->pipe.min_bpp = limits->pipe.max_bpp = bpp;
 		pipe_config->dither_force_disable = bpp == 6 * 3;
 
 		drm_dbg_kms(&i915->drm, "Setting pipe_bpp to %d\n", bpp);
@@ -1481,7 +1481,9 @@  intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
 	int bpp, i, lane_count, clock = intel_dp_mode_clock(pipe_config, conn_state);
 	int mode_rate, link_rate, link_avail;
 
-	for (bpp = limits->max_bpp; bpp >= limits->min_bpp; bpp -= 2 * 3) {
+	for (bpp = limits->link.max_bpp >> 4;
+	     bpp >= limits->link.min_bpp >> 4;
+	     bpp -= 2 * 3) {
 		int output_bpp = intel_dp_output_bpp(pipe_config->output_format, bpp);
 
 		mode_rate = intel_dp_link_required(clock, output_bpp);
@@ -1812,9 +1814,9 @@  intel_dp_compute_config_limits(struct intel_dp *intel_dp,
 	limits->min_lane_count = 1;
 	limits->max_lane_count = intel_dp_max_lane_count(intel_dp);
 
-	limits->min_bpp = intel_dp_min_bpp(crtc_state->output_format);
-	limits->max_bpp = intel_dp_max_bpp(intel_dp, crtc_state,
-					   respect_downstream_limits);
+	limits->pipe.min_bpp = intel_dp_min_bpp(crtc_state->output_format);
+	limits->pipe.max_bpp = intel_dp_max_bpp(intel_dp, crtc_state,
+						     respect_downstream_limits);
 
 	if (intel_dp->use_max_params) {
 		/*
@@ -1831,10 +1833,13 @@  intel_dp_compute_config_limits(struct intel_dp *intel_dp,
 
 	intel_dp_adjust_compliance_config(intel_dp, crtc_state, limits);
 
+	limits->link.min_bpp = limits->pipe.min_bpp << 4;
+	limits->link.max_bpp = limits->pipe.max_bpp << 4;
+
 	drm_dbg_kms(&i915->drm, "DP link computation with max lane count %i "
 		    "max rate %d max bpp %d pixel clock %iKHz\n",
 		    limits->max_lane_count, limits->max_rate,
-		    limits->max_bpp, adjusted_mode->crtc_clock);
+		    limits->link.max_bpp >> 4, adjusted_mode->crtc_clock);
 }
 
 static int
diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
index 22099de3ca458..a1789419c0d19 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.h
+++ b/drivers/gpu/drm/i915/display/intel_dp.h
@@ -26,7 +26,14 @@  struct intel_encoder;
 struct link_config_limits {
 	int min_rate, max_rate;
 	int min_lane_count, max_lane_count;
-	int min_bpp, max_bpp;
+	struct {
+		/* Uncompressed DSC input or link output bpp in 1 bpp units */
+		int min_bpp, max_bpp;
+	} pipe;
+	struct {
+		/* Compressed or uncompressed link output bpp in 1/16 bpp units */
+		int min_bpp, max_bpp;
+	} link;
 };
 
 void intel_edp_fixup_vbt_bpp(struct intel_encoder *encoder, int pipe_bpp);
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 998d8a186cc6f..1809643538d08 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -156,8 +156,10 @@  static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
 		&crtc_state->hw.adjusted_mode;
 	int slots = -EINVAL;
 
-	slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state, limits->max_bpp,
-						     limits->min_bpp, limits,
+	slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state,
+						     limits->link.max_bpp >> 4,
+						     limits->link.min_bpp >> 4,
+						     limits,
 						     conn_state, 2 * 3, false);
 
 	if (slots < 0)
@@ -200,8 +202,8 @@  static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
 	else
 		dsc_max_bpc = min_t(u8, 10, conn_state->max_requested_bpc);
 
-	max_bpp = min_t(u8, dsc_max_bpc * 3, limits->max_bpp);
-	min_bpp = limits->min_bpp;
+	max_bpp = min_t(u8, dsc_max_bpc * 3, limits->pipe.max_bpp);
+	min_bpp = limits->pipe.min_bpp;
 
 	num_bpc = drm_dp_dsc_sink_supported_input_bpcs(intel_dp->dsc_dpcd,
 						       dsc_bpc);
@@ -318,7 +320,7 @@  intel_dp_mst_compute_config_limits(struct intel_dp *intel_dp,
 	limits->min_lane_count = limits->max_lane_count =
 		intel_dp_max_lane_count(intel_dp);
 
-	limits->min_bpp = intel_dp_min_bpp(crtc_state->output_format);
+	limits->pipe.min_bpp = intel_dp_min_bpp(crtc_state->output_format);
 	/*
 	 * FIXME: If all the streams can't fit into the link with
 	 * their current pipe_bpp we should reduce pipe_bpp across
@@ -327,9 +329,12 @@  intel_dp_mst_compute_config_limits(struct intel_dp *intel_dp,
 	 * MST streams previously. This hack should be removed once
 	 * we have the proper retry logic in place.
 	 */
-	limits->max_bpp = min(crtc_state->pipe_bpp, 24);
+	limits->pipe.max_bpp = min(crtc_state->pipe_bpp, 24);
 
 	intel_dp_adjust_compliance_config(intel_dp, crtc_state, limits);
+
+	limits->link.min_bpp = limits->pipe.min_bpp << 4;
+	limits->link.max_bpp = limits->pipe.max_bpp << 4;
 }
 
 static int intel_dp_mst_compute_config(struct intel_encoder *encoder,