[PATCH 13/26] drm/amd/display: Clear update flags after update has been applied
Matthew Schwartz
mattschwartz at gwmail.gwu.edu
Fri Oct 4 18:20:08 UTC 2024
On Fri, 4 Oct 2024, Melissa Wen wrote:
>
>
>
> On 03/10/2024 20:33, Rodrigo Siqueira wrote:
>> From: Josip Pavic <Josip.Pavic at amd.com>
>>
>> [Why]
>> Since the surface/stream update flags aren't cleared after applying
>> updates, those same updates may be applied again in a future call to
>> update surfaces/streams for surfaces/streams that aren't actually part
>> of that update (i.e. applying an update for one surface/stream can
>> trigger unintended programming on a different surface/stream).
>>
>> For example, when an update results in a call to
>> program_front_end_for_ctx, that function may call program_pipe on all
>> pipes. If there are surface update flags that were never cleared on the
>> surface some pipe is attached to, then the same update will be
>> programmed again.
>>
>> [How]
>> Clear the surface and stream update flags after applying the updates.
> Hi,
>
> Just to let you know: this patch fixes artifacts when transitioning from 2 to
> 3 planes with dynamic pipe split policy on DCN301, as reported here:
>
> https://gitlab.freedesktop.org/drm/amd/-/issues/3441
>
> The problem was first seen in kernel 6.5, when multiple features were enabled
> (plane color mgmt and zpos properties) and minimal transition state was
> reworked.
>
> Should it be sent to stable too?
>
> Thanks,
>
> Melissa
Hello,
I wanted to confirm that this patch also fixes artifacts when utilizing
windowed MPO ODM on DCN32, as I originally reported here:
https://gitlab.freedesktop.org/drm/amd/-/issues/3616
I bisected this as a regression in kernel 6.9, where I noticed my 7900XTX
started to display almost identical artifacting to the issue on DCN301
that Melissa linked. As this commit seems to resolve the regression, a
submission to stable would be greatly appreciated.
Cheers,
Matthew
>>
>> Reviewed-by: Aric Cyr <aric.cyr at amd.com>
>> Signed-off-by: Josip Pavic <Josip.Pavic at amd.com>
>> Signed-off-by: Rodrigo Siqueira <rodrigo.siqueira at amd.com>
>> ---
>> drivers/gpu/drm/amd/display/dc/core/dc.c | 45 ++++++++++++++++++------
>> 1 file changed, 34 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c
>> b/drivers/gpu/drm/amd/display/dc/core/dc.c
>> index 981d9a327daf..7b239cbfbb4a 100644
>> --- a/drivers/gpu/drm/amd/display/dc/core/dc.c
>> +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
>> @@ -5129,11 +5129,26 @@ static bool update_planes_and_stream_v3(struct dc
>> *dc,
>> return true;
>> }
>>
>> +static void clear_update_flags(struct dc_surface_update *srf_updates,
>> + int surface_count, struct dc_stream_state *stream)
>> +{
>> + int i;
>> +
>> + if (stream)
>> + stream->update_flags.raw = 0;
>> +
>> + for (i = 0; i < surface_count; i++)
>> + if (srf_updates[i].surface)
>> + srf_updates[i].surface->update_flags.raw = 0;
>> +}
>> +
>> bool dc_update_planes_and_stream(struct dc *dc,
>> struct dc_surface_update *srf_updates, int surface_count,
>> struct dc_stream_state *stream,
>> struct dc_stream_update *stream_update)
>> {
>> + bool ret = false;
>> +
>> dc_exit_ips_for_hw_access(dc);
>> /*
>> * update planes and stream version 3 separates FULL and FAST updates
>> @@ -5150,10 +5165,16 @@ bool dc_update_planes_and_stream(struct dc *dc,
>> * features as they are now transparent to the new sequence.
>> */
>> if (dc->ctx->dce_version >= DCN_VERSION_4_01)
>> - return update_planes_and_stream_v3(dc, srf_updates,
>> + ret = update_planes_and_stream_v3(dc, srf_updates,
>> surface_count, stream, stream_update);
>> - return update_planes_and_stream_v2(dc, srf_updates,
>> + else
>> + ret = update_planes_and_stream_v2(dc, srf_updates,
>> surface_count, stream, stream_update);
>> +
>> + if (ret)
>> + clear_update_flags(srf_updates, surface_count, stream);
>> +
>> + return ret;
>> }
>>
>> void dc_commit_updates_for_stream(struct dc *dc,
>> @@ -5163,6 +5184,8 @@ void dc_commit_updates_for_stream(struct dc *dc,
>> struct dc_stream_update *stream_update,
>> struct dc_state *state)
>> {
>> + bool ret = false;
>> +
>> dc_exit_ips_for_hw_access(dc);
>> /* TODO: Since change commit sequence can have a huge impact,
>> * we decided to only enable it for DCN3x. However, as soon as
>> @@ -5170,17 +5193,17 @@ void dc_commit_updates_for_stream(struct dc *dc,
>> * the new sequence for all ASICs.
>> */
>> if (dc->ctx->dce_version >= DCN_VERSION_4_01) {
>> - update_planes_and_stream_v3(dc, srf_updates, surface_count,
>> + ret = update_planes_and_stream_v3(dc, srf_updates,
>> surface_count,
>> stream, stream_update);
>> - return;
>> - }
>> - if (dc->ctx->dce_version >= DCN_VERSION_3_2) {
>> - update_planes_and_stream_v2(dc, srf_updates, surface_count,
>> + } else if (dc->ctx->dce_version >= DCN_VERSION_3_2) {
>> + ret = update_planes_and_stream_v2(dc, srf_updates,
>> surface_count,
>> stream, stream_update);
>> - return;
>> - }
>> - update_planes_and_stream_v1(dc, srf_updates, surface_count, stream,
>> - stream_update, state);
>> + } else
>> + ret = update_planes_and_stream_v1(dc, srf_updates,
>> surface_count, stream,
>> + stream_update, state);
>> +
>> + if (ret)
>> + clear_update_flags(srf_updates, surface_count, stream);
>> }
>>
>> uint8_t dc_get_current_stream_count(struct dc *dc)
>
>
>
More information about the amd-gfx
mailing list