Set mp1 state properly for non gpu reset cases. Change-Id: I2a007910da6b5e2d1f8915d17827621ebd2e8c59 Signed-off-by: Evan Quan <evan.quan@xxxxxxx> --- 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@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx