Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f839a24 authored by Christian König's avatar Christian König Committed by Alex Deucher
Browse files

drm/amdgpu: more scheduler cleanups v2



Embed the scheduler into the ring structure instead of allocating it.
Use the ring name directly instead of the id.

v2: rebased, whitespace cleanup

Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarJunwei Zhang <Jerry.Zhang@amd.com>
Reviewed-by: default avatarChunming <Zhou&lt;david1.zhou@amd.com>
parent 5ec92a76
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -433,7 +433,7 @@ int amdgpu_fence_driver_init(struct amdgpu_device *adev);
void amdgpu_fence_driver_fini(struct amdgpu_device *adev);
void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev);

void amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring);
int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring);
int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,
				   struct amdgpu_irq_src *irq_src,
				   unsigned irq_type);
@@ -891,7 +891,7 @@ struct amdgpu_ring {
	struct amdgpu_device		*adev;
	const struct amdgpu_ring_funcs	*funcs;
	struct amdgpu_fence_driver	fence_drv;
	struct amd_gpu_scheduler 	*sched;
	struct amd_gpu_scheduler 	sched;

	spinlock_t              fence_lock;
	struct mutex		*ring_lock;
+1 −1
Original line number Diff line number Diff line
@@ -848,7 +848,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
		job = kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL);
		if (!job)
			return -ENOMEM;
		job->base.sched = ring->sched;
		job->base.sched = &ring->sched;
		job->base.s_entity = &parser->ctx->rings[ring->idx].entity;
		job->adev = parser->adev;
		job->ibs = parser->ibs;
+5 −5
Original line number Diff line number Diff line
@@ -43,10 +43,10 @@ int amdgpu_ctx_init(struct amdgpu_device *adev, bool kernel,
		for (i = 0; i < adev->num_rings; i++) {
			struct amd_sched_rq *rq;
			if (kernel)
				rq = &adev->rings[i]->sched->kernel_rq;
				rq = &adev->rings[i]->sched.kernel_rq;
			else
				rq = &adev->rings[i]->sched->sched_rq;
			r = amd_sched_entity_init(adev->rings[i]->sched,
				rq = &adev->rings[i]->sched.sched_rq;
			r = amd_sched_entity_init(&adev->rings[i]->sched,
						  &ctx->rings[i].entity,
						  rq, amdgpu_sched_jobs);
			if (r)
@@ -55,7 +55,7 @@ int amdgpu_ctx_init(struct amdgpu_device *adev, bool kernel,

		if (i < adev->num_rings) {
			for (j = 0; j < i; j++)
				amd_sched_entity_fini(adev->rings[j]->sched,
				amd_sched_entity_fini(&adev->rings[j]->sched,
						      &ctx->rings[j].entity);
			kfree(ctx);
			return r;
@@ -75,7 +75,7 @@ void amdgpu_ctx_fini(struct amdgpu_ctx *ctx)

	if (amdgpu_enable_scheduler) {
		for (i = 0; i < adev->num_rings; i++)
			amd_sched_entity_fini(adev->rings[i]->sched,
			amd_sched_entity_fini(&adev->rings[i]->sched,
					      &ctx->rings[i].entity);
	}
}
+12 −11
Original line number Diff line number Diff line
@@ -609,9 +609,9 @@ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,
 * Init the fence driver for the requested ring (all asics).
 * Helper function for amdgpu_fence_driver_init().
 */
void amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring)
int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring)
{
	int i;
	int i, r;

	ring->fence_drv.cpu_addr = NULL;
	ring->fence_drv.gpu_addr = 0;
@@ -628,16 +628,18 @@ void amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring)
	init_waitqueue_head(&ring->fence_drv.fence_queue);

	if (amdgpu_enable_scheduler) {
		ring->sched = amd_sched_create(&amdgpu_sched_ops,
					       ring->idx,
					       amdgpu_sched_hw_submission,
					       (void *)ring->adev);
		if (!ring->sched)
			DRM_ERROR("Failed to create scheduler on ring %d.\n",
				  ring->idx);
		r = amd_sched_init(&ring->sched, &amdgpu_sched_ops,
				   amdgpu_sched_hw_submission, ring->name);
		if (r) {
			DRM_ERROR("Failed to create scheduler on ring %s.\n",
				  ring->name);
			return r;
		}
	}

	return 0;
}

/**
 * amdgpu_fence_driver_init - init the fence driver
 * for all possible rings.
@@ -683,8 +685,7 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
		wake_up_all(&ring->fence_drv.fence_queue);
		amdgpu_irq_put(adev, ring->fence_drv.irq_src,
			       ring->fence_drv.irq_type);
		if (ring->sched)
			amd_sched_destroy(ring->sched);
		amd_sched_fini(&ring->sched);
		ring->fence_drv.initialized = false;
	}
	mutex_unlock(&adev->ring_lock);
+3 −1
Original line number Diff line number Diff line
@@ -357,7 +357,9 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
		ring->adev = adev;
		ring->idx = adev->num_rings++;
		adev->rings[ring->idx] = ring;
		amdgpu_fence_driver_init_ring(ring);
		r = amdgpu_fence_driver_init_ring(ring);
		if (r)
			return r;
	}

	r = amdgpu_wb_get(adev, &ring->rptr_offs);
Loading