[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