Commit 037b98a2 authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/amdgpu: move UVD and VCE sched entity init after sched init



We need kernel scheduling entities to deal with handle clean up
if apps are not cleaned up properly.  With commit 56e44960
("drm/sched: Convert the GPU scheduler to variable number of run-queues")
the scheduler entities have to be created after scheduler init, so
change the ordering to fix this.

v2: Leave logic in UVD and VCE code

Fixes: 56e44960 ("drm/sched: Convert the GPU scheduler to variable number of run-queues")
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarLuben Tuikov <ltuikov89@gmail.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: ltuikov89@gmail.com
parent 8ed79c40
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -2584,6 +2584,18 @@ static int amdgpu_device_init_schedulers(struct amdgpu_device *adev)
				  ring->name);
			return r;
		}
		r = amdgpu_uvd_entity_init(adev, ring);
		if (r) {
			DRM_ERROR("Failed to create UVD scheduling entity on ring %s.\n",
				  ring->name);
			return r;
		}
		r = amdgpu_vce_entity_init(adev, ring);
		if (r) {
			DRM_ERROR("Failed to create VCE scheduling entity on ring %s.\n",
				  ring->name);
			return r;
		}
	}

	amdgpu_xcp_update_partition_sched_list(adev);
+11 −11
Original line number Diff line number Diff line
@@ -399,21 +399,21 @@ int amdgpu_uvd_sw_fini(struct amdgpu_device *adev)
 *
 * @adev: amdgpu_device pointer
 *
 * Initialize the entity used for handle management in the kernel driver.
 */
int amdgpu_uvd_entity_init(struct amdgpu_device *adev)
int amdgpu_uvd_entity_init(struct amdgpu_device *adev, struct amdgpu_ring *ring)
{
	struct amdgpu_ring *ring;
	struct drm_gpu_scheduler *sched;
	if (ring == &adev->uvd.inst[0].ring) {
		struct drm_gpu_scheduler *sched = &ring->sched;
		int r;

	ring = &adev->uvd.inst[0].ring;
	sched = &ring->sched;
		r = drm_sched_entity_init(&adev->uvd.entity, DRM_SCHED_PRIORITY_NORMAL,
					  &sched, 1, NULL);
		if (r) {
			DRM_ERROR("Failed setting up UVD kernel entity.\n");
			return r;
		}
	}

	return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -73,7 +73,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_entity_init(struct amdgpu_device *adev, struct amdgpu_ring *ring);
int amdgpu_uvd_prepare_suspend(struct amdgpu_device *adev);
int amdgpu_uvd_suspend(struct amdgpu_device *adev);
int amdgpu_uvd_resume(struct amdgpu_device *adev);
+12 −12
Original line number Diff line number Diff line
@@ -231,21 +231,21 @@ int amdgpu_vce_sw_fini(struct amdgpu_device *adev)
 *
 * @adev: amdgpu_device pointer
 *
 * Initialize the entity used for handle management in the kernel driver.
 */
int amdgpu_vce_entity_init(struct amdgpu_device *adev)
int amdgpu_vce_entity_init(struct amdgpu_device *adev, struct amdgpu_ring *ring)
{
	struct amdgpu_ring *ring;
	struct drm_gpu_scheduler *sched;
	if (ring == &adev->vce.ring[0]) {
		struct drm_gpu_scheduler *sched = &ring->sched;
		int r;

	ring = &adev->vce.ring[0];
	sched = &ring->sched;
		r = drm_sched_entity_init(&adev->vce.entity, DRM_SCHED_PRIORITY_NORMAL,
					  &sched, 1, NULL);
		if (r != 0) {
			DRM_ERROR("Failed setting up VCE run queue.\n");
			return r;
		}
	}

	return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ struct amdgpu_vce {

int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size);
int amdgpu_vce_sw_fini(struct amdgpu_device *adev);
int amdgpu_vce_entity_init(struct amdgpu_device *adev);
int amdgpu_vce_entity_init(struct amdgpu_device *adev, struct amdgpu_ring *ring);
int amdgpu_vce_suspend(struct amdgpu_device *adev);
int amdgpu_vce_resume(struct amdgpu_device *adev);
void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp);
Loading