]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/display: Avoid to do MCCS transaction if unnecessary
authorWayne Lin <Wayne.Lin@amd.com>
Wed, 11 Mar 2026 08:11:57 +0000 (16:11 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 17 Apr 2026 19:21:08 +0000 (15:21 -0400)
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 <harry.wentland@amd.com>
Signed-off-by: Wayne Lin <Wayne.Lin@amd.com>
Signed-off-by: Roman Li <roman.li@amd.com>
Tested-by: Dan 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_mst_types.c

index 5f9bbe178265fd715df3da1cc57ab10862ecf9f9..70ee26c68d4efa500a008c95ed3f6fdbfa3e5f69 100644 (file)
@@ -3994,7 +3994,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
@@ -4006,9 +4006,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);
@@ -4052,7 +4052,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);
                }
 
@@ -4085,13 +4085,13 @@ 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);
                dm_set_panel_type(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;
@@ -8855,7 +8855,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;
        }
@@ -13270,7 +13270,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 =
@@ -13377,13 +13377,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:
index 8aada3e1c5b82508d0de4f4af5a0333cf816e42f..74a8fe1a1999f39581f97c2645963b9a3b7e67c2 100644 (file)
@@ -1071,7 +1071,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);
 
index 5d8c4c7020b141a8760828ed70b8cb1ab0273fdf..be038d9014bb45e4c3312d78e365087e75dc89ca 100644 (file)
@@ -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))