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