]> git.itanic.dy.fi Git - linux-stable/commitdiff
drm/amd/pm/smu11: poll BACO status after RPM BACO exits
authorGuchun Chen <guchun.chen@amd.com>
Tue, 22 Nov 2022 09:47:04 +0000 (17:47 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 29 Nov 2022 16:03:35 +0000 (11:03 -0500)
After executing BACO exit, driver needs to poll the status
to ensure FW has completed BACO exit sequence to prevent
timing issue.

v2: use usleep_range to replace msleep to fix checkpatch.pl warnings

Signed-off-by: Guchun Chen <guchun.chen@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c

index ad5f6a15a1d7d51d52423f2556db83b130a5de17..ad66d57aa102e523f002956dff5b9df4568381c7 100644 (file)
@@ -79,6 +79,17 @@ MODULE_FIRMWARE("amdgpu/beige_goby_smc.bin");
 #define mmTHM_BACO_CNTL_ARCT                   0xA7
 #define mmTHM_BACO_CNTL_ARCT_BASE_IDX          0
 
+static void smu_v11_0_poll_baco_exit(struct smu_context *smu)
+{
+       struct amdgpu_device *adev = smu->adev;
+       uint32_t data, loop = 0;
+
+       do {
+               usleep_range(1000, 1100);
+               data = RREG32_SOC15(THM, 0, mmTHM_BACO_CNTL);
+       } while ((data & 0x100) && (++loop < 100));
+}
+
 int smu_v11_0_init_microcode(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
@@ -1689,7 +1700,18 @@ int smu_v11_0_baco_enter(struct smu_context *smu)
 
 int smu_v11_0_baco_exit(struct smu_context *smu)
 {
-       return smu_v11_0_baco_set_state(smu, SMU_BACO_STATE_EXIT);
+       int ret;
+
+       ret = smu_v11_0_baco_set_state(smu, SMU_BACO_STATE_EXIT);
+       if (!ret) {
+               /*
+                * Poll BACO exit status to ensure FW has completed
+                * BACO exit process to avoid timing issues.
+                */
+               smu_v11_0_poll_baco_exit(smu);
+       }
+
+       return ret;
 }
 
 int smu_v11_0_mode1_reset(struct smu_context *smu)