Reviewed-by: Leo Li <[email protected]>
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 <[email protected]>
> Cc: Bhawanpreet Lakha <[email protected]>
> Cc: Leo Li <[email protected]>
> Signed-off-by: Nicholas Kazlauskas <[email protected]>
> ---
>  .../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);
>       }
> 
_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to