aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2018-07-13 10:29:10 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-07-16 17:11:53 -0400
commitee913fd9e166384aacc0aa70ffd4e93ca41d54b0 (patch)
treef40d24be324f847674d905720f5411967c31dd85 /drivers/gpu/drm/amd
parent3320b8d2acd3d480d0dd4835d970067354eac915 (diff)
drm/amdgpu: add amdgpu_job_submit_direct helper
Make sure that we properly initialize at least the sched member. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com> Acked-by: Chunming Zhou <david1.zhou@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_job.c15
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_job.h4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c17
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c20
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c17
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c20
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c20
8 files changed, 48 insertions, 70 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index 2496f2269bcb..0e2b18ccdf2e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -140,6 +140,21 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct drm_sched_entity *entity,
140 return 0; 140 return 0;
141} 141}
142 142
143int amdgpu_job_submit_direct(struct amdgpu_job *job, struct amdgpu_ring *ring,
144 struct dma_fence **fence)
145{
146 int r;
147
148 job->base.sched = &ring->sched;
149 r = amdgpu_ib_schedule(ring, job->num_ibs, job->ibs, NULL, fence);
150 job->fence = dma_fence_get(*fence);
151 if (r)
152 return r;
153
154 amdgpu_job_free(job);
155 return 0;
156}
157
143static struct dma_fence *amdgpu_job_dependency(struct drm_sched_job *sched_job, 158static struct dma_fence *amdgpu_job_dependency(struct drm_sched_job *sched_job,
144 struct drm_sched_entity *s_entity) 159 struct drm_sched_entity *s_entity)
145{ 160{
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
index c663c1925f91..d77fd232f7ce 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
@@ -33,6 +33,8 @@
33#define to_amdgpu_job(sched_job) \ 33#define to_amdgpu_job(sched_job) \
34 container_of((sched_job), struct amdgpu_job, base) 34 container_of((sched_job), struct amdgpu_job, base)
35 35
36struct amdgpu_fence;
37
36struct amdgpu_job { 38struct amdgpu_job {
37 struct drm_sched_job base; 39 struct drm_sched_job base;
38 struct amdgpu_device *adev; 40 struct amdgpu_device *adev;
@@ -68,4 +70,6 @@ void amdgpu_job_free_resources(struct amdgpu_job *job);
68void amdgpu_job_free(struct amdgpu_job *job); 70void amdgpu_job_free(struct amdgpu_job *job);
69int amdgpu_job_submit(struct amdgpu_job *job, struct drm_sched_entity *entity, 71int amdgpu_job_submit(struct amdgpu_job *job, struct drm_sched_entity *entity,
70 void *owner, struct dma_fence **f); 72 void *owner, struct dma_fence **f);
73int amdgpu_job_submit_direct(struct amdgpu_job *job, struct amdgpu_ring *ring,
74 struct dma_fence **fence);
71#endif 75#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 9958e76d1c78..13977ea6a097 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -2075,24 +2075,19 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset,
2075 2075
2076 amdgpu_ring_pad_ib(ring, &job->ibs[0]); 2076 amdgpu_ring_pad_ib(ring, &job->ibs[0]);
2077 WARN_ON(job->ibs[0].length_dw > num_dw); 2077 WARN_ON(job->ibs[0].length_dw > num_dw);
2078 if (direct_submit) { 2078 if (direct_submit)
2079 r = amdgpu_ib_schedule(ring, job->num_ibs, job->ibs, 2079 r = amdgpu_job_submit_direct(job, ring, fence);
2080 NULL, fence); 2080 else
2081 job->fence = dma_fence_get(*fence);
2082 if (r)
2083 DRM_ERROR("Error scheduling IBs (%d)\n", r);
2084 amdgpu_job_free(job);
2085 } else {
2086 r = amdgpu_job_submit(job, &adev->mman.entity, 2081 r = amdgpu_job_submit(job, &adev->mman.entity,
2087 AMDGPU_FENCE_OWNER_UNDEFINED, fence); 2082 AMDGPU_FENCE_OWNER_UNDEFINED, fence);
2088 if (r) 2083 if (r)
2089 goto error_free; 2084 goto error_free;
2090 }
2091 2085
2092 return r; 2086 return r;
2093 2087
2094error_free: 2088error_free:
2095 amdgpu_job_free(job); 2089 amdgpu_job_free(job);
2090 DRM_ERROR("Error scheduling IBs (%d)\n", r);
2096 return r; 2091 return r;
2097} 2092}
2098 2093
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index 7738d2b90dae..d708970244eb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -1062,12 +1062,9 @@ static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo,
1062 if (r < 0) 1062 if (r < 0)
1063 goto err_free; 1063 goto err_free;
1064 1064
1065 r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 1065 r = amdgpu_job_submit_direct(job, ring, &f);
1066 job->fence = dma_fence_get(f);
1067 if (r) 1066 if (r)
1068 goto err_free; 1067 goto err_free;
1069
1070 amdgpu_job_free(job);
1071 } else { 1068 } else {
1072 r = amdgpu_sync_resv(adev, &job->sync, bo->tbo.resv, 1069 r = amdgpu_sync_resv(adev, &job->sync, bo->tbo.resv,
1073 AMDGPU_FENCE_OWNER_UNDEFINED, false); 1070 AMDGPU_FENCE_OWNER_UNDEFINED, false);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index 7dfb4c4b19c5..86182c966ed6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -469,12 +469,10 @@ int amdgpu_vce_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,
469 for (i = ib->length_dw; i < ib_size_dw; ++i) 469 for (i = ib->length_dw; i < ib_size_dw; ++i)
470 ib->ptr[i] = 0x0; 470 ib->ptr[i] = 0x0;
471 471
472 r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 472 r = amdgpu_job_submit_direct(job, ring, &f);
473 job->fence = dma_fence_get(f);
474 if (r) 473 if (r)
475 goto err; 474 goto err;
476 475
477 amdgpu_job_free(job);
478 if (fence) 476 if (fence)
479 *fence = dma_fence_get(f); 477 *fence = dma_fence_get(f);
480 dma_fence_put(f); 478 dma_fence_put(f);
@@ -531,19 +529,13 @@ int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
531 for (i = ib->length_dw; i < ib_size_dw; ++i) 529 for (i = ib->length_dw; i < ib_size_dw; ++i)
532 ib->ptr[i] = 0x0; 530 ib->ptr[i] = 0x0;
533 531
534 if (direct) { 532 if (direct)
535 r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 533 r = amdgpu_job_submit_direct(job, ring, &f);
536 job->fence = dma_fence_get(f); 534 else
537 if (r)
538 goto err;
539
540 amdgpu_job_free(job);
541 } else {
542 r = amdgpu_job_submit(job, &ring->adev->vce.entity, 535 r = amdgpu_job_submit(job, &ring->adev->vce.entity,
543 AMDGPU_FENCE_OWNER_UNDEFINED, &f); 536 AMDGPU_FENCE_OWNER_UNDEFINED, &f);
544 if (r) 537 if (r)
545 goto err; 538 goto err;
546 }
547 539
548 if (fence) 540 if (fence)
549 *fence = dma_fence_get(f); 541 *fence = dma_fence_get(f);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 769c6723c9ca..798648a19710 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -308,13 +308,10 @@ static int amdgpu_vcn_dec_send_msg(struct amdgpu_ring *ring,
308 } 308 }
309 ib->length_dw = 16; 309 ib->length_dw = 16;
310 310
311 r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 311 r = amdgpu_job_submit_direct(job, ring, &f);
312 job->fence = dma_fence_get(f);
313 if (r) 312 if (r)
314 goto err_free; 313 goto err_free;
315 314
316 amdgpu_job_free(job);
317
318 amdgpu_bo_fence(bo, f, false); 315 amdgpu_bo_fence(bo, f, false);
319 amdgpu_bo_unreserve(bo); 316 amdgpu_bo_unreserve(bo);
320 amdgpu_bo_unref(&bo); 317 amdgpu_bo_unref(&bo);
@@ -499,12 +496,10 @@ static int amdgpu_vcn_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t hand
499 for (i = ib->length_dw; i < ib_size_dw; ++i) 496 for (i = ib->length_dw; i < ib_size_dw; ++i)
500 ib->ptr[i] = 0x0; 497 ib->ptr[i] = 0x0;
501 498
502 r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 499 r = amdgpu_job_submit_direct(job, ring, &f);
503 job->fence = dma_fence_get(f);
504 if (r) 500 if (r)
505 goto err; 501 goto err;
506 502
507 amdgpu_job_free(job);
508 if (fence) 503 if (fence)
509 *fence = dma_fence_get(f); 504 *fence = dma_fence_get(f);
510 dma_fence_put(f); 505 dma_fence_put(f);
@@ -553,12 +548,10 @@ static int amdgpu_vcn_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t han
553 for (i = ib->length_dw; i < ib_size_dw; ++i) 548 for (i = ib->length_dw; i < ib_size_dw; ++i)
554 ib->ptr[i] = 0x0; 549 ib->ptr[i] = 0x0;
555 550
556 r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 551 r = amdgpu_job_submit_direct(job, ring, &f);
557 job->fence = dma_fence_get(f);
558 if (r) 552 if (r)
559 goto err; 553 goto err;
560 554
561 amdgpu_job_free(job);
562 if (fence) 555 if (fence)
563 *fence = dma_fence_get(f); 556 *fence = dma_fence_get(f);
564 dma_fence_put(f); 557 dma_fence_put(f);
@@ -666,12 +659,10 @@ static int amdgpu_vcn_jpeg_set_reg(struct amdgpu_ring *ring, uint32_t handle,
666 } 659 }
667 ib->length_dw = 16; 660 ib->length_dw = 16;
668 661
669 r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 662 r = amdgpu_job_submit_direct(job, ring, &f);
670 job->fence = dma_fence_get(f);
671 if (r) 663 if (r)
672 goto err; 664 goto err;
673 665
674 amdgpu_job_free(job);
675 if (fence) 666 if (fence)
676 *fence = dma_fence_get(f); 667 *fence = dma_fence_get(f);
677 dma_fence_put(f); 668 dma_fence_put(f);
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
index 591d1f211823..b796dc8375cd 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
@@ -248,12 +248,10 @@ static int uvd_v6_0_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handle
248 for (i = ib->length_dw; i < ib_size_dw; ++i) 248 for (i = ib->length_dw; i < ib_size_dw; ++i)
249 ib->ptr[i] = 0x0; 249 ib->ptr[i] = 0x0;
250 250
251 r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 251 r = amdgpu_job_submit_direct(job, ring, &f);
252 job->fence = dma_fence_get(f);
253 if (r) 252 if (r)
254 goto err; 253 goto err;
255 254
256 amdgpu_job_free(job);
257 if (fence) 255 if (fence)
258 *fence = dma_fence_get(f); 256 *fence = dma_fence_get(f);
259 dma_fence_put(f); 257 dma_fence_put(f);
@@ -312,19 +310,13 @@ static int uvd_v6_0_enc_get_destroy_msg(struct amdgpu_ring *ring,
312 for (i = ib->length_dw; i < ib_size_dw; ++i) 310 for (i = ib->length_dw; i < ib_size_dw; ++i)
313 ib->ptr[i] = 0x0; 311 ib->ptr[i] = 0x0;
314 312
315 if (direct) { 313 if (direct)
316 r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 314 r = amdgpu_job_submit_direct(job, ring, &f);
317 job->fence = dma_fence_get(f); 315 else
318 if (r)
319 goto err;
320
321 amdgpu_job_free(job);
322 } else {
323 r = amdgpu_job_submit(job, &ring->adev->vce.entity, 316 r = amdgpu_job_submit(job, &ring->adev->vce.entity,
324 AMDGPU_FENCE_OWNER_UNDEFINED, &f); 317 AMDGPU_FENCE_OWNER_UNDEFINED, &f);
325 if (r) 318 if (r)
326 goto err; 319 goto err;
327 }
328 320
329 if (fence) 321 if (fence)
330 *fence = dma_fence_get(f); 322 *fence = dma_fence_get(f);
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
index ceb0a7037897..831bb995b0ed 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
@@ -250,12 +250,10 @@ static int uvd_v7_0_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handle
250 for (i = ib->length_dw; i < ib_size_dw; ++i) 250 for (i = ib->length_dw; i < ib_size_dw; ++i)
251 ib->ptr[i] = 0x0; 251 ib->ptr[i] = 0x0;
252 252
253 r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 253 r = amdgpu_job_submit_direct(job, ring, &f);
254 job->fence = dma_fence_get(f);
255 if (r) 254 if (r)
256 goto err; 255 goto err;
257 256
258 amdgpu_job_free(job);
259 if (fence) 257 if (fence)
260 *fence = dma_fence_get(f); 258 *fence = dma_fence_get(f);
261 dma_fence_put(f); 259 dma_fence_put(f);
@@ -313,19 +311,13 @@ int uvd_v7_0_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
313 for (i = ib->length_dw; i < ib_size_dw; ++i) 311 for (i = ib->length_dw; i < ib_size_dw; ++i)
314 ib->ptr[i] = 0x0; 312 ib->ptr[i] = 0x0;
315 313
316 if (direct) { 314 if (direct)
317 r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 315 r = amdgpu_job_submit_direct(job, ring, &f);
318 job->fence = dma_fence_get(f); 316 else
319 if (r)
320 goto err;
321
322 amdgpu_job_free(job);
323 } else {
324 r = amdgpu_job_submit(job, &ring->adev->vce.entity, 317 r = amdgpu_job_submit(job, &ring->adev->vce.entity,
325 AMDGPU_FENCE_OWNER_UNDEFINED, &f); 318 AMDGPU_FENCE_OWNER_UNDEFINED, &f);
326 if (r) 319 if (r)
327 goto err; 320 goto err;
328 }
329 321
330 if (fence) 322 if (fence)
331 *fence = dma_fence_get(f); 323 *fence = dma_fence_get(f);