From: Wayne Lin <[email protected]>

We don't have to do MCCS/DDCCI transactions with sink side every time by calling
get_modes(). Limit it to be operated when hotplug occurs.

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 | 23 +++++++++++--------
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  2 +-
 .../display/amdgpu_dm/amdgpu_dm_mst_types.c   |  2 +-
 3 files changed, 15 insertions(+), 12 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 07612463455a..d8f04a2f2967 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -3928,7 +3928,7 @@ void amdgpu_dm_update_connector_after_detect(
 
                if (sink) {
                        if (aconnector->dc_sink) {
-                               amdgpu_dm_update_freesync_caps(connector, NULL);
+                               amdgpu_dm_update_freesync_caps(connector, NULL, 
true);
                                /*
                                 * retain and release below are used to
                                 * bump up refcount for sink because the link 
doesn't point
@@ -3940,9 +3940,9 @@ void amdgpu_dm_update_connector_after_detect(
                        aconnector->dc_sink = sink;
                        dc_sink_retain(aconnector->dc_sink);
                        amdgpu_dm_update_freesync_caps(connector,
-                                       aconnector->drm_edid);
+                                       aconnector->drm_edid, true);
                } else {
-                       amdgpu_dm_update_freesync_caps(connector, NULL);
+                       amdgpu_dm_update_freesync_caps(connector, NULL, true);
                        if (!aconnector->dc_sink) {
                                aconnector->dc_sink = aconnector->dc_em_sink;
                                dc_sink_retain(aconnector->dc_sink);
@@ -3986,7 +3986,7 @@ void amdgpu_dm_update_connector_after_detect(
                 * If yes, put it here.
                 */
                if (aconnector->dc_sink) {
-                       amdgpu_dm_update_freesync_caps(connector, NULL);
+                       amdgpu_dm_update_freesync_caps(connector, NULL, true);
                        dc_sink_release(aconnector->dc_sink);
                }
 
@@ -4019,12 +4019,12 @@ void amdgpu_dm_update_connector_after_detect(
                                        "failed to create 
aconnector->requested_timing\n");
                }
 
-               amdgpu_dm_update_freesync_caps(connector, aconnector->drm_edid);
+               amdgpu_dm_update_freesync_caps(connector, aconnector->drm_edid, 
true);
                update_connector_ext_caps(aconnector);
        } else {
                hdmi_cec_unset_edid(aconnector);
                drm_dp_cec_unset_edid(&aconnector->dm_dp_aux.aux);
-               amdgpu_dm_update_freesync_caps(connector, NULL);
+               amdgpu_dm_update_freesync_caps(connector, NULL, true);
                aconnector->num_modes = 0;
                dc_sink_release(aconnector->dc_sink);
                aconnector->dc_sink = NULL;
@@ -8786,7 +8786,7 @@ static void amdgpu_dm_connector_ddc_get_modes(struct 
drm_connector *connector,
                 * drm_edid_connector_add_modes() and need to be
                 * restored here.
                 */
-               amdgpu_dm_update_freesync_caps(connector, drm_edid);
+               amdgpu_dm_update_freesync_caps(connector, drm_edid, false);
        } else {
                amdgpu_dm_connector->num_modes = 0;
        }
@@ -13266,7 +13266,7 @@ static int parse_hdmi_amd_vsdb(struct 
amdgpu_dm_connector *aconnector,
  * FreeSync parameters.
  */
 void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
-                                   const struct drm_edid *drm_edid)
+                                   const struct drm_edid *drm_edid, bool 
do_mccs)
 {
        int i = 0;
        struct amdgpu_dm_connector *amdgpu_dm_connector =
@@ -13373,13 +13373,16 @@ void amdgpu_dm_update_freesync_caps(struct 
drm_connector *connector,
        }
 
        /* Handle MCCS */
-       dm_helpers_read_mccs_caps(adev->dm.dc->ctx, 
amdgpu_dm_connector->dc_link, sink);
+       if (do_mccs)
+               dm_helpers_read_mccs_caps(adev->dm.dc->ctx, 
amdgpu_dm_connector->dc_link, sink);
+
        if ((sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A ||
                as_type == FREESYNC_TYPE_PCON_IN_WHITELIST) &&
                (!sink->edid_caps.freesync_vcp_code ||
                (sink->edid_caps.freesync_vcp_code && 
!sink->mccs_caps.freesync_supported)))
                freesync_capable = false;
-       if (sink->mccs_caps.freesync_supported && freesync_capable)
+
+       if (do_mccs && sink->mccs_caps.freesync_supported && freesync_capable)
                dm_helpers_mccs_vcp_set(adev->dm.dc->ctx, 
amdgpu_dm_connector->dc_link, sink);
 
 update:
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 4a2c1bde28c9..4226a29a9e7c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -1085,7 +1085,7 @@ void dm_restore_drm_connector_state(struct drm_device 
*dev,
                                    struct drm_connector *connector);
 
 void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
-                                   const struct drm_edid *drm_edid);
+                                   const struct drm_edid *drm_edid, bool 
do_mccs);
 
 void amdgpu_dm_trigger_timing_sync(struct drm_device *dev);
 
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index 2e0895f4f9b1..67e7e14d8976 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -474,7 +474,7 @@ static int dm_dp_mst_get_modes(struct drm_connector 
*connector)
 
                if (aconnector->dc_sink) {
                        amdgpu_dm_update_freesync_caps(
-                                       connector, aconnector->drm_edid);
+                                       connector, aconnector->drm_edid, true);
 
 #if defined(CONFIG_DRM_AMD_DC_FP)
                        if (!validate_dsc_caps_on_connector(aconnector))
-- 
2.34.1

Reply via email to