diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4966-drm-amdgpu-add-amdgpu_job_submit_direct-helper.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/4966-drm-amdgpu-add-amdgpu_job_submit_direct-helper.patch | 318 |
1 files changed, 318 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4966-drm-amdgpu-add-amdgpu_job_submit_direct-helper.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4966-drm-amdgpu-add-amdgpu_job_submit_direct-helper.patch new file mode 100644 index 00000000..b2f9ff5d --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4966-drm-amdgpu-add-amdgpu_job_submit_direct-helper.patch @@ -0,0 +1,318 @@ +From 425e2affec4b98d562de8d362016f322c1213394 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Fri, 13 Jul 2018 16:29:10 +0200 +Subject: [PATCH 4966/5725] drm/amdgpu: add amdgpu_job_submit_direct helper +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +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> +Signed-off-by: Raveendra Talabattula <raveendra.talabattula@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 15 +++++++++++++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_job.h | 4 ++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 17 ++++++----------- + drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 4 +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 20 ++++++-------------- + drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 17 ++++------------- + drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | 20 ++++++-------------- + drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c | 20 ++++++-------------- + 8 files changed, 48 insertions(+), 69 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +index 27263f2..1be5575 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, + return 0; + } + ++int amdgpu_job_submit_direct(struct amdgpu_job *job, struct amdgpu_ring *ring, ++ struct dma_fence **fence) ++{ ++ int r; ++ ++ job->base.sched = &ring->sched; ++ r = amdgpu_ib_schedule(ring, job->num_ibs, job->ibs, NULL, fence); ++ job->fence = dma_fence_get(*fence); ++ if (r) ++ return r; ++ ++ amdgpu_job_free(job); ++ return 0; ++} ++ + static struct dma_fence *amdgpu_job_dependency(struct drm_sched_job *sched_job, + struct drm_sched_entity *s_entity) + { +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h +index c663c19..d77fd23 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h +@@ -33,6 +33,8 @@ + #define to_amdgpu_job(sched_job) \ + container_of((sched_job), struct amdgpu_job, base) + ++struct amdgpu_fence; ++ + struct amdgpu_job { + struct drm_sched_job base; + struct amdgpu_device *adev; +@@ -68,4 +70,6 @@ void amdgpu_job_free_resources(struct amdgpu_job *job); + void amdgpu_job_free(struct amdgpu_job *job); + int amdgpu_job_submit(struct amdgpu_job *job, struct drm_sched_entity *entity, + void *owner, struct dma_fence **f); ++int amdgpu_job_submit_direct(struct amdgpu_job *job, struct amdgpu_ring *ring, ++ struct dma_fence **fence); + #endif +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +index 8bf244e..addc397 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +@@ -2273,24 +2273,19 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset, + + amdgpu_ring_pad_ib(ring, &job->ibs[0]); + WARN_ON(job->ibs[0].length_dw > num_dw); +- if (direct_submit) { +- r = amdgpu_ib_schedule(ring, job->num_ibs, job->ibs, +- NULL, fence); +- job->fence = dma_fence_get(*fence); +- if (r) +- DRM_ERROR("Error scheduling IBs (%d)\n", r); +- amdgpu_job_free(job); +- } else { ++ if (direct_submit) ++ r = amdgpu_job_submit_direct(job, ring, fence); ++ else + r = amdgpu_job_submit(job, &adev->mman.entity, + AMDGPU_FENCE_OWNER_UNDEFINED, fence); +- if (r) +- goto error_free; +- } ++ if (r) ++ goto error_free; + + return r; + + error_free: + amdgpu_job_free(job); ++ DRM_ERROR("Error scheduling IBs (%d)\n", r); + return r; + } + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c +index 7c3b3ac..2298571 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c +@@ -1063,12 +1063,10 @@ static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo, + if (r < 0) + goto err_free; + +- r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); +- job->fence = dma_fence_get(f); ++ r = amdgpu_job_submit_direct(job, ring, &f); + if (r) + goto err_free; + +- amdgpu_job_free(job); + } else { + r = amdgpu_sync_resv(adev, &job->sync, bo->tbo.resv, + 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 27853b2..7c23719 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c +@@ -471,12 +471,10 @@ int amdgpu_vce_get_create_msg(struct amdgpu_ring *ring, uint32_t handle, + for (i = ib->length_dw; i < ib_size_dw; ++i) + ib->ptr[i] = 0x0; + +- r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); +- job->fence = dma_fence_get(f); ++ r = amdgpu_job_submit_direct(job, ring, &f); + if (r) + goto err; + +- amdgpu_job_free(job); + if (fence) + *fence = dma_fence_get(f); + dma_fence_put(f); +@@ -533,19 +531,13 @@ int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, + for (i = ib->length_dw; i < ib_size_dw; ++i) + ib->ptr[i] = 0x0; + +- if (direct) { +- r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); +- job->fence = dma_fence_get(f); +- if (r) +- goto err; +- +- amdgpu_job_free(job); +- } else { ++ if (direct) ++ r = amdgpu_job_submit_direct(job, ring, &f); ++ else + r = amdgpu_job_submit(job, &ring->adev->vce.entity, + AMDGPU_FENCE_OWNER_UNDEFINED, &f); +- if (r) +- goto err; +- } ++ if (r) ++ goto err; + + if (fence) + *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 e5bcdbb..414a67e 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c +@@ -311,13 +311,10 @@ static int amdgpu_vcn_dec_send_msg(struct amdgpu_ring *ring, + } + ib->length_dw = 16; + +- r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); +- job->fence = dma_fence_get(f); ++ r = amdgpu_job_submit_direct(job, ring, &f); + if (r) + goto err_free; + +- amdgpu_job_free(job); +- + amdgpu_bo_fence(bo, f, false); + amdgpu_bo_unreserve(bo); + amdgpu_bo_unref(&bo); +@@ -504,12 +501,10 @@ static int amdgpu_vcn_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t hand + for (i = ib->length_dw; i < ib_size_dw; ++i) + ib->ptr[i] = 0x0; + +- r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); +- job->fence = dma_fence_get(f); ++ r = amdgpu_job_submit_direct(job, ring, &f); + if (r) + goto err; + +- amdgpu_job_free(job); + if (fence) + *fence = dma_fence_get(f); + dma_fence_put(f); +@@ -558,12 +553,10 @@ static int amdgpu_vcn_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t han + for (i = ib->length_dw; i < ib_size_dw; ++i) + ib->ptr[i] = 0x0; + +- r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); +- job->fence = dma_fence_get(f); ++ r = amdgpu_job_submit_direct(job, ring, &f); + if (r) + goto err; + +- amdgpu_job_free(job); + if (fence) + *fence = dma_fence_get(f); + dma_fence_put(f); +@@ -671,12 +664,10 @@ static int amdgpu_vcn_jpeg_set_reg(struct amdgpu_ring *ring, uint32_t handle, + } + ib->length_dw = 16; + +- r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); +- job->fence = dma_fence_get(f); ++ r = amdgpu_job_submit_direct(job, ring, &f); + if (r) + goto err; + +- amdgpu_job_free(job); + if (fence) + *fence = dma_fence_get(f); + 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 068fe13..f832c5e 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 + for (i = ib->length_dw; i < ib_size_dw; ++i) + ib->ptr[i] = 0x0; + +- r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); +- job->fence = dma_fence_get(f); ++ r = amdgpu_job_submit_direct(job, ring, &f); + if (r) + goto err; + +- amdgpu_job_free(job); + if (fence) + *fence = dma_fence_get(f); + dma_fence_put(f); +@@ -312,19 +310,13 @@ static int uvd_v6_0_enc_get_destroy_msg(struct amdgpu_ring *ring, + for (i = ib->length_dw; i < ib_size_dw; ++i) + ib->ptr[i] = 0x0; + +- if (direct) { +- r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); +- job->fence = dma_fence_get(f); +- if (r) +- goto err; +- +- amdgpu_job_free(job); +- } else { ++ if (direct) ++ r = amdgpu_job_submit_direct(job, ring, &f); ++ else + r = amdgpu_job_submit(job, &ring->adev->vce.entity, + AMDGPU_FENCE_OWNER_UNDEFINED, &f); +- if (r) +- goto err; +- } ++ if (r) ++ goto err; + + if (fence) + *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 c6365b0..423b74e 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 + for (i = ib->length_dw; i < ib_size_dw; ++i) + ib->ptr[i] = 0x0; + +- r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); +- job->fence = dma_fence_get(f); ++ r = amdgpu_job_submit_direct(job, ring, &f); + if (r) + goto err; + +- amdgpu_job_free(job); + if (fence) + *fence = dma_fence_get(f); + dma_fence_put(f); +@@ -313,19 +311,13 @@ int uvd_v7_0_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, + for (i = ib->length_dw; i < ib_size_dw; ++i) + ib->ptr[i] = 0x0; + +- if (direct) { +- r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); +- job->fence = dma_fence_get(f); +- if (r) +- goto err; +- +- amdgpu_job_free(job); +- } else { ++ if (direct) ++ r = amdgpu_job_submit_direct(job, ring, &f); ++ else + r = amdgpu_job_submit(job, &ring->adev->vce.entity, + AMDGPU_FENCE_OWNER_UNDEFINED, &f); +- if (r) +- goto err; +- } ++ if (r) ++ goto err; + + if (fence) + *fence = dma_fence_get(f); +-- +2.7.4 + |