[PATCH 11/11] drm/amdgpu: put the SMC into the proper state on reset/unload

Quan, Evan Evan.Quan at amd.com
Fri Jul 26 06:02:08 UTC 2019


I think it's OK to leave the S3 and BACO as they were for now.
Series is reviewed-by Evan Quan <evan.quan at amd.com>

> -----Original Message-----
> From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> On Behalf Of Alex
> Deucher
> Sent: Friday, July 26, 2019 11:22 AM
> To: amd-gfx at lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher at amd.com>
> Subject: [PATCH 11/11] drm/amdgpu: put the SMC into the proper state on
> reset/unload
> 
> When doing a GPU reset or unloading the driver, we need to put the SMU
> into the apprpriate state for the re-init after the reset or unload to reliably
> work.
> 
> I don't think this is necessary for BACO because the SMU actually controls the
> BACO state to it needs to be active.
> 
> For suspend (S3), the asic is put into D3 so the SMU would be powered down
> so I don't think we need to put the SMU into any special state.
> 
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h        |  1 +
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 27
> ++++++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c    |  2 ++
>  3 files changed, 30 insertions(+)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index e661417ba9dd..121cc5544b2b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -993,6 +993,7 @@ struct amdgpu_device {
>  	/* record last mm index being written through WREG32*/
>  	unsigned long last_mm_index;
>  	bool                            in_gpu_reset;
> +	enum pp_mp1_state               mp1_state;
>  	struct mutex  lock_reset;
>  	struct amdgpu_doorbell_index doorbell_index;
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 4425ff06ecc4..127ed01ed8fd 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -2174,6 +2174,21 @@ static int
> amdgpu_device_ip_suspend_phase2(struct amdgpu_device *adev)
>  			DRM_ERROR("suspend of IP block <%s> failed %d\n",
>  				  adev->ip_blocks[i].version->funcs->name,
> r);
>  		}
> +		/* 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 */
> +			} 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);
> +				}
> +			}
> +		}
>  	}
> 
>  	return 0;
> @@ -3639,6 +3654,17 @@ static bool amdgpu_device_lock_adev(struct
> amdgpu_device *adev, bool trylock)
> 
>  	atomic_inc(&adev->gpu_reset_counter);
>  	adev->in_gpu_reset = 1;
> +	switch (amdgpu_asic_reset_method(adev)) {
> +	case AMD_RESET_METHOD_MODE1:
> +		adev->mp1_state = PP_MP1_STATE_SHUTDOWN;
> +		break;
> +	case AMD_RESET_METHOD_MODE2:
> +		adev->mp1_state = PP_MP1_STATE_RESET;
> +		break;
> +	default:
> +		adev->mp1_state = PP_MP1_STATE_NONE;
> +		break;
> +	}
>  	/* Block kfd: SRIOV would do it separately */
>  	if (!amdgpu_sriov_vf(adev))
>                  amdgpu_amdkfd_pre_reset(adev); @@ -3652,6 +3678,7 @@ static
> void amdgpu_device_unlock_adev(struct amdgpu_device *adev)
>  	if (!amdgpu_sriov_vf(adev))
>                  amdgpu_amdkfd_post_reset(adev);
>  	amdgpu_vf_error_trans_all(adev);
> +	adev->mp1_state = PP_MP1_STATE_NONE;
>  	adev->in_gpu_reset = 0;
>  	mutex_unlock(&adev->lock_reset);
>  }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> index 4743801357c5..800d0ceb14b4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> @@ -1094,7 +1094,9 @@ amdgpu_pci_shutdown(struct pci_dev *pdev)
>  	 * unfortunately we can't detect certain
>  	 * hypervisors so just do this all the time.
>  	 */
> +	adev->mp1_state = PP_MP1_STATE_UNLOAD;
>  	amdgpu_device_ip_suspend(adev);
> +	adev->mp1_state = PP_MP1_STATE_NONE;
>  }
> 
>  static int amdgpu_pmops_suspend(struct device *dev)
> --
> 2.20.1
> 
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list