[PATCH] drm/amd/display: Calculate bpc based on max_requested_bpc

Li, Sun peng (Leo) Sunpeng.Li at amd.com
Wed Aug 21 18:18:48 UTC 2019


Reviewed-by: Leo Li <sunpeng.li at amd.com>
Thanks!

On 2019-08-21 12:57 p.m., Nicholas Kazlauskas wrote:
> [Why]
> The only place where state->max_bpc is updated on the connector is
> at the start of atomic check during drm_atomic_connector_check. It
> isn't updated when adding the connectors to the atomic state after
> the fact. It also doesn't necessarily reflect the right value when
> called in amdgpu during mode validation outside of atomic check.
> 
> This can cause the wrong bpc to be used even if the max_requested_bpc
> is the correct value.
> 
> [How]
> Don't rely on state->max_bpc reflecting the real bpc value and just
> do the min(...) based on display info bpc and max_requested_bpc.
> 
> Cc: David Francis <David.Francis at amd.com>
> Cc: Bhawanpreet Lakha <Bhawanpreet.Lakha at amd.com>
> Cc: Leo Li <sunpeng.li at amd.com>
> Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas at amd.com>
> ---
>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c    | 16 ++++++++++++++--
>  1 file changed, 14 insertions(+), 2 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 7cf8dbccce95..73ed7b6bd8d3 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -3216,13 +3216,25 @@ static enum dc_color_depth
>  convert_color_depth_from_display_info(const struct drm_connector *connector,
>  				      const struct drm_connector_state *state)
>  {
> -	uint32_t bpc = connector->display_info.bpc;
> +	uint8_t bpc = (uint8_t)connector->display_info.bpc;
> +
> +	/* Assume 8 bpc by default if no bpc is specified. */
> +	bpc = bpc ? bpc : 8;
>  
>  	if (!state)
>  		state = connector->state;
>  
>  	if (state) {
> -		bpc = state->max_bpc;
> +		/*
> +		 * Cap display bpc based on the user requested value.
> +		 *
> +		 * The value for state->max_bpc may not correctly updated
> +		 * depending on when the connector gets added to the state
> +		 * or if this was called outside of atomic check, so it
> +		 * can't be used directly.
> +		 */
> +		bpc = min(bpc, state->max_requested_bpc);
> +
>  		/* Round down to the nearest even number. */
>  		bpc = bpc - (bpc & 1);
>  	}
> 


More information about the amd-gfx mailing list