Commit 8d8a6af7 authored by Samson Tam's avatar Samson Tam Committed by Alex Deucher

drm/amd/display: Fix stereo with DCC enabled

[Why]
When sending DCC with Stereo, DCC gets enabled but the meta addresses
are 0. This happens momentarily before the meta addresses are populated
with a valid address.

[How]
Add call validate_dcc_with_meta_address() in
copy_surface_update_to_plane() to check for surface address and DCC
change.
When DCC has changed, check if DCC enable is true but meta address is 0.
If so, we turn DCC enable to false. When surface address has changed, we
check if DCC enable is false but meta address is not 0. If so, we turn
DCC enable back to true.  This will restore DCC enable to the proper
setting once the meta address is valid.
Signed-off-by: default avatarSamson Tam <Samson.Tam@amd.com>
Reviewed-by: default avatarJun Lei <Jun.Lei@amd.com>
Acked-by: default avatarRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 7b23b0b4
...@@ -1747,12 +1747,37 @@ static struct dc_stream_status *stream_get_status( ...@@ -1747,12 +1747,37 @@ static struct dc_stream_status *stream_get_status(
static const enum surface_update_type update_surface_trace_level = UPDATE_TYPE_FULL; static const enum surface_update_type update_surface_trace_level = UPDATE_TYPE_FULL;
static void validate_dcc_with_meta_address(
struct dc_plane_dcc_param *dcc,
struct dc_plane_address *address)
{
if ((address->grph.meta_addr.quad_part == 0) &&
dcc->enable) {
ASSERT(!dcc->enable);
dcc->enable = false;
} else if ((address->grph.meta_addr.quad_part != 0) &&
!dcc->enable)
dcc->enable = true;
if (address->type != PLN_ADDR_TYPE_GRAPHICS) {
if ((address->grph_stereo.right_meta_addr.quad_part == 0) &&
dcc->enable) {
ASSERT(!dcc->enable);
dcc->enable = false;
} else if ((address->grph_stereo.right_meta_addr.quad_part != 0) &&
!dcc->enable)
dcc->enable = true;
}
}
static void copy_surface_update_to_plane( static void copy_surface_update_to_plane(
struct dc_plane_state *surface, struct dc_plane_state *surface,
struct dc_surface_update *srf_update) struct dc_surface_update *srf_update)
{ {
if (srf_update->flip_addr) { if (srf_update->flip_addr) {
surface->address = srf_update->flip_addr->address; surface->address = srf_update->flip_addr->address;
validate_dcc_with_meta_address(&surface->dcc, &surface->address);
surface->flip_immediate = surface->flip_immediate =
srf_update->flip_addr->flip_immediate; srf_update->flip_addr->flip_immediate;
surface->time.time_elapsed_in_us[surface->time.index] = surface->time.time_elapsed_in_us[surface->time.index] =
...@@ -1801,6 +1826,8 @@ static void copy_surface_update_to_plane( ...@@ -1801,6 +1826,8 @@ static void copy_surface_update_to_plane(
srf_update->plane_info->global_alpha_value; srf_update->plane_info->global_alpha_value;
surface->dcc = surface->dcc =
srf_update->plane_info->dcc; srf_update->plane_info->dcc;
validate_dcc_with_meta_address(&surface->dcc, &surface->address);
surface->sdr_white_level = surface->sdr_white_level =
srf_update->plane_info->sdr_white_level; srf_update->plane_info->sdr_white_level;
surface->layer_index = surface->layer_index =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment