diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1628-drm-amdgpu-Make-PTE-flags-per-mapping-not-per-BO.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1628-drm-amdgpu-Make-PTE-flags-per-mapping-not-per-BO.patch | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1628-drm-amdgpu-Make-PTE-flags-per-mapping-not-per-BO.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1628-drm-amdgpu-Make-PTE-flags-per-mapping-not-per-BO.patch new file mode 100644 index 00000000..509b426f --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1628-drm-amdgpu-Make-PTE-flags-per-mapping-not-per-BO.patch @@ -0,0 +1,140 @@ +From c2d8cc52beae81712528f4016aec8fabeeb7c757 Mon Sep 17 00:00:00 2001 +From: Felix Kuehling <Felix.Kuehling@amd.com> +Date: Thu, 16 Mar 2017 13:53:33 -0400 +Subject: [PATCH 1628/4131] drm/amdgpu: Make PTE flags per mapping, not per BO + +PTE flags are ASIC-specific. Vega10 PTEs use different flags. So +two mappings of the same BO on different GPUs may need different +flags. Store the ASIC-specific PTE flags per mapping, not per BO. + +Change-Id: Id27363c61f60699337acb3e2721ec0345d70ae6b +Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 3 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 35 +++++++++++------------- + 2 files changed, 18 insertions(+), 20 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +index 23e2f12..a6a538ac 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +@@ -43,6 +43,7 @@ struct kfd_bo_va_list { + bool is_mapped; + bool map_fail; + uint64_t va; ++ uint64_t pte_flags; + }; + + struct kgd_mem { +@@ -60,7 +61,7 @@ struct kgd_mem { + struct delayed_work work; /* for restore evicted mem */ + struct mm_struct *mm; /* for restore */ + +- uint64_t pte_flags; ++ uint32_t mapping_flags; + + /* flags bitfield */ + bool coherent : 1; +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +index 29dcc29..e8d3b5d 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +@@ -360,6 +360,8 @@ 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_vm_get_pte_flags(adev, ++ mem->mapping_flags); + bo_va_entry->kgd_dev = (void *)adev; + list_add(&bo_va_entry->bo_list, list_bo_va); + +@@ -503,7 +505,7 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va, + uint64_t user_addr = 0; + int byte_align; + u32 alloc_domain; +- uint32_t get_pte_flags; ++ uint32_t mapping_flags; + struct amdkfd_vm *kfd_vm = (struct amdkfd_vm *)vm; + + BUG_ON(kgd == NULL); +@@ -537,17 +539,17 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va, + (*mem)->no_substitute = no_sub; + (*mem)->aql_queue = aql_queue; + +- get_pte_flags = AMDGPU_VM_PAGE_READABLE; ++ mapping_flags = AMDGPU_VM_PAGE_READABLE; + if (!readonly) +- get_pte_flags |= AMDGPU_VM_PAGE_WRITEABLE; ++ mapping_flags |= AMDGPU_VM_PAGE_WRITEABLE; + if (execute) +- get_pte_flags |= AMDGPU_VM_PAGE_EXECUTABLE; ++ mapping_flags |= AMDGPU_VM_PAGE_EXECUTABLE; + if (coherent) +- get_pte_flags |= AMDGPU_VM_MTYPE_UC; ++ mapping_flags |= AMDGPU_VM_MTYPE_UC; + else +- get_pte_flags |= AMDGPU_VM_MTYPE_NC; ++ mapping_flags |= AMDGPU_VM_MTYPE_NC; + +- (*mem)->pte_flags = amdgpu_vm_get_pte_flags(adev, get_pte_flags); ++ (*mem)->mapping_flags = mapping_flags; + + alloc_domain = userptr ? AMDGPU_GEM_DOMAIN_CPU : domain; + +@@ -974,8 +976,7 @@ static int update_gpuvm_pte(struct amdgpu_device *adev, + } + + static int map_bo_to_gpuvm(struct amdgpu_device *adev, +- struct kfd_bo_va_list *entry, uint64_t pte_flags, +- struct amdgpu_sync *sync) ++ struct kfd_bo_va_list *entry, struct amdgpu_sync *sync) + { + int ret; + struct amdgpu_bo *bo = entry->bo_va->bo; +@@ -1005,7 +1006,7 @@ static int map_bo_to_gpuvm(struct amdgpu_device *adev, + */ + ret = amdgpu_vm_bo_map(adev, entry->bo_va, + entry->va, 0, amdgpu_bo_size(bo), +- pte_flags); ++ entry->pte_flags); + if (ret != 0) { + pr_err("Failed to map VA 0x%llx in vm. ret %d\n", + entry->va, ret); +@@ -1299,8 +1300,7 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu( + entry->va, entry->va + bo_size, + entry); + +- ret = map_bo_to_gpuvm(adev, entry, mem->pte_flags, +- &ctx.sync); ++ ret = map_bo_to_gpuvm(adev, entry, &ctx.sync); + if (ret != 0) { + pr_err("Failed to map radeon bo to gpuvm\n"); + goto map_bo_to_gpuvm_failed; +@@ -1866,11 +1866,9 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, + + INIT_LIST_HEAD(&(*mem)->bo_va_list); + mutex_init(&(*mem)->lock); +- (*mem)->pte_flags = amdgpu_vm_get_pte_flags(adev, +- AMDGPU_VM_PAGE_READABLE | +- AMDGPU_VM_PAGE_WRITEABLE | +- AMDGPU_VM_PAGE_EXECUTABLE | +- AMDGPU_VM_MTYPE_NC); ++ (*mem)->mapping_flags = ++ AMDGPU_VM_PAGE_READABLE | AMDGPU_VM_PAGE_WRITEABLE | ++ AMDGPU_VM_PAGE_EXECUTABLE | AMDGPU_VM_MTYPE_NC; + + (*mem)->bo = amdgpu_bo_ref(bo); + (*mem)->va = va; +@@ -2066,8 +2064,7 @@ int amdgpu_amdkfd_gpuvm_restore_mem(struct kgd_mem *mem, struct mm_struct *mm) + continue; + } + +- r = map_bo_to_gpuvm(adev, entry, mem->pte_flags, +- &ctx.sync); ++ r = map_bo_to_gpuvm(adev, entry, &ctx.sync); + if (unlikely(r != 0)) { + pr_err("Failed to map BO to gpuvm\n"); + entry->map_fail = true; +-- +2.7.4 + |