[PATCH] drm/amdgpu: Bypass GMC, UVD and VCE in hw_fini

Yu, Xiangliang Xiangliang.Yu at amd.com
Thu May 4 02:56:09 UTC 2017


Reviewed-by: Xiangliang Yu <Xiangliang.Yu at amd.com>



Thanks!
Xiangliang Yu


> -----Original Message-----
> From: Trigger Huang [mailto:trigger.huang at amd.com]
> Sent: Thursday, May 04, 2017 10:40 AM
> To: amd-gfx at lists.freedesktop.org
> Cc: Liu, Monk <Monk.Liu at amd.com>; Yu, Xiangliang
> <Xiangliang.Yu at amd.com>; Huang, Trigger <Trigger.Huang at amd.com>
> Subject: [PATCH] drm/amdgpu: Bypass GMC, UVD and VCE in hw_fini
> 
> Some hw finish operations should not be applied in SR-IOV case.
> This works as workaround to fix multi-VFs reboot/shutdown issues
> 
> Signed-off-by: Trigger Huang <trigger.huang at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c |  6 ++++++
> drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c |  8 +++++++-
> drivers/gpu/drm/amd/amdgpu/vce_v4_0.c | 10 ++++++++--
>  3 files changed, 21 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> index dc1e1c1..8f1eb6f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> @@ -781,6 +781,12 @@ static int gmc_v9_0_hw_fini(void *handle)  {
>  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> 
> +	if (amdgpu_sriov_vf(adev)) {
> +		/* full access mode, so don't touch any GMC register */
> +		DRM_INFO("For SRIOV client, shouldn't do anything.\n");
> +		return 0;
> +	}
> +
>  	amdgpu_irq_put(adev, &adev->mc.vm_fault, 0);
>  	gmc_v9_0_gart_disable(adev);
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
> b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
> index 6e9359d..2dc6127 100644
> --- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
> @@ -562,7 +562,13 @@ static int uvd_v7_0_hw_fini(void *handle)
>  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>  	struct amdgpu_ring *ring = &adev->uvd.ring;
> 
> -	uvd_v7_0_stop(adev);
> +	if (!amdgpu_sriov_vf(adev))
> +		uvd_v7_0_stop(adev);
> +	else {
> +		/* full access mode, so don't touch any UVD register */
> +		DRM_INFO("For SRIOV client, shouldn't do anything.\n");
> +	}
> +
>  	ring->ready = false;
> 
>  	return 0;
> diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> index 661f883..6dacada 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> @@ -505,8 +505,14 @@ static int vce_v4_0_hw_fini(void *handle)
>  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>  	int i;
> 
> -	/* vce_v4_0_wait_for_idle(handle); */
> -	vce_v4_0_stop(adev);
> +	if (!amdgpu_sriov_vf(adev)) {
> +		/* vce_v4_0_wait_for_idle(handle); */
> +		vce_v4_0_stop(adev);
> +	} else {
> +		/* full access mode, so don't touch any VCE register */
> +		DRM_INFO("For SRIOV client, shouldn't do anything.\n");
> +	}
> +
>  	for (i = 0; i < adev->vce.num_rings; i++)
>  		adev->vce.ring[i].ready = false;
> 
> --
> 2.7.4



More information about the amd-gfx mailing list