From: Paul Hsieh <[email protected]>

[Why & How]
According to the vendor’s requirement, after each OUI write,
the PSR cap must be read; otherwise, the vendor will default
to using PSRSU. But its PSR cap indicates that it only supports
PSR1.

Reviewed-by: Wenjing Liu <[email protected]>
Signed-off-by: Paul Hsieh <[email protected]>
Signed-off-by: Ivan Lipski <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/dc_types.h          |  1 +
 .../dc/link/protocols/link_edp_panel_control.c     | 14 ++++++++++++++
 2 files changed, 15 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h 
b/drivers/gpu/drm/amd/display/dc/dc_types.h
index 619834a328a3..b5aa03a3e39c 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_types.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_types.h
@@ -1217,6 +1217,7 @@ struct dc_panel_config {
                bool rc_disable;
                bool rc_allow_static_screen;
                bool rc_allow_fullscreen_VPB;
+               bool read_psrcap_again;
                unsigned int replay_enable_option;
        } psr;
        /* ABM */
diff --git 
a/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c 
b/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c
index 8b7b87b21c2e..5e806edbb9f6 100644
--- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c
+++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c
@@ -703,6 +703,20 @@ bool edp_setup_psr(struct dc_link *link,
        if (!link)
                return false;
 
+       /* This is a workaround: some vendors require the source to
+        * read the PSR cap; otherwise, the vendor's PSR feature will
+        * fall back to its default behavior, causing a misconfiguration
+        * of this feature.
+        */
+       if (link->panel_config.psr.read_psrcap_again) {
+               dm_helpers_dp_read_dpcd(
+                       link->ctx,
+                       link,
+                       DP_PSR_SUPPORT,
+                       &link->dpcd_caps.psr_info.psr_version,
+                       sizeof(link->dpcd_caps.psr_info.psr_version));
+       }
+
        //Clear PSR cfg
        memset(&psr_configuration, 0, sizeof(psr_configuration));
        dm_helpers_dp_write_dpcd(
-- 
2.43.0

Reply via email to