aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2779-drm-amdkfd-Use-kfd-fd-to-mmap-mmio.patch
diff options
context:
space:
mode:
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.patch103
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
+