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

Commit 3c704e93 authored by Chunming Zhou's avatar Chunming Zhou Committed by Alex Deucher
Browse files

drm/amdgpu: add helper function for kernel submission

parent d1ff9086
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -864,6 +864,13 @@ enum amdgpu_ring_type {

extern struct amd_sched_backend_ops amdgpu_sched_ops;

int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev,
					 struct amdgpu_ring *ring,
					 struct amdgpu_ib *ibs,
					 unsigned num_ibs,
					 int (*free_job)(struct amdgpu_cs_parser *),
					 void *owner);

struct amdgpu_ring {
	struct amdgpu_device		*adev;
	const struct amdgpu_ring_funcs	*funcs;
+35 −0
Original line number Diff line number Diff line
@@ -108,3 +108,38 @@ struct amd_sched_backend_ops amdgpu_sched_ops = {
	.process_job = amdgpu_sched_process_job
};

int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev,
					 struct amdgpu_ring *ring,
					 struct amdgpu_ib *ibs,
					 unsigned num_ibs,
					 int (*free_job)(struct amdgpu_cs_parser *),
					 void *owner)
{
	int r = 0;
	if (amdgpu_enable_scheduler) {
		uint64_t v_seq;
		struct amdgpu_cs_parser *sched_job =
			amdgpu_cs_parser_create(adev,
						owner,
						adev->kernel_ctx,
						ibs, 1);
		if(!sched_job) {
			return -ENOMEM;
		}
		sched_job->free_job = free_job;
		v_seq = atomic64_inc_return(&adev->kernel_ctx->rings[ring->idx].c_entity.last_queued_v_seq);
		ibs[num_ibs - 1].sequence = v_seq;
		amd_sched_push_job(ring->scheduler,
				   &adev->kernel_ctx->rings[ring->idx].c_entity,
				   sched_job);
		r = amd_sched_wait_emit(
			&adev->kernel_ctx->rings[ring->idx].c_entity,
			v_seq,
			false,
			-1);
		if (r)
			WARN(true, "emit timeout\n");
	} else
		r = amdgpu_ib_schedule(adev, 1, ibs, owner);
	return r;
}