diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | 35 |
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 | ||
111 | int 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 | } | ||