drm/amd/display: Set flip pending for pipe split
[WHY] When doing split pipe, if one pipe is pending on flip, the entire plane's status should be flip pending, otherwise corruption can occur when OS writes to a surface prematurely. [HOW] Clear the flip pending bit before checking pipes, then OR the flip pending bits from all pipes together to create the flip pending status of the entire plane. Signed-off-by: Wesley Chalmers <Wesley.Chalmers@amd.com> Reviewed-by: Jun Lei <Jun.Lei@amd.com> Acked-by: Eryk Brol <Eryk.Brol@amd.com> Acked-by: Leo Li <sunpeng.li@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
dcf1a98867
commit
128c075ad4
|
@ -119,6 +119,19 @@ const struct dc_plane_status *dc_plane_get_status(
|
|||
if (core_dc->current_state == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Find the current plane state and set its pending bit to false */
|
||||
for (i = 0; i < core_dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe_ctx =
|
||||
&core_dc->current_state->res_ctx.pipe_ctx[i];
|
||||
|
||||
if (pipe_ctx->plane_state != plane_state)
|
||||
continue;
|
||||
|
||||
pipe_ctx->plane_state->status.is_flip_pending = false;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < core_dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe_ctx =
|
||||
&core_dc->current_state->res_ctx.pipe_ctx[i];
|
||||
|
|
|
@ -2689,7 +2689,7 @@ static void dcn10_update_pending_status(struct pipe_ctx *pipe_ctx)
|
|||
flip_pending = pipe_ctx->plane_res.hubp->funcs->hubp_is_flip_pending(
|
||||
pipe_ctx->plane_res.hubp);
|
||||
|
||||
plane_state->status.is_flip_pending = flip_pending;
|
||||
plane_state->status.is_flip_pending = plane_state->status.is_flip_pending || flip_pending;
|
||||
|
||||
if (!flip_pending)
|
||||
plane_state->status.current_address = plane_state->status.requested_address;
|
||||
|
|
Loading…
Reference in New Issue