From: Mitchell Augustin <[email protected]>

Issue: https://gitlab.freedesktop.org/drm/amd/-/work_items/5394
Ubuntu BugLink: https://bugs.launchpad.net/bugs/2162904

This commit disables panel self-refresh when more than one display is
active to eliminate a common hang and system crash that happens
frequently on some laptops, evidently due to race conditions between
the DMCUB, amdgpu module, and possibly other components which are
exacerbated when more than one display is active.

To my knowledge, a fix for the underlying failure condition is not
available upstream, so given how disruptive this is for impacted users,
I propose disabling this feature under this condition until it is fixed.
The main downside of disabling PSR is that it
will increase power consumption, but this should be barely noticeable to
end users, since PSR will remain enabled on laptops unconnected to
external monitors, and since laptops connected to external monitors are
likely typically also connected to power (and thus less concerned with
the energy savings afforded by PSR).

Signed-off-by: Mitchell Augustin <[email protected]>

---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
index 5d2715f78314..272f195b8c28 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
@@ -152,7 +152,8 @@ void amdgpu_dm_crtc_set_panel_sr_feature(
                struct amdgpu_dm_connector *aconn =
                        (struct amdgpu_dm_connector *) 
stream->dm_stream_context;
 
-               if (!aconn->disallow_edp_enter_psr) {
+               /* Do not enter PSR if multiple displays are active to prevent 
DMCUB hangs */
+               if (!aconn->disallow_edp_enter_psr && 
dm->dc->current_state->stream_count == 1) {
                        amdgpu_dm_psr_enable(stream);
                        if (dm->idle_workqueue &&
                            (dm->dc->config.disable_ips == DMUB_IPS_ENABLE) &&
-- 
2.43.0

Reply via email to