[PATCH 1/2] drm/amdgpu: handle mp1 state properly on suspend or device removal
Evan Quan
evan.quan at amd.com
Thu Dec 26 08:10:40 UTC 2019
Set mp1 state properly for non gpu reset cases.
Change-Id: I2a007910da6b5e2d1f8915d17827621ebd2e8c59
Signed-off-by: Evan Quan <evan.quan at 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
More information about the amd-gfx
mailing list