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