aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3663-drm-amdgpu-use-separate-status-for-buffer-funcs-avai.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3663-drm-amdgpu-use-separate-status-for-buffer-funcs-avai.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3663-drm-amdgpu-use-separate-status-for-buffer-funcs-avai.patch112
1 files changed, 112 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3663-drm-amdgpu-use-separate-status-for-buffer-funcs-avai.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3663-drm-amdgpu-use-separate-status-for-buffer-funcs-avai.patch
new file mode 100644
index 00000000..c7491651
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3663-drm-amdgpu-use-separate-status-for-buffer-funcs-avai.patch
@@ -0,0 +1,112 @@
+From 96ad7d331278706de1dd80b8bf2c26f98eee2965 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Thu, 1 Mar 2018 11:09:15 +0100
+Subject: [PATCH 3663/4131] drm/amdgpu: use separate status for buffer funcs
+ availability v2
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The ring status can change during GPU reset, but we still need to be
+able to schedule TTM buffer moves in the meantime.
+
+Otherwise we can ran into problems because of aborted move/fill
+operations during GPU resets.
+
+v2: still check if ring is available during direct submit.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Acked-by: Chunming zhou <david1.zhou@amd.com>
+
+Conflicts:
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+
+Change-Id: Iddb49703f18a12510fd2611ed54733d1125b6fbc
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 21 +++++++++++----------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 1 +
+ 2 files changed, 12 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+index 9fe7999..af1272a 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+@@ -232,9 +232,7 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
+ switch (bo->mem.mem_type) {
+ case TTM_PL_VRAM:
+ case AMDGPU_PL_DGMA:
+- if (adev->mman.buffer_funcs &&
+- adev->mman.buffer_funcs_ring &&
+- adev->mman.buffer_funcs_ring->ready == false) {
++ if (!adev->mman.buffer_funcs_enabled) {
+ amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU);
+ } else if (adev->gmc.visible_vram_size < adev->gmc.real_vram_size &&
+ !(abo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)) {
+@@ -374,7 +372,7 @@ int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_device *adev,
+ const uint64_t GTT_MAX_BYTES = (AMDGPU_GTT_MAX_TRANSFER_SIZE *
+ AMDGPU_GPU_PAGE_SIZE);
+
+- if (!ring->ready) {
++ if (!adev->mman.buffer_funcs_enabled) {
+ DRM_ERROR("Trying to move memory with ring turned off.\n");
+ return -EINVAL;
+ }
+@@ -629,12 +627,9 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo,
+ amdgpu_move_null(bo, new_mem);
+ return 0;
+ }
+- if (adev->mman.buffer_funcs == NULL ||
+- adev->mman.buffer_funcs_ring == NULL ||
+- !adev->mman.buffer_funcs_ring->ready) {
+- /* use memcpy */
++
++ if (!adev->mman.buffer_funcs_enabled)
+ goto memcpy;
+- }
+
+ if (old_mem->mem_type == TTM_PL_VRAM &&
+ new_mem->mem_type == TTM_PL_SYSTEM) {
+@@ -1796,6 +1791,7 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable)
+ else
+ size = adev->gmc.visible_vram_size;
+ man->size = size >> PAGE_SHIFT;
++ adev->mman.buffer_funcs_enabled = enable;
+ }
+
+ int amdgpu_mmap(struct file *filp, struct vm_area_struct *vma)
+@@ -1894,6 +1890,11 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset,
+ unsigned i;
+ int r;
+
++ if (direct_submit && !ring->ready) {
++ DRM_ERROR("Trying to move memory with ring turned off.\n");
++ return -EINVAL;
++ }
++
+ max_bytes = adev->mman.buffer_funcs->copy_max_bytes;
+ num_loops = DIV_ROUND_UP(byte_count, max_bytes);
+ num_dw = num_loops * adev->mman.buffer_funcs->copy_num_dw;
+@@ -1967,7 +1968,7 @@ int amdgpu_fill_buffer(struct amdgpu_bo *bo,
+ struct amdgpu_job *job;
+ int r;
+
+- if (!ring->ready) {
++ if (!adev->mman.buffer_funcs_enabled) {
+ DRM_ERROR("Trying to clear memory with ring turned off.\n");
+ return -EINVAL;
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
+index c866eff..f98bd9c 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
+@@ -57,6 +57,7 @@ struct amdgpu_mman {
+ /* buffer handling */
+ const struct amdgpu_buffer_funcs *buffer_funcs;
+ struct amdgpu_ring *buffer_funcs_ring;
++ bool buffer_funcs_enabled;
+
+ struct mutex gtt_window_lock;
+ /* Scheduler entity for buffer moves */
+--
+2.7.4
+