[PATCH 13/14] drm/amd/display: Recalculate VCPI slots for new DSC connectors

Lyude Paul lyude at redhat.com
Mon Oct 7 21:52:17 UTC 2019


Ok, let's stop and slow down for a minute here since I've repeated myself a
few times, and I'd like to figure out what's actually happening here and
whether I'm not being clear enough with my explanations, or if there's just
some misunderstanding here.

I'll start of by trying my best to explain my hesistance in accepting these
patches. To be clear, MST with DSC is a big thing in terms of impact. There's
a lot of things to consider:
 * What should the default DSC policy for MST be? Should we keep it on by
   default so that we don't need to trigger a large number of PBN
   recalculations and enable DSC on a per-case basis, or are there legitimate
   reasons to keep DSC off by default (such as potential issues with lossiness
   down the line).
 * We have other drivers in the tree that are planning on implementing MST DSC
   quite soon. Chances are they'll be implementing helpers to do this so this
   can be supported across the DRM tree, and chances are we'll just have to
   rewrite and remove most of this code in that case once they do.
 * amdgpu already has a _lot_ of code that doesn't need to, and shouldn't be
   there. This ranges from various DC specific helpers that are essentially
   the same as the helpers that we already implement in the rest of DRM, to
   misuses of various kernel APIs, and a complete lack of any kind of code
   style (at least the last time that I checked) in or out of DC. This makes
   the driver more difficult for people who don't work at AMD but are well
   accustomed to working on the rest of the kernel, e.g. myself and others,
   and it's a problem that seriously needs to be solved. Adding more redundant
   DP helpers that will inevitably get removed is just making the problem
   worse.

