aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h7
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c35
2 files changed, 42 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 2619c78ec303..1e87acf35892 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -864,6 +864,13 @@ enum amdgpu_ring_type {
864 864
865extern struct amd_sched_backend_ops amdgpu_sched_ops; 865extern struct amd_sched_backend_ops amdgpu_sched_ops;
866 866
867int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev,
868 struct amdgpu_ring *ring,
869 struct amdgpu_ib *ibs,
870 unsigned num_ibs,
871 int (*free_job)(struct amdgpu_cs_parser *),
872 void *owner);
873
867struct amdgpu_ring { 874struct amdgpu_ring {
868 struct amdgpu_device *adev; 875 struct amdgpu_device *adev;
869 const struct amdgpu_ring_funcs *funcs; 876 const struct amdgpu_ring_funcs *funcs;
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}