[PATCH 1/2] drm/amdgpu/uvd: UVD entity initialization relys on ring initialization

Christian König ckoenig.leichtzumerken at gmail.com
Mon Aug 13 06:39:24 UTC 2018


Am 13.08.2018 um 05:10 schrieb Emily Deng:
> Entity init should after ring init, as the entity's sched_rq's initialization
> is in ring init.
>
> SWDEV-161495
>
> Signed-off-by: Emily Deng <Emily.Deng at amd.com>

Reviewed-by: Christian König <christian.koenig at amd.com> for the whole 
series.

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 32 +++++++++++++++++++++++---------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h |  1 +
>   drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c   |  4 ++++
>   drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c   |  4 ++++
>   drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c   |  2 ++
>   drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c   |  5 +++++
>   6 files changed, 39 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> index 632fa59..433a741 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> @@ -122,8 +122,6 @@ static void amdgpu_uvd_idle_work_handler(struct work_struct *work);
>   
>   int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
>   {
> -	struct amdgpu_ring *ring;
> -	struct drm_sched_rq *rq;
>   	unsigned long bo_size;
>   	const char *fw_name;
>   	const struct common_firmware_header *hdr;
> @@ -266,13 +264,6 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
>   		}
>   	}
>   
> -	ring = &adev->uvd.inst[0].ring;
> -	rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL];
> -	r = drm_sched_entity_init(&adev->uvd.entity, &rq, 1, NULL);
> -	if (r) {
> -		DRM_ERROR("Failed setting up UVD kernel entity.\n");
> -		return r;
> -	}
>   	for (i = 0; i < adev->uvd.max_handles; ++i) {
>   		atomic_set(&adev->uvd.handles[i], 0);
>   		adev->uvd.filp[i] = NULL;
> @@ -327,6 +318,29 @@ int amdgpu_uvd_sw_fini(struct amdgpu_device *adev)
>   	return 0;
>   }
>   
> +/**
> + * amdgpu_uvd_entity_init - init entity
> + *
> + * @adev: amdgpu_device pointer
> + *
> + */
> +int amdgpu_uvd_entity_init(struct amdgpu_device *adev)
> +{
> +	struct amdgpu_ring *ring;
> +	struct drm_sched_rq *rq;
> +	int r;
> +
> +	ring = &adev->uvd.inst[0].ring;
> +	rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL];
> +	r = drm_sched_entity_init(&adev->uvd.entity, &rq, 1, NULL);
> +	if (r) {
> +		DRM_ERROR("Failed setting up UVD kernel entity.\n");
> +		return r;
> +	}
> +
> +	return 0;
> +}
> +
>   int amdgpu_uvd_suspend(struct amdgpu_device *adev)
>   {
>   	unsigned size;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> index 33c5f80..a3ab1a4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> @@ -69,6 +69,7 @@ struct amdgpu_uvd {
>   
>   int amdgpu_uvd_sw_init(struct amdgpu_device *adev);
>   int amdgpu_uvd_sw_fini(struct amdgpu_device *adev);
> +int amdgpu_uvd_entity_init(struct amdgpu_device *adev);
>   int amdgpu_uvd_suspend(struct amdgpu_device *adev);
>   int amdgpu_uvd_resume(struct amdgpu_device *adev);
>   int amdgpu_uvd_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,
> diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
> index 6fed3d7..8a926d1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
> @@ -123,6 +123,10 @@ static int uvd_v4_2_sw_init(void *handle)
>   	ring = &adev->uvd.inst->ring;
>   	sprintf(ring->name, "uvd");
>   	r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0);
> +	if (r)
> +		return r;
> +
> +	r = amdgpu_uvd_entity_init(adev);
>   
>   	return r;
>   }
> diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
> index aeaa1ca..5024805 100644
> --- a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
> @@ -120,6 +120,10 @@ static int uvd_v5_0_sw_init(void *handle)
>   	ring = &adev->uvd.inst->ring;
>   	sprintf(ring->name, "uvd");
>   	r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0);
> +	if (r)
> +		return r;
> +
> +	r = amdgpu_uvd_entity_init(adev);
>   
>   	return r;
>   }
> diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
> index 598dbea..6ae82cc 100644
> --- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
> @@ -440,6 +440,8 @@ static int uvd_v6_0_sw_init(void *handle)
>   		}
>   	}
>   
> +	r = amdgpu_uvd_entity_init(adev);
> +
>   	return r;
>   }
>   
> diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
> index 5fab356..9b7f846 100644
> --- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
> @@ -410,6 +410,7 @@ static int uvd_v7_0_early_init(void *handle)
>   static int uvd_v7_0_sw_init(void *handle)
>   {
>   	struct amdgpu_ring *ring;
> +
>   	int i, j, r;
>   	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>   
> @@ -478,6 +479,10 @@ static int uvd_v7_0_sw_init(void *handle)
>   		}
>   	}
>   
> +	r = amdgpu_uvd_entity_init(adev);
> +	if (r)
> +		return r;
> +
>   	r = amdgpu_virt_alloc_mm_table(adev);
>   	if (r)
>   		return r;



More information about the amd-gfx mailing list