diff options
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | 35 |
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 | ||
865 | extern struct amd_sched_backend_ops amdgpu_sched_ops; | 865 | extern struct amd_sched_backend_ops amdgpu_sched_ops; |
866 | 866 | ||
867 | int 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 | |||
867 | struct amdgpu_ring { | 874 | struct 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 | ||
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 | } | ||