drm/amd/display: Delay PSR entry
authorRoman Li <roman.li@amd.com>
Tue, 8 Jun 2021 21:32:16 +0000 (17:32 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 21 Jun 2021 21:45:14 +0000 (17:45 -0400)
[Why]
After panel power up, if PSR entry attempted too early,
PSR state may get stuck in transition.
This could happen if the panel is not ready
to respond to the SDP PSR entry message.
In this case dmub f/w is unable to abort PSR entry
since abortion is not permitted after the SDP has been sent.

[How]
Skip 5 pageflips before PSR enable.

Signed-off-by: Roman Li <roman.li@amd.com>
Reviewed-by: Hersen Wu <hersenxs.wu@amd.com>
Acked-by: Bindu Ramamurthy <bindu.r@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.h

index 26f0ebdb38a96c65f827039bf65a8a8f63aa994a..d069661abe45d30bf42b30fd8bf4c4b7f3087ec2 100644 (file)
@@ -5900,6 +5900,8 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
                                stream->use_vsc_sdp_for_colorimetry = true;
                }
                mod_build_vsc_infopacket(stream, &stream->vsc_infopacket);
+               aconnector->psr_skip_count = AMDGPU_DM_PSR_ENTRY_DELAY;
+
        }
 finish:
        dc_sink_release(sink);
@@ -8713,7 +8715,13 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
                else if ((acrtc_state->update_type == UPDATE_TYPE_FAST) &&
                                acrtc_state->stream->link->psr_settings.psr_feature_enabled &&
                                !acrtc_state->stream->link->psr_settings.psr_allow_active) {
-                       amdgpu_dm_psr_enable(acrtc_state->stream);
+                       struct amdgpu_dm_connector *aconn = (struct amdgpu_dm_connector *)
+                                       acrtc_state->stream->dm_stream_context;
+
+                       if (aconn->psr_skip_count > 0)
+                               aconn->psr_skip_count--;
+                       else
+                               amdgpu_dm_psr_enable(acrtc_state->stream);
                }
 
                mutex_unlock(&dm->dc_lock);
index fcb9c4a629c32ba73782e727685e147b076e8805..9522d4ca299efb8d4e473883992b436087e74f26 100644 (file)
@@ -509,6 +509,8 @@ struct amdgpu_dm_connector {
        struct dsc_preferred_settings dsc_settings;
        /* Cached display modes */
        struct drm_display_mode freesync_vid_base;
+
+       int psr_skip_count;
 };
 
 #define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base)
index 57bbb80421e8e7481abcdb654492fb0f55fcdd74..6806b3c9c84ba05f278e84b6ab9cf4f7135b3162 100644 (file)
@@ -28,6 +28,9 @@
 
 #include "amdgpu.h"
 
+/* the number of pageflips before enabling psr */
+#define AMDGPU_DM_PSR_ENTRY_DELAY 5
+
 void amdgpu_dm_set_psr_caps(struct dc_link *link);
 bool amdgpu_dm_psr_enable(struct dc_stream_state *stream);
 bool amdgpu_dm_link_setup_psr(struct dc_stream_state *stream);