diff options
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.patch | 175 |
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 + |