Set mp1 state properly for SW SMU suspend/reset routine.

Change-Id: I458d09e79bba2613bb85099938648782ff91b97a
Signed-off-by: Evan Quan <evan.q...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c    | 10 ++---
 drivers/gpu/drm/amd/powerplay/amdgpu_smu.c    | 40 +++++++++++++++++++
 .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h    |  2 +
 3 files changed, 47 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index c8697b5ef1d0..5fe539f80009 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -2217,16 +2217,16 @@ static int amdgpu_device_ip_suspend_phase2(struct 
amdgpu_device *adev)
                /* handle putting the SMC in the appropriate state */
                if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {
                        if (is_support_sw_smu(adev)) {
-                               /* todo */
+                               r = smu_set_mp1_state(&adev->smu, 
adev->mp1_state);
                        } else if (adev->powerplay.pp_funcs &&
                                   adev->powerplay.pp_funcs->set_mp1_state) {
                                r = adev->powerplay.pp_funcs->set_mp1_state(
                                        adev->powerplay.pp_handle,
                                        adev->mp1_state);
-                               if (r) {
-                                       DRM_ERROR("SMC failed to set mp1 state 
%d, %d\n",
-                                                 adev->mp1_state, r);
-                               }
+                       }
+                       if (r) {
+                               DRM_ERROR("SMC failed to set mp1 state %d, 
%d\n",
+                                         adev->mp1_state, r);
                        }
                }
 
diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c 
b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
index f13e134be42e..25f3c9e1b404 100644
--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
@@ -1796,6 +1796,46 @@ int smu_force_clk_levels(struct smu_context *smu,
        return ret;
 }
 
+int smu_set_mp1_state(struct smu_context *smu,
+                     enum pp_mp1_state mp1_state)
+{
+       uint16_t msg;
+       int ret;
+
+       /*
+        * The SMC is not fully ready. That may be
+        * expected as the IP may be masked.
+        * So, just return without error.
+        */
+       if (!smu->pm_enabled)
+               return 0;
+
+       switch (mp1_state) {
+       case PP_MP1_STATE_SHUTDOWN:
+               msg = SMU_MSG_PrepareMp1ForShutdown;
+               break;
+       case PP_MP1_STATE_UNLOAD:
+               msg = SMU_MSG_PrepareMp1ForUnload;
+               break;
+       case PP_MP1_STATE_RESET:
+               msg = SMU_MSG_PrepareMp1ForReset;
+               break;
+       case PP_MP1_STATE_NONE:
+       default:
+               return 0;
+       }
+
+       /* some asics may not support those messages */
+       if (smu_msg_get_index(smu, msg) < 0)
+               return 0;
+
+       ret = smu_send_smc_msg(smu, msg);
+       if (ret)
+               pr_err("[PrepareMp1] Failed!\n");
+
+       return ret;
+}
+
 const struct amd_ip_funcs smu_ip_funcs = {
        .name = "smu",
        .early_init = smu_early_init,
diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h 
b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
index 3de88d084615..16df09be6a9f 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
@@ -903,5 +903,7 @@ int smu_sys_set_pp_feature_mask(struct smu_context *smu, 
uint64_t new_mask);
 int smu_force_clk_levels(struct smu_context *smu,
                         enum smu_clk_type clk_type,
                         uint32_t mask);
+int smu_set_mp1_state(struct smu_context *smu,
+                     enum pp_mp1_state mp1_state);
 
 #endif
-- 
2.23.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to