drm/amd/display: Don't reinitialize DMCUB on s0ix resume
authorjsg <jsg@openbsd.org>
Sun, 26 Jun 2022 10:51:11 +0000 (10:51 +0000)
committerjsg <jsg@openbsd.org>
Sun, 26 Jun 2022 10:51:11 +0000 (10:51 +0000)
From Nicholas Kazlauskas
7fd1d002852f93f5c03b3188f585245c50b52aea in linux 5.15.y/5.15.50
79d6b9351f086e0f914a26915d96ab52286ec46c in mainline linux

sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index 3c492c6..e214c29 100644 (file)
@@ -991,6 +991,32 @@ static int dm_dmub_hw_init(struct amdgpu_device *adev)
        return 0;
 }
 
+static void dm_dmub_hw_resume(struct amdgpu_device *adev)
+{
+       struct dmub_srv *dmub_srv = adev->dm.dmub_srv;
+       enum dmub_status status;
+       bool init;
+
+       if (!dmub_srv) {
+               /* DMUB isn't supported on the ASIC. */
+               return;
+       }
+
+       status = dmub_srv_is_hw_init(dmub_srv, &init);
+       if (status != DMUB_STATUS_OK)
+               DRM_WARN("DMUB hardware init check failed: %d\n", status);
+
+       if (status == DMUB_STATUS_OK && init) {
+               /* Wait for firmware load to finish. */
+               status = dmub_srv_wait_for_auto_load(dmub_srv, 100000);
+               if (status != DMUB_STATUS_OK)
+                       DRM_WARN("Wait for DMUB auto-load failed: %d\n", status);
+       } else {
+               /* Perform the full hardware initialization. */
+               dm_dmub_hw_init(adev);
+       }
+}
+
 #if defined(CONFIG_DRM_AMD_DC_DCN)
 static void mmhub_read_system_context(struct amdgpu_device *adev, struct dc_phy_addr_space_config *pa_config)
 {
@@ -2270,9 +2296,7 @@ static int dm_resume(void *handle)
                amdgpu_dm_outbox_init(adev);
 
        /* Before powering on DC we need to re-initialize DMUB. */
-       r = dm_dmub_hw_init(adev);
-       if (r)
-               DRM_ERROR("DMUB interface failed to initialize: status=%d\n", r);
+       dm_dmub_hw_resume(adev);
 
        /* power on hardware */
        dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D0);