[PATCH 1/2] drm/amdgpu: handle mp1 state properly on suspend or device removal

Deucher, Alexander Alexander.Deucher at amd.com
Sun Dec 29 06:43:23 UTC 2019


[AMD Public Use]

> -----Original Message-----
> From: Quan, Evan <Evan.Quan at amd.com>
> Sent: Thursday, December 26, 2019 3:11 AM
> To: amd-gfx at lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher at amd.com>; Quan, Evan
> <Evan.Quan at amd.com>
> Subject: [PATCH 1/2] drm/amdgpu: handle mp1 state properly on suspend or
> device removal
> 
> 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;

Should this be STATE_UNLOAD for poweroff?

> +	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); }
> +

Do we need something similar for the powerplay code?  E.g., pp_late_fini()?  Also shouldn't this be adev->mp1_state or prepare for unload rather than hardcoding it to prepare for shutdown?

Alex

>  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