diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2779-drm-amdkfd-Use-kfd-fd-to-mmap-mmio.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2779-drm-amdkfd-Use-kfd-fd-to-mmap-mmio.patch | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2779-drm-amdkfd-Use-kfd-fd-to-mmap-mmio.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2779-drm-amdkfd-Use-kfd-fd-to-mmap-mmio.patch new file mode 100644 index 00000000..97609a64 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2779-drm-amdkfd-Use-kfd-fd-to-mmap-mmio.patch @@ -0,0 +1,103 @@ +From bd26ecc79475368254e8ffb603c6f29c80c558b7 Mon Sep 17 00:00:00 2001 +From: Oak Zeng <Oak.Zeng@amd.com> +Date: Thu, 23 May 2019 17:12:41 -0500 +Subject: [PATCH 2779/2940] drm/amdkfd: Use kfd fd to mmap mmio + +TTM doesn't support CPU mapping of sg type bo (under which +mmio bo is created). Switch mmaping of mmio page to kfd +device file. + +Change-Id: I1a1a24f2ac0662be3783d460c137731ade007b83 +Signed-off-by: Oak Zeng <Oak.Zeng@amd.com> +Acked-by: Christian Konig <christian.koenig@amd.com> +Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> +--- + drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 45 ++++++++++++++++++++++++ + drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 1 + + 2 files changed, 46 insertions(+) + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +index d5416af01ac4..94e5f33ae9d9 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +@@ -1343,6 +1343,14 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep, + args->handle = MAKE_HANDLE(args->gpu_id, idr_handle); + args->mmap_offset = offset; + ++ /* MMIO is mapped through kfd device ++ * Generate a kfd mmap offset ++ */ ++ if (flags & KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP) { ++ args->mmap_offset = KFD_MMAP_TYPE_MMIO | KFD_MMAP_GPU_ID(args->gpu_id); ++ args->mmap_offset <<= PAGE_SHIFT; ++ } ++ + return 0; + + err_free: +@@ -2966,6 +2974,39 @@ static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) + return retcode; + } + ++static int kfd_mmio_mmap(struct kfd_dev *dev, struct kfd_process *process, ++ struct vm_area_struct *vma) ++{ ++ phys_addr_t address; ++ int ret; ++ ++ if (vma->vm_end - vma->vm_start != PAGE_SIZE) ++ return -EINVAL; ++ ++ address = amdgpu_amdkfd_get_mmio_remap_phys_addr(dev->kgd); ++ ++ vma->vm_flags |= VM_IO | VM_DONTCOPY | VM_DONTEXPAND | VM_NORESERVE | ++ VM_DONTDUMP | VM_PFNMAP; ++ ++ vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); ++ ++ pr_debug("Process %d mapping mmio page\n" ++ " target user address == 0x%08llX\n" ++ " physical address == 0x%08llX\n" ++ " vm_flags == 0x%04lX\n" ++ " size == 0x%04lX\n", ++ process->pasid, (unsigned long long) vma->vm_start, ++ address, vma->vm_flags, PAGE_SIZE); ++ ++ ret = io_remap_pfn_range(vma, ++ vma->vm_start, ++ address >> PAGE_SHIFT, ++ PAGE_SIZE, ++ vma->vm_page_prot); ++ return ret; ++} ++ ++ + static int kfd_mmap(struct file *filp, struct vm_area_struct *vma) + { + struct kfd_process *process; +@@ -2996,6 +3037,10 @@ static int kfd_mmap(struct file *filp, struct vm_area_struct *vma) + if (!dev) + return -ENODEV; + return kfd_reserved_mem_mmap(dev, process, vma); ++ case KFD_MMAP_TYPE_MMIO: ++ if (!dev) ++ return -ENODEV; ++ return kfd_mmio_mmap(dev, process, vma); + } + + return -EFAULT; +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +index 6f22f4e1dba5..ee5c8892a16e 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +@@ -65,6 +65,7 @@ struct drm_device; + #define KFD_MMAP_TYPE_DOORBELL (0x3ULL << KFD_MMAP_TYPE_SHIFT) + #define KFD_MMAP_TYPE_EVENTS (0x2ULL << KFD_MMAP_TYPE_SHIFT) + #define KFD_MMAP_TYPE_RESERVED_MEM (0x1ULL << KFD_MMAP_TYPE_SHIFT) ++#define KFD_MMAP_TYPE_MMIO (0x0ULL << KFD_MMAP_TYPE_SHIFT) + + #define KFD_MMAP_GPU_ID_SHIFT (46 - PAGE_SHIFT) + #define KFD_MMAP_GPU_ID_MASK (((1ULL << KFD_GPU_ID_HASH_WIDTH) - 1) \ +-- +2.17.1 + |