[PATCH] drm/amdgpu: Move IB pool init and fini.

Christian König ckoenig.leichtzumerken at gmail.com
Thu Mar 7 11:29:24 UTC 2019


Am 06.03.19 um 22:25 schrieb Andrey Grodzovsky:
> Problem:
> Using SDMA for TLB invalidation in certain ASICs exposed a problem
> of IB pool not being ready while SDMA already up on Init and already
> shutt down while SDMA still running on Fini. This caused
> IB allocation failure. Temproary fix was commited into a
> bringup branch but this is the generic fix.
>
> Fix:
> Init IB pool rigth after GMC is ready but before SDMA is ready.
> Do th opposite for Fini.
>
> Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 20 +++++++++++---------
>   1 file changed, 11 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 00def57..c05a551 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -1686,6 +1686,13 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)
>   		}
>   	}
>   
> +	r = amdgpu_ib_pool_init(adev);
> +	if (r) {
> +		dev_err(adev->dev, "IB initialization failed (%d).\n", r);
> +		amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_IB_INIT_FAIL, 0, r);
> +		goto init_failed;
> +	}
> +
>   	r = amdgpu_ucode_create_bo(adev); /* create ucode bo when sw_init complete*/
>   	if (r)
>   		goto init_failed;
> @@ -1888,7 +1895,8 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
>   	for (i = 0; i < adev->num_ip_blocks; i++) {
>   		if (!adev->ip_blocks[i].status.hw)
>   			continue;
> -		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {
> +		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC ||
> +		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SDMA) {

Why is that necessary?

>   			r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev);
>   			/* XXX handle errors */
>   			if (r) {
> @@ -1900,6 +1908,8 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
>   		}
>   	}
>   
> +	amdgpu_ib_pool_fini(adev);

Thinking more about it this should probably be done right before GMC SW 
fini.

IIRC we already have an extra case for this somewhere.

Christian.

> +
>   	for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
>   		if (!adev->ip_blocks[i].status.hw)
>   			continue;
> @@ -2651,13 +2661,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
>   	/* Get a log2 for easy divisions. */
>   	adev->mm_stats.log2_max_MBps = ilog2(max(1u, max_MBps));
>   
> -	r = amdgpu_ib_pool_init(adev);
> -	if (r) {
> -		dev_err(adev->dev, "IB initialization failed (%d).\n", r);
> -		amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_IB_INIT_FAIL, 0, r);
> -		goto failed;
> -	}
> -
>   	amdgpu_fbdev_init(adev);
>   
>   	r = amdgpu_pm_sysfs_init(adev);
> @@ -2735,7 +2738,6 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
>   		else
>   			drm_atomic_helper_shutdown(adev->ddev);
>   	}
> -	amdgpu_ib_pool_fini(adev);
>   	amdgpu_fence_driver_fini(adev);
>   	amdgpu_pm_sysfs_fini(adev);
>   	amdgpu_fbdev_fini(adev);



More information about the amd-gfx mailing list