aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/0179-drm-amdgpu-cleanup-VM-handling-in-the-CS-a-bit.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0179-drm-amdgpu-cleanup-VM-handling-in-the-CS-a-bit.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/0179-drm-amdgpu-cleanup-VM-handling-in-the-CS-a-bit.patch224
1 files changed, 224 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0179-drm-amdgpu-cleanup-VM-handling-in-the-CS-a-bit.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0179-drm-amdgpu-cleanup-VM-handling-in-the-CS-a-bit.patch
new file mode 100644
index 00000000..b97dbd3a
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0179-drm-amdgpu-cleanup-VM-handling-in-the-CS-a-bit.patch
@@ -0,0 +1,224 @@
+From 20d9007565548ee9770308ab2d921a6e52447955 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Fri, 17 Aug 2018 15:07:13 +0200
+Subject: [PATCH 0179/2940] drm/amdgpu: cleanup VM handling in the CS a bit
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Add a helper function for getting the root PD addr and cleanup join the
+two VM related functions and cleanup the function name.
+
+No functional change.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Huang Rui <ray.huang@amd.com>
+Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 160 ++++++++++++-------------
+ 1 file changed, 74 insertions(+), 86 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+index 9af07d366107..e676f41745ad 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+@@ -812,8 +812,9 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error,
+ amdgpu_bo_unref(&parser->uf_entry.robj);
+ }
+
+-static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
++static int amdgpu_cs_vm_handling(struct amdgpu_cs_parser *p)
+ {
++ struct amdgpu_ring *ring = to_amdgpu_ring(p->entity->rq->sched);
+ struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
+ struct amdgpu_device *adev = p->adev;
+ struct amdgpu_vm *vm = &fpriv->vm;
+@@ -822,6 +823,71 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
+ struct amdgpu_bo *bo;
+ int r;
+
++ /* Only for UVD/VCE VM emulation */
++ if (ring->funcs->parse_cs || ring->funcs->patch_cs_in_place) {
++ unsigned i, j;
++
++ for (i = 0, j = 0; i < p->nchunks && j < p->job->num_ibs; i++) {
++ struct drm_amdgpu_cs_chunk_ib *chunk_ib;
++ struct amdgpu_bo_va_mapping *m;
++ struct amdgpu_bo *aobj = NULL;
++ struct amdgpu_cs_chunk *chunk;
++ uint64_t offset, va_start;
++ struct amdgpu_ib *ib;
++ uint8_t *kptr;
++
++ chunk = &p->chunks[i];
++ ib = &p->job->ibs[j];
++ chunk_ib = chunk->kdata;
++
++ if (chunk->chunk_id != AMDGPU_CHUNK_ID_IB)
++ continue;
++
++ va_start = chunk_ib->va_start & AMDGPU_VA_HOLE_MASK;
++ r = amdgpu_cs_find_mapping(p, va_start, &aobj, &m);
++ if (r) {
++ DRM_ERROR("IB va_start is invalid\n");
++ return r;
++ }
++
++ if ((va_start + chunk_ib->ib_bytes) >
++ (m->last + 1) * AMDGPU_GPU_PAGE_SIZE) {
++ DRM_ERROR("IB va_start+ib_bytes is invalid\n");
++ return -EINVAL;
++ }
++
++ /* the IB should be reserved at this point */
++ r = amdgpu_bo_kmap(aobj, (void **)&kptr);
++ if (r) {
++ return r;
++ }
++
++ offset = m->start * AMDGPU_GPU_PAGE_SIZE;
++ kptr += va_start - offset;
++
++ if (ring->funcs->parse_cs) {
++ memcpy(ib->ptr, kptr, chunk_ib->ib_bytes);
++ amdgpu_bo_kunmap(aobj);
++
++ r = amdgpu_ring_parse_cs(ring, p, j);
++ if (r)
++ return r;
++ } else {
++ ib->ptr = (uint32_t *)kptr;
++ r = amdgpu_ring_patch_cs_in_place(ring, p, j);
++ amdgpu_bo_kunmap(aobj);
++ if (r)
++ return r;
++ }
++
++ j++;
++ }
++ }
++
++ if (!p->job->vm)
++ return amdgpu_cs_sync_rings(p);
++
++
+ r = amdgpu_vm_clear_freed(adev, vm, NULL);
+ if (r)
+ return r;
+@@ -884,6 +950,12 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
+ if (r)
+ return r;
+
++ r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv);
++ if (r)
++ return r;
++
++ p->job->vm_pd_addr = amdgpu_bo_gpu_offset(vm->root.base.bo);
++
+ if (amdgpu_vm_debug) {
+ /* Invalidate all BOs to test for userspace bugs */
+ amdgpu_bo_list_for_each_entry(e, p->bo_list) {
+@@ -895,90 +967,6 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
+ }
+ }
+
+- return r;
+-}
+-
+-static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev,
+- struct amdgpu_cs_parser *p)
+-{
+- struct amdgpu_ring *ring = to_amdgpu_ring(p->entity->rq->sched);
+- struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
+- struct amdgpu_vm *vm = &fpriv->vm;
+- int r;
+-
+- /* Only for UVD/VCE VM emulation */
+- if (ring->funcs->parse_cs || ring->funcs->patch_cs_in_place) {
+- unsigned i, j;
+-
+- for (i = 0, j = 0; i < p->nchunks && j < p->job->num_ibs; i++) {
+- struct drm_amdgpu_cs_chunk_ib *chunk_ib;
+- struct amdgpu_bo_va_mapping *m;
+- struct amdgpu_bo *aobj = NULL;
+- struct amdgpu_cs_chunk *chunk;
+- uint64_t offset, va_start;
+- struct amdgpu_ib *ib;
+- uint8_t *kptr;
+-
+- chunk = &p->chunks[i];
+- ib = &p->job->ibs[j];
+- chunk_ib = chunk->kdata;
+-
+- if (chunk->chunk_id != AMDGPU_CHUNK_ID_IB)
+- continue;
+-
+- va_start = chunk_ib->va_start & AMDGPU_VA_HOLE_MASK;
+- r = amdgpu_cs_find_mapping(p, va_start, &aobj, &m);
+- if (r) {
+- DRM_ERROR("IB va_start is invalid\n");
+- return r;
+- }
+-
+- if ((va_start + chunk_ib->ib_bytes) >
+- (m->last + 1) * AMDGPU_GPU_PAGE_SIZE) {
+- DRM_ERROR("IB va_start+ib_bytes is invalid\n");
+- return -EINVAL;
+- }
+-
+- /* the IB should be reserved at this point */
+- r = amdgpu_bo_kmap(aobj, (void **)&kptr);
+- if (r) {
+- return r;
+- }
+-
+- offset = m->start * AMDGPU_GPU_PAGE_SIZE;
+- kptr += va_start - offset;
+-
+- if (ring->funcs->parse_cs) {
+- memcpy(ib->ptr, kptr, chunk_ib->ib_bytes);
+- amdgpu_bo_kunmap(aobj);
+-
+- r = amdgpu_ring_parse_cs(ring, p, j);
+- if (r)
+- return r;
+- } else {
+- ib->ptr = (uint32_t *)kptr;
+- r = amdgpu_ring_patch_cs_in_place(ring, p, j);
+- amdgpu_bo_kunmap(aobj);
+- if (r)
+- return r;
+- }
+-
+- j++;
+- }
+- }
+-
+- if (p->job->vm) {
+- p->job->vm_pd_addr = amdgpu_bo_gpu_offset(vm->root.base.bo);
+-
+- r = amdgpu_bo_vm_update_pte(p);
+- if (r)
+- return r;
+-
+- r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv);
+- if (r)
+- return r;
+- }
+-
+ return amdgpu_cs_sync_rings(p);
+ }
+
+@@ -1324,7 +1312,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
+ for (i = 0; i < parser.job->num_ibs; i++)
+ trace_amdgpu_cs(&parser, i);
+
+- r = amdgpu_cs_ib_vm_chunk(adev, &parser);
++ r = amdgpu_cs_vm_handling(&parser);
+ if (r)
+ goto out;
+
+--
+2.17.1
+