aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3681-drm-amdgpu-Determing-PTE-flags-separately-for-each-m.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3681-drm-amdgpu-Determing-PTE-flags-separately-for-each-m.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3681-drm-amdgpu-Determing-PTE-flags-separately-for-each-m.patch126
1 files changed, 126 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3681-drm-amdgpu-Determing-PTE-flags-separately-for-each-m.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3681-drm-amdgpu-Determing-PTE-flags-separately-for-each-m.patch
new file mode 100644
index 00000000..1a489960
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3681-drm-amdgpu-Determing-PTE-flags-separately-for-each-m.patch
@@ -0,0 +1,126 @@
+From 91f7a1afdf16e4c32ad768328b24eda0fd3af9c3 Mon Sep 17 00:00:00 2001
+From: Felix Kuehling <Felix.Kuehling@amd.com>
+Date: Mon, 26 Aug 2019 18:39:11 -0400
+Subject: [PATCH 3681/4256] drm/amdgpu: Determing PTE flags separately for each
+ mapping (v3)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The same BO can be mapped with different PTE flags by different GPUs.
+Therefore determine the PTE flags separately for each mapping instead
+of storing them in the KFD buffer object.
+
+Add a helper function to determine the PTE flags to be extended with
+ASIC and memory-type-specific logic in subsequent commits.
+
+v2: Split Arcturus-specific MTYPE changes into separate commit
+v3: Fix return type of get_pte_flags to uint64_t
+
+Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
+Acked-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Shaoyun Liu <Shaoyun.Liu@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 2 +-
+ .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 42 +++++++++++--------
+ 2 files changed, 25 insertions(+), 19 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+index a344f37e48c0..2e66505744ef 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+@@ -57,7 +57,7 @@ struct kgd_mem {
+ unsigned int mapped_to_gpu_memory;
+ uint64_t va;
+
+- uint32_t mapping_flags;
++ uint32_t alloc_flags;
+
+ atomic_t invalid;
+ struct amdkfd_process_info *process_info;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+index 7da67e5b3140..595922f63f47 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+@@ -382,6 +382,23 @@ static int vm_update_pds(struct amdgpu_vm *vm, struct amdgpu_sync *sync)
+ return amdgpu_sync_fence(NULL, sync, vm->last_update, false);
+ }
+
++static uint64_t get_pte_flags(struct amdgpu_device *adev, struct kgd_mem *mem)
++{
++ bool coherent = mem->alloc_flags & ALLOC_MEM_FLAGS_COHERENT;
++ uint32_t mapping_flags;
++
++ mapping_flags = AMDGPU_VM_PAGE_READABLE;
++ if (mem->alloc_flags & ALLOC_MEM_FLAGS_WRITABLE)
++ mapping_flags |= AMDGPU_VM_PAGE_WRITEABLE;
++ if (mem->alloc_flags & ALLOC_MEM_FLAGS_EXECUTABLE)
++ mapping_flags |= AMDGPU_VM_PAGE_EXECUTABLE;
++
++ mapping_flags |= coherent ?
++ AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC;
++
++ return amdgpu_gmc_get_pte_flags(adev, mapping_flags);
++}
++
+ /* add_bo_to_vm - Add a BO to a VM
+ *
+ * Everything that needs to bo done only once when a BO is first added
+@@ -430,8 +447,7 @@ static int add_bo_to_vm(struct amdgpu_device *adev, struct kgd_mem *mem,
+ }
+
+ bo_va_entry->va = va;
+- bo_va_entry->pte_flags = amdgpu_gmc_get_pte_flags(adev,
+- mem->mapping_flags);
++ bo_va_entry->pte_flags = get_pte_flags(adev, mem);
+ bo_va_entry->kgd_dev = (void *)adev;
+ list_add(&bo_va_entry->bo_list, list_bo_va);
+
+@@ -1135,7 +1151,6 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
+ struct amdgpu_bo_param bp;
+ u32 domain, alloc_domain;
+ u64 alloc_flags;
+- uint32_t mapping_flags;
+ int ret;
+
+ /*
+@@ -1195,16 +1210,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
+ if ((*mem)->aql_queue)
+ size = size >> 1;
+
+- mapping_flags = AMDGPU_VM_PAGE_READABLE;
+- if (flags & ALLOC_MEM_FLAGS_WRITABLE)
+- mapping_flags |= AMDGPU_VM_PAGE_WRITEABLE;
+- if (flags & ALLOC_MEM_FLAGS_EXECUTABLE)
+- mapping_flags |= AMDGPU_VM_PAGE_EXECUTABLE;
+- if (flags & ALLOC_MEM_FLAGS_COHERENT)
+- mapping_flags |= AMDGPU_VM_MTYPE_UC;
+- else
+- mapping_flags |= AMDGPU_VM_MTYPE_NC;
+- (*mem)->mapping_flags = mapping_flags;
++ (*mem)->alloc_flags = flags;
+
+ amdgpu_sync_create(&(*mem)->sync);
+
+@@ -1844,13 +1850,13 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,
+
+ INIT_LIST_HEAD(&(*mem)->bo_va_list);
+ mutex_init(&(*mem)->lock);
+-
+ if (bo->kfd_bo)
+- (*mem)->mapping_flags = bo->kfd_bo->mapping_flags;
++ (*mem)->alloc_flags = bo->kfd_bo->alloc_flags;
+ else
+- (*mem)->mapping_flags =
+- AMDGPU_VM_PAGE_READABLE | AMDGPU_VM_PAGE_WRITEABLE |
+- AMDGPU_VM_PAGE_EXECUTABLE | AMDGPU_VM_MTYPE_NC;
++ (*mem)->alloc_flags =
++ ((bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ?
++ ALLOC_MEM_FLAGS_VRAM : ALLOC_MEM_FLAGS_GTT) |
++ ALLOC_MEM_FLAGS_WRITABLE | ALLOC_MEM_FLAGS_EXECUTABLE;
+
+ (*mem)->bo = amdgpu_bo_ref(bo);
+ (*mem)->va = va;
+--
+2.17.1
+