With all of this being said: I've been asking the same questions about this
patch throughout the whole patch series so far (since it got passed off to you
from David's internship ending):

 * Can we keep DSC enabled by default, so that these patches aren't needed?
 * If we can't, can we move this into common code so that other drivers can
   use it?
The problem is I haven't received any responses to these questions, other then
being told by David a month or two ago that it would be expedient to just
accept the patches and move on. Honestly, if discussion had been had about the
changes I requested, I would have given my r-b a long time ago. In fact-I
really want to give it now! There's multiple patches in this series that would
be very useful for other things that are being worked on at the moment, such
as the changes to drm_dp_dpcd_read/drm_dp_dpcd_write(). But I really think
this needs to be discussed first, and I'm worried that just going ahead and
giving my R-B before they have been discussed will further encourage rushing
changes like this in the future and continually building more tech debt for
ourselves.

Please note as well: if anything I've asked for is confusing, or you don't
understand what I'm asking or looking for I am more then willing to help
explain things and help out as best as I can. I understand that a lot of the
developers working on DRM at AMD may have more experience in Windows and Mac
land and as a result, trying to get used to the way that we do things in the
Linux kernel can be a confusing endeavor. I'm more then happy to help out with
this wherever I can, all you need to do is ask. Asking a few questions about
something you aren't sure you understand can save both of us a lot of time,
and avoid having to go through this many patch respins.

In the mean time, I'd be willing to look at what patches from this series that
have already been reviewed which could be pushed to drm-misc or friends in the
mean time to speed things up a bit.

On Tue, 2019-10-01 at 12:17 -0400, mikita.lipski at amd.com wrote:
> From: Mikita Lipski <mikita.lipski at amd.com>
> 
> Since for DSC MST connector's PBN is claculated differently
> due to compression, we have to recalculate both PBN and
> VCPI slots for that connector.
> 
> This patch proposes to use similair logic as in
> dm_encoder_helper_atomic_chek, but since we do not know which
> connectors will have DSC enabled we have to recalculate PBN only
> after that's determined, which is done in
> compute_mst_dsc_configs_for_state.
> 
> Cc: Jerry Zuo <Jerry.Zuo at amd.com>
> Cc: Harry Wentland <harry.wentland at amd.com>
> Cc: Lyude Paul <lyude at redhat.com>
> Signed-off-by: Mikita Lipski <mikita.lipski at amd.com>
> ---
>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 64 +++++++++++++++++--
>  .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c |  6 --
>  2 files changed, 59 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index 81e30918f9ec..7501ce2233ed 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -4569,6 +4569,27 @@ static void dm_encoder_helper_disable(struct
> drm_encoder *encoder)
>  
>  }
>  
> +static int convert_dc_color_depth_into_bpc (enum dc_color_depth
> display_color_depth)
> +{
> +	switch (display_color_depth) {
> +		case COLOR_DEPTH_666:
> +			return 6;
> +		case COLOR_DEPTH_888:
> +			return 8;
> +		case COLOR_DEPTH_101010:
> +			return 10;
> +		case COLOR_DEPTH_121212:
> +			return 12;
> +		case COLOR_DEPTH_141414:
> +			return 14;
> +		case COLOR_DEPTH_161616:
> +			return 16;
> +		default:
> +			break;
> +		}
> +	return 0;
> +}
> +
>  static int dm_encoder_helper_atomic_check(struct drm_encoder *encoder,
>  					  struct drm_crtc_state *crtc_state,
>  					  struct drm_connector_state
> *conn_state)
> @@ -4616,6 +4637,36 @@ const struct drm_encoder_helper_funcs
> amdgpu_dm_encoder_helper_funcs = {
>  	.atomic_check = dm_encoder_helper_atomic_check
>  };
>  
> +#ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
> +static int dm_update_mst_vcpi_slots_for_dsc(struct drm_atomic_state *state,
> +					    struct dc_state *dc_state)
> +{
> +	struct dc_stream_state *stream;
> +	struct amdgpu_dm_connector *aconnector;
> +	int i, clock = 0, bpp = 0;
> +
> +	for (i = 0; i < dc_state->stream_count; i++) {
> +		stream = dc_state->streams[i];
> +		aconnector = (struct amdgpu_dm_connector *)stream-
> >dm_stream_context;
> +
> +		if (stream && stream->timing.flags.DSC == 1) {
> +			bpp = convert_dc_color_depth_into_bpc(stream-
> >timing.display_color_depth)* 3;
> +			clock = stream->timing.pix_clk_100hz / 10;
> +
> +			aconnector->pbn = drm_dp_calc_pbn_mode(clock, bpp,
> true);
> +
> +			aconnector->vcpi_slots =
> drm_dp_atomic_find_vcpi_slots(state,
> +							  &aconnector-
> >mst_port->mst_mgr,
> +							  aconnector->port,
> +							  aconnector->pbn);
> +			if (aconnector->vcpi_slots < 0)
> +				return aconnector->vcpi_slots;
> +		}
> +	}
> +	return 0;
> +}
> +#endif
> +
>  static void dm_drm_plane_reset(struct drm_plane *plane)
>  {
>  	struct dm_plane_state *amdgpu_state = NULL;
> @@ -7629,11 +7680,6 @@ static int amdgpu_dm_atomic_check(struct drm_device
> *dev,
>  	if (ret)
>  		goto fail;
>  
> -	/* Perform validation of MST topology in the state*/
> -	ret = drm_dp_mst_atomic_check(state);
> -	if (ret)
> -		goto fail;
> -
>  	if (state->legacy_cursor_update) {
>  		/*
>  		 * This is a fast cursor update coming from the plane update
> @@ -7705,6 +7751,10 @@ static int amdgpu_dm_atomic_check(struct drm_device
> *dev,
>  #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
>  		if (!compute_mst_dsc_configs_for_state(dm_state->context))
>  			goto fail;
> +
> +		ret = dm_update_mst_vcpi_slots_for_dsc(state, dm_state-
> >context);
> +		if (ret)
> +			goto fail;
>  #endif
>  		if (dc_validate_global_state(dc, dm_state->context, false) !=
> DC_OK) {
>  			ret = -EINVAL;
> @@ -7734,6 +7784,10 @@ static int amdgpu_dm_atomic_check(struct drm_device
> *dev,
>  				dc_retain_state(old_dm_state->context);
>  		}
>  	}
> +	/* Perform validation of MST topology in the state*/
> +	ret = drm_dp_mst_atomic_check(state);
> +	if (ret)
> +		goto fail;
>  
>  	/* Store the overall update type for use later in atomic check. */
>  	for_each_new_crtc_in_state (state, crtc, new_crtc_state, i) {
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
> index bd694499e3de..3e44e2da2d0d 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
> @@ -201,12 +201,6 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
>  	mst_port = aconnector->port;
>  
>  	if (enable) {
> -
> -		/* Convert kilobits per second / 64 (for 64 timeslots) to pbn
> (54/64 megabytes per second) */
> -		pbn_per_timeslot = dc_link_bandwidth_kbps(
> -				stream->link, dc_link_get_link_cap(stream-
> >link)) / (8 * 1000 * 54);
> -		aconnector->vcpi_slots = DIV_ROUND_UP(aconnector->pbn,
> pbn_per_timeslot);
> -
>  		ret = drm_dp_mst_allocate_vcpi(mst_mgr, mst_port,
>  					       aconnector->pbn,
>  					       aconnector->vcpi_slots);
-- 
Cheers,
	Lyude Paul



More information about the amd-gfx mailing list