]> git.hungrycats.org Git - linux/commitdiff
Revert "drm/amd/display: Use handle_hpd_irq_helper for HPD RX"
authorChenyu Chen <chen-yu.chen@amd.com>
Thu, 11 Jun 2026 15:25:11 +0000 (23:25 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 17 Jun 2026 20:17:18 +0000 (16:17 -0400)
This reverts commit 60597d2cb21990face4ac60bb0f9a642c00ff6d2.

Reason for revert: This change is found to cause hang on DP2 link layer compliance 4.2.2.8.

Signed-off-by: Chenyu Chen <chen-yu.chen@amd.com>
Reviewed-by: Jerry Zuo <jerry.zuo@amd.com>
Tested-by: Mark Broadworth <mark.broadworth@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c

index 0759c1d92b61a0c5eb4709396cd52b715761b696..57dd176e4cc13b8cdc1d2a4c5fd8b4298ea59076 100644 (file)
@@ -1425,12 +1425,14 @@ static void handle_hpd_rx_irq(void *param)
        struct dc_link *dc_link = aconnector->dc_link;
        bool is_mst_root_connector = aconnector->mst_mgr.mst_state;
        bool result = false;
+       enum dc_connection_type new_connection_type = dc_connection_none;
        struct amdgpu_device *adev = drm_to_adev(dev);
        union hpd_irq_data hpd_irq_data;
        bool link_loss = false;
        bool has_left_work = false;
        int idx = dc_link->link_index;
        struct hpd_rx_irq_offload_work_queue *offload_wq = &adev->dm.hpd_rx_offload_wq[idx];
+       struct dc *dc = aconnector->dc_link->ctx->dc;
 
        memset(&hpd_irq_data, 0, sizeof(hpd_irq_data));
 
@@ -1499,7 +1501,44 @@ static void handle_hpd_rx_irq(void *param)
 out:
        if (result && !is_mst_root_connector) {
                /* Downstream Port status changed. */
-               handle_hpd_irq_helper(aconnector, DETECT_REASON_HPDRX);
+               if (!dc_link_detect_connection_type(dc_link, &new_connection_type))
+                       drm_err(adev_to_drm(adev), "KMS: Failed to detect connector\n");
+
+               if (aconnector->base.force && new_connection_type == dc_connection_none) {
+                       amdgpu_dm_emulated_link_detect(dc_link);
+
+                       if (aconnector->fake_enable)
+                               aconnector->fake_enable = false;
+
+                       amdgpu_dm_update_connector_after_detect(aconnector);
+
+
+                       drm_modeset_lock_all(dev);
+                       dm_restore_drm_connector_state(dev, connector);
+                       drm_modeset_unlock_all(dev);
+
+                       drm_kms_helper_connector_hotplug_event(connector);
+               } else {
+                       bool ret = false;
+
+                       mutex_lock(&adev->dm.dc_lock);
+                       dc_exit_ips_for_hw_access(dc);
+                       ret = dc_link_detect(dc_link, DETECT_REASON_HPDRX);
+                       mutex_unlock(&adev->dm.dc_lock);
+
+                       if (ret) {
+                               if (aconnector->fake_enable)
+                                       aconnector->fake_enable = false;
+
+                               amdgpu_dm_update_connector_after_detect(aconnector);
+
+                               drm_modeset_lock_all(dev);
+                               dm_restore_drm_connector_state(dev, connector);
+                               drm_modeset_unlock_all(dev);
+
+                               drm_kms_helper_connector_hotplug_event(connector);
+                       }
+               }
        }
        if (hpd_irq_data.bytes.device_service_irq.bits.CP_IRQ) {
                if (adev->dm.hdcp_workqueue)