aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
index b913c22dd6b2..d682fabca958 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
@@ -108,3 +108,38 @@ struct amd_sched_backend_ops amdgpu_sched_ops = {
108 .process_job = amdgpu_sched_process_job 108 .process_job = amdgpu_sched_process_job
109}; 109};
110 110
111int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev,
112 struct amdgpu_ring *ring,
113 struct amdgpu_ib *ibs,
114 unsigned num_ibs,
115 int (*free_job)(struct amdgpu_cs_parser *),
116 void *owner)
117{
118 int r = 0;
119 if (amdgpu_enable_scheduler) {
120 uint64_t v_seq;
121 struct amdgpu_cs_parser *sched_job =
122 amdgpu_cs_parser_create(adev,
123 owner,
124 adev->kernel_ctx,
125 ibs, 1);
126 if(!sched_job) {
127 return -ENOMEM;
128 }
129 sched_job->free_job = free_job;
130 v_seq = atomic64_inc_return(&adev->kernel_ctx->rings[ring->idx].c_entity.last_queued_v_seq);
131 ibs[num_ibs - 1].sequence = v_seq;
132 amd_sched_push_job(ring->scheduler,
133 &adev->kernel_ctx->rings[ring->idx].c_entity,
134 sched_job);
135 r = amd_sched_wait_emit(
136 &adev->kernel_ctx->rings[ring->idx].c_entity,
137 v_seq,
138 false,
139 -1);
140 if (r)
141 WARN(true, "emit timeout\n");
142 } else
143 r = amdgpu_ib_schedule(adev, 1, ibs, owner);
144 return r;
145}