diff options
author | Christian König <christian.koenig@amd.com> | 2018-07-13 10:29:10 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-07-16 17:11:53 -0400 |
commit | ee913fd9e166384aacc0aa70ffd4e93ca41d54b0 (patch) | |
tree | f40d24be324f847674d905720f5411967c31dd85 /drivers/gpu/drm/amd | |
parent | 3320b8d2acd3d480d0dd4835d970067354eac915 (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.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_job.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c | 20 |
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 | ||
143 | int 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 | |||
143 | static struct dma_fence *amdgpu_job_dependency(struct drm_sched_job *sched_job, | 158 | static 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 | ||
36 | struct amdgpu_fence; | ||
37 | |||
36 | struct amdgpu_job { | 38 | struct 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); | |||
68 | void amdgpu_job_free(struct amdgpu_job *job); | 70 | void amdgpu_job_free(struct amdgpu_job *job); |
69 | int amdgpu_job_submit(struct amdgpu_job *job, struct drm_sched_entity *entity, | 71 | int 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); |
73 | int 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 | ||
2094 | error_free: | 2088 | error_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); |