Set mp1 state properly for non gpu reset cases.

Change-Id: I2a007910da6b5e2d1f8915d17827621ebd2e8c59
Signed-off-by: Evan Quan <evan.q...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  3 +++
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c    | 16 ++++++++++++++--
 drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 13 +++++++++++++
 3 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index d36245321cb0..739ff4e4e845 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1089,6 +1089,7 @@ static int amdgpu_device_check_arguments(struct 
amdgpu_device *adev)
 static void amdgpu_switcheroo_set_state(struct pci_dev *pdev, enum 
vga_switcheroo_state state)
 {
        struct drm_device *dev = pci_get_drvdata(pdev);
+       struct amdgpu_device *adev = dev->dev_private;
        int r;
 
        if (amdgpu_device_supports_boco(dev) && state == VGA_SWITCHEROO_OFF)
@@ -1112,7 +1113,9 @@ static void amdgpu_switcheroo_set_state(struct pci_dev 
*pdev, enum vga_switchero
                pr_info("amdgpu: switched off\n");
                drm_kms_helper_poll_disable(dev);
                dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
+               adev->mp1_state = PP_MP1_STATE_SHUTDOWN;
                amdgpu_device_suspend(dev, true);
+               adev->mp1_state = PP_MP1_STATE_NONE;
                pci_save_state(dev->pdev);
                /* Shut down the device */
                pci_disable_device(dev->pdev);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 61dc26515c7e..13278f1c1b14 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -1157,8 +1157,14 @@ amdgpu_pci_shutdown(struct pci_dev *pdev)
 static int amdgpu_pmops_suspend(struct device *dev)
 {
        struct drm_device *drm_dev = dev_get_drvdata(dev);
+       struct amdgpu_device *adev = drm_dev->dev_private;
+       int r;
+
+       adev->mp1_state = PP_MP1_STATE_SHUTDOWN;
+       r = amdgpu_device_suspend(drm_dev, true);
+       adev->mp1_state = PP_MP1_STATE_NONE;
 
-       return amdgpu_device_suspend(drm_dev, true);
+       return r;
 }
 
 static int amdgpu_pmops_resume(struct device *dev)
@@ -1198,8 +1204,14 @@ static int amdgpu_pmops_thaw(struct device *dev)
 static int amdgpu_pmops_poweroff(struct device *dev)
 {
        struct drm_device *drm_dev = dev_get_drvdata(dev);
+       struct amdgpu_device *adev = drm_dev->dev_private;
+       int r;
+
+       adev->mp1_state = PP_MP1_STATE_SHUTDOWN;
+       r = amdgpu_device_suspend(drm_dev, true);
+       adev->mp1_state = PP_MP1_STATE_NONE;
 
-       return amdgpu_device_suspend(drm_dev, true);
+       return r;
 }
 
 static int amdgpu_pmops_restore(struct device *dev)
diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c 
b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
index d07c4f2ccee7..4a7fb6b15635 100644
--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
@@ -1370,6 +1370,18 @@ int smu_reset(struct smu_context *smu)
        return ret;
 }
 
+void smu_late_fini(void *handle)
+{
+       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+       struct smu_context *smu = &adev->smu;
+
+       /*
+        * Put the mp1 in the right state.
+        * This gets called on driver unloading.
+        */
+       smu_send_smc_msg(smu, SMU_MSG_PrepareMp1ForShutdown);
+}
+
 static int smu_suspend(void *handle)
 {
        int ret;
@@ -1931,6 +1943,7 @@ const struct amd_ip_funcs smu_ip_funcs = {
        .sw_fini = smu_sw_fini,
        .hw_init = smu_hw_init,
        .hw_fini = smu_hw_fini,
+       .late_fini = smu_late_fini,
        .suspend = smu_suspend,
        .resume = smu_resume,
        .is_idle = NULL,
-- 
2.24.0

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

Reply via email to