From: Wayne Lin <[email protected]>

[Why & How]
DMUB supports to parse freesynce mccs vcp code now. Store it for
later freesync mccs manipulation.

Reviewed-by: Harry Wentland <[email protected]>
Signed-off-by: Wayne Lin <[email protected]>
Signed-off-by: Roman Li <[email protected]>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 45 ++++++++++++-------
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  5 +++
 drivers/gpu/drm/amd/display/dc/dc_types.h     |  2 +
 3 files changed, 35 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 48e12f9a1818..c613deb7c88a 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -13043,6 +13043,7 @@ static bool dm_edid_parser_send_cea(struct 
amdgpu_display_manager *dm,
                vsdb->amd_vsdb_version = output->amd_vsdb.amd_vsdb_version;
                vsdb->min_refresh_rate_hz = output->amd_vsdb.min_frame_rate;
                vsdb->max_refresh_rate_hz = output->amd_vsdb.max_frame_rate;
+               vsdb->freesync_mccs_vcp_code = 
output->amd_vsdb.freesync_mccs_vcp_code;
        } else {
                drm_warn(adev_to_drm(dm->adev), "Unknown EDID CEA parser 
results\n");
                return false;
@@ -13077,6 +13078,8 @@ static bool parse_edid_cea_dmcu(struct 
amdgpu_display_manager *dm,
                                vsdb_info->amd_vsdb_version = version;
                                vsdb_info->min_refresh_rate_hz = min_rate;
                                vsdb_info->max_refresh_rate_hz = max_rate;
+                               /* Not enabled on DMCU*/
+                               vsdb_info->freesync_mccs_vcp_code = 0;
                                return true;
                        }
                        /* not amd vsdb */
@@ -13329,14 +13332,19 @@ void amdgpu_dm_update_freesync_caps(struct 
drm_connector *connector,
 
        } else if (drm_edid && sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A) {
                i = parse_hdmi_amd_vsdb(amdgpu_dm_connector, edid, &vsdb_info);
-               if (i >= 0 && vsdb_info.freesync_supported) {
-                       amdgpu_dm_connector->min_vfreq = 
vsdb_info.min_refresh_rate_hz;
-                       amdgpu_dm_connector->max_vfreq = 
vsdb_info.max_refresh_rate_hz;
-                       if (amdgpu_dm_connector->max_vfreq - 
amdgpu_dm_connector->min_vfreq > 10)
-                               freesync_capable = true;
+               if (i >= 0) {
+                       amdgpu_dm_connector->vsdb_info = vsdb_info;
+                       sink->edid_caps.freesync_vcp_code = 
vsdb_info.freesync_mccs_vcp_code;
 
-                       connector->display_info.monitor_range.min_vfreq = 
vsdb_info.min_refresh_rate_hz;
-                       connector->display_info.monitor_range.max_vfreq = 
vsdb_info.max_refresh_rate_hz;
+                       if (vsdb_info.freesync_supported) {
+                               amdgpu_dm_connector->min_vfreq = 
vsdb_info.min_refresh_rate_hz;
+                               amdgpu_dm_connector->max_vfreq = 
vsdb_info.max_refresh_rate_hz;
+                               if (amdgpu_dm_connector->max_vfreq - 
amdgpu_dm_connector->min_vfreq > 10)
+                                       freesync_capable = true;
+
+                               connector->display_info.monitor_range.min_vfreq 
= vsdb_info.min_refresh_rate_hz;
+                               connector->display_info.monitor_range.max_vfreq 
= vsdb_info.max_refresh_rate_hz;
+                       }
                }
        }
 
@@ -13345,19 +13353,22 @@ void amdgpu_dm_update_freesync_caps(struct 
drm_connector *connector,
 
        if (as_type == FREESYNC_TYPE_PCON_IN_WHITELIST) {
                i = parse_hdmi_amd_vsdb(amdgpu_dm_connector, edid, &vsdb_info);
-               if (i >= 0 && vsdb_info.freesync_supported && 
vsdb_info.amd_vsdb_version > 0) {
-
-                       amdgpu_dm_connector->pack_sdp_v1_3 = true;
-                       amdgpu_dm_connector->as_type = as_type;
+               if (i >= 0) {
                        amdgpu_dm_connector->vsdb_info = vsdb_info;
+                       sink->edid_caps.freesync_vcp_code = 
vsdb_info.freesync_mccs_vcp_code;
 
-                       amdgpu_dm_connector->min_vfreq = 
vsdb_info.min_refresh_rate_hz;
-                       amdgpu_dm_connector->max_vfreq = 
vsdb_info.max_refresh_rate_hz;
-                       if (amdgpu_dm_connector->max_vfreq - 
amdgpu_dm_connector->min_vfreq > 10)
-                               freesync_capable = true;
+                       if (vsdb_info.freesync_supported && 
vsdb_info.amd_vsdb_version > 0) {
+                               amdgpu_dm_connector->pack_sdp_v1_3 = true;
+                               amdgpu_dm_connector->as_type = as_type;
 
-                       connector->display_info.monitor_range.min_vfreq = 
vsdb_info.min_refresh_rate_hz;
-                       connector->display_info.monitor_range.max_vfreq = 
vsdb_info.max_refresh_rate_hz;
+                               amdgpu_dm_connector->min_vfreq = 
vsdb_info.min_refresh_rate_hz;
+                               amdgpu_dm_connector->max_vfreq = 
vsdb_info.max_refresh_rate_hz;
+                               if (amdgpu_dm_connector->max_vfreq - 
amdgpu_dm_connector->min_vfreq > 10)
+                                       freesync_capable = true;
+
+                               connector->display_info.monitor_range.min_vfreq 
= vsdb_info.min_refresh_rate_hz;
+                               connector->display_info.monitor_range.max_vfreq 
= vsdb_info.max_refresh_rate_hz;
+                       }
                }
        }
 
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index d1a14e0c12bd..4a2c1bde28c9 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -772,6 +772,11 @@ struct amdgpu_hdmi_vsdb_info {
         */
        unsigned int max_refresh_rate_hz;
 
+       /**
+        * @freesync_mccs_vcp_code: MCCS VCP code for freesync state
+        */
+       unsigned int freesync_mccs_vcp_code;
+
        /**
         * @replay_mode: Replay supported
         */
diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h 
b/drivers/gpu/drm/amd/display/dc/dc_types.h
index fd8ec1660312..5b7490a7dc7a 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_types.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_types.h
@@ -205,6 +205,8 @@ struct dc_edid_caps {
        uint32_t audio_latency;
        uint32_t video_latency;
 
+       unsigned int freesync_vcp_code;
+
        uint8_t qs_bit;
        uint8_t qy_bit;
 
-- 
2.34.1

Reply via email to