mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-05 11:01:06 -04:00
drm/amd/display: Keep GSL for full updates with planes that flip VSYNC
[Why] When enabling PIP in Heaven, the PIP planes are VSYNC flip and is also the top-most pipe. In this case GSL will be disabled because we only check immediate flip for the top pipe. However, the desktop planes are still flip immediate so we should at least keep GSL on until the full update. [How] Check each pipe in the tree to see if any planes are flip immediate. Maintain the GSL lock if yes, and take it down after when unlocking if any planes are flipping VSYNC. Keeping GSL on with VSYNC + flip immediate planes causes corruption. Signed-off-by: Alvin Lee <alvin.lee2@amd.com> Reviewed-by: Aric Cyr <Aric.Cyr@amd.com> Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
@@ -1158,6 +1158,7 @@ void dcn20_pipe_control_lock(
|
||||
struct pipe_ctx *pipe,
|
||||
bool lock)
|
||||
{
|
||||
struct pipe_ctx *temp_pipe;
|
||||
bool flip_immediate = false;
|
||||
|
||||
/* use TG master update lock to lock everything on the TG
|
||||
@@ -1169,6 +1170,13 @@ void dcn20_pipe_control_lock(
|
||||
if (pipe->plane_state != NULL)
|
||||
flip_immediate = pipe->plane_state->flip_immediate;
|
||||
|
||||
temp_pipe = pipe->bottom_pipe;
|
||||
while (!flip_immediate && temp_pipe) {
|
||||
if (temp_pipe->plane_state != NULL)
|
||||
flip_immediate = temp_pipe->plane_state->flip_immediate;
|
||||
temp_pipe = temp_pipe->bottom_pipe;
|
||||
}
|
||||
|
||||
if (flip_immediate && lock) {
|
||||
const int TIMEOUT_FOR_FLIP_PENDING = 100000;
|
||||
int i;
|
||||
@@ -1196,6 +1204,17 @@ void dcn20_pipe_control_lock(
|
||||
(!flip_immediate && pipe->stream_res.gsl_group > 0))
|
||||
dcn20_setup_gsl_group_as_lock(dc, pipe, flip_immediate);
|
||||
|
||||
temp_pipe = pipe->bottom_pipe;
|
||||
while (flip_immediate && temp_pipe) {
|
||||
if (temp_pipe->plane_state != NULL)
|
||||
flip_immediate = temp_pipe->plane_state->flip_immediate;
|
||||
temp_pipe = temp_pipe->bottom_pipe;
|
||||
}
|
||||
|
||||
if (!lock && pipe->stream_res.gsl_group > 0 && pipe->plane_state &&
|
||||
!flip_immediate)
|
||||
dcn20_setup_gsl_group_as_lock(dc, pipe, false);
|
||||
|
||||
if (pipe->stream && should_use_dmub_lock(pipe->stream->link)) {
|
||||
union dmub_hw_lock_flags hw_locks = { 0 };
|
||||
struct dmub_hw_lock_inst_flags inst_flags = { 0 };
|
||||
|
||||
Reference in New Issue
Block a user