aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1999-drm-amdgpu-Refactor-amdgpu_cs_ib_vm_chunk-and-amdgpu.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1999-drm-amdgpu-Refactor-amdgpu_cs_ib_vm_chunk-and-amdgpu.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1999-drm-amdgpu-Refactor-amdgpu_cs_ib_vm_chunk-and-amdgpu.patch175
1 files changed, 175 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1999-drm-amdgpu-Refactor-amdgpu_cs_ib_vm_chunk-and-amdgpu.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1999-drm-amdgpu-Refactor-amdgpu_cs_ib_vm_chunk-and-amdgpu.patch
new file mode 100644
index 00000000..4368d43d
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1999-drm-amdgpu-Refactor-amdgpu_cs_ib_vm_chunk-and-amdgpu.patch
@@ -0,0 +1,175 @@
+From 6a4fd5e216c832b860ff80d5eacef0693fb8ad2f Mon Sep 17 00:00:00 2001
+From: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
+Date: Tue, 10 Oct 2017 16:50:16 -0400
+Subject: [PATCH 1999/4131] drm/amdgpu: Refactor amdgpu_cs_ib_vm_chunk and
+ amdgpu_cs_ib_fill.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This enables old fence waiting before reservation lock is aquired
+which in turn is part of a bigger solution to deadlock happening
+when gpu reset with VRAM recovery accures during intensive rendering.
+
+Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
+Reviewed-by: Christian König <christian.koenig@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 112 ++++++++++++++++++---------------
+ 1 file changed, 61 insertions(+), 51 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+index 7c6f574..5133b7a 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+@@ -886,15 +886,60 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev,
+ struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
+ struct amdgpu_vm *vm = &fpriv->vm;
+ struct amdgpu_ring *ring = p->job->ring;
+- int i, r;
++ int i, j, r;
++
++ for (i = 0, j = 0; i < p->nchunks && j < p->job->num_ibs; i++) {
++
++ struct amdgpu_cs_chunk *chunk;
++ struct amdgpu_ib *ib;
++ struct drm_amdgpu_cs_chunk_ib *chunk_ib;
++
++ chunk = &p->chunks[i];
++ ib = &p->job->ibs[j];
++ chunk_ib = (struct drm_amdgpu_cs_chunk_ib *)chunk->kdata;
++
++ if (chunk->chunk_id != AMDGPU_CHUNK_ID_IB)
++ continue;
++
++ if (p->job->ring->funcs->parse_cs) {
++ struct amdgpu_bo_va_mapping *m;
++ struct amdgpu_bo *aobj = NULL;
++ uint64_t offset;
++ uint8_t *kptr;
++
++ r = amdgpu_cs_find_mapping(p, chunk_ib->va_start,
++ &aobj, &m);
++ if (r) {
++ DRM_ERROR("IB va_start is invalid\n");
++ return r;
++ }
+
+- /* Only for UVD/VCE VM emulation */
+- if (ring->funcs->parse_cs) {
+- for (i = 0; i < p->job->num_ibs; i++) {
+- r = amdgpu_ring_parse_cs(ring, p, i);
++ if ((chunk_ib->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 += chunk_ib->va_start - offset;
++
++ memcpy(ib->ptr, kptr, chunk_ib->ib_bytes);
++ amdgpu_bo_kunmap(aobj);
++
++ /* Only for UVD/VCE VM emulation */
++ r = amdgpu_ring_parse_cs(ring, p, j);
+ if (r)
+ return r;
++
+ }
++
++ j++;
+ }
+
+ if (p->job->vm) {
+@@ -960,54 +1005,18 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev,
+
+ parser->job->ring = ring;
+
+- if (ring->funcs->parse_cs) {
+- struct amdgpu_bo_va_mapping *m;
+- struct amdgpu_bo *aobj = NULL;
+- uint64_t offset;
+- uint8_t *kptr;
+-
+- r = amdgpu_cs_find_mapping(parser, chunk_ib->va_start,
+- &aobj, &m);
+- if (r) {
+- DRM_ERROR("IB va_start is invalid\n");
+- return r;
+- }
+-
+- if ((chunk_ib->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 += chunk_ib->va_start - offset;
+-
+- r = amdgpu_ib_get(adev, vm, chunk_ib->ib_bytes, ib);
+- if (r) {
+- DRM_ERROR("Failed to get ib !\n");
+- return r;
+- }
+-
+- memcpy(ib->ptr, kptr, chunk_ib->ib_bytes);
+- amdgpu_bo_kunmap(aobj);
+- } else {
+- r = amdgpu_ib_get(adev, vm, 0, ib);
+- if (r) {
+- DRM_ERROR("Failed to get ib !\n");
+- return r;
+- }
+-
++ r = amdgpu_ib_get(adev, vm,
++ ring->funcs->parse_cs ? chunk_ib->ib_bytes : 0,
++ ib);
++ if (r) {
++ DRM_ERROR("Failed to get ib !\n");
++ return r;
+ }
+
+ ib->gpu_addr = chunk_ib->va_start;
+ ib->length_dw = chunk_ib->ib_bytes / 4;
+ ib->flags = chunk_ib->flags;
++
+ j++;
+ }
+
+@@ -1261,6 +1270,10 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
+ goto out;
+ }
+
++ r = amdgpu_cs_ib_fill(adev, &parser);
++ if (r)
++ goto out;
++
+ r = amdgpu_cs_parser_bos(&parser, data);
+ if (r) {
+ if (r == -ENOMEM)
+@@ -1271,9 +1284,6 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
+ }
+
+ reserved_buffers = true;
+- r = amdgpu_cs_ib_fill(adev, &parser);
+- if (r)
+- goto out;
+
+ r = amdgpu_cs_dependencies(adev, &parser);
+ if (r) {
+--
+2.7.4
+