diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5659-drm-amdkfd-Clean-up-mmap-handling.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/5659-drm-amdkfd-Clean-up-mmap-handling.patch | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5659-drm-amdkfd-Clean-up-mmap-handling.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5659-drm-amdkfd-Clean-up-mmap-handling.patch new file mode 100644 index 00000000..99acdcfa --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5659-drm-amdkfd-Clean-up-mmap-handling.patch @@ -0,0 +1,142 @@ +From ab152eae9ef649cd118b265e9230d127ce061b2f Mon Sep 17 00:00:00 2001 +From: Felix Kuehling <Felix.Kuehling@amd.com> +Date: Mon, 23 Apr 2018 22:36:47 -0400 +Subject: [PATCH 5659/5725] drm/amdkfd: Clean up mmap handling + +Remove reserved bits in mmap addresses. The mmap offset is no longer +used for TTM/DRM mappings. So it makes no sense to encode TTM/DRM +address space limitations. + +Centralize encoding and parsing of the GPU ID in the mmap offset. + +Cosmetic changes to match upstream. + +Change-Id: I5edb10d257006ee915534756d9b0e28381c889ef +Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> +--- + drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 27 +++++++++++++-------------- + drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 9 ++++----- + drivers/gpu/drm/amd/amdkfd/kfd_process.c | 10 ++++------ + 3 files changed, 21 insertions(+), 25 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +index 0190734..99a29f7 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +@@ -2670,34 +2670,33 @@ static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) + static int kfd_mmap(struct file *filp, struct vm_area_struct *vma) + { + struct kfd_process *process; +- struct kfd_dev *kfd; ++ struct kfd_dev *dev = NULL; + unsigned long vm_pgoff; +- unsigned long long mmap_type; ++ unsigned int gpu_id; + + process = kfd_get_process(current); + if (IS_ERR(process)) + return PTR_ERR(process); + + vm_pgoff = vma->vm_pgoff; +- vma->vm_pgoff = KFD_MMAP_OFFSET_VALUE_GET(vma->vm_pgoff); +- mmap_type = vm_pgoff & KFD_MMAP_TYPE_MASK; ++ vma->vm_pgoff = KFD_MMAP_OFFSET_VALUE_GET(vm_pgoff); ++ gpu_id = KFD_MMAP_GPU_ID_GET(vm_pgoff); ++ if (gpu_id) ++ dev = kfd_device_by_id(gpu_id); + +- switch (mmap_type) { ++ switch (vm_pgoff & KFD_MMAP_TYPE_MASK) { + case KFD_MMAP_TYPE_DOORBELL: +- kfd = kfd_device_by_id(KFD_MMAP_GPU_ID_GET(vm_pgoff)); +- if (!kfd) +- return -EFAULT; +- return kfd_doorbell_mmap(kfd, process, vma); ++ if (!dev) ++ return -ENODEV; ++ return kfd_doorbell_mmap(dev, process, vma); + + case KFD_MMAP_TYPE_EVENTS: + return kfd_event_mmap(process, vma); + + case KFD_MMAP_TYPE_RESERVED_MEM: +- return kfd_reserved_mem_mmap(process, vma); +- +- default: +- pr_err("Unsupported kfd mmap type %llx\n", mmap_type); +- break; ++ if (!dev) ++ return -ENODEV; ++ return kfd_reserved_mem_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 bb3b020..e9c64ef 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +@@ -49,8 +49,7 @@ + /* Use upper bits of mmap offset to store KFD driver specific information. + * BITS[63:62] - Encode MMAP type + * BITS[61:46] - Encode gpu_id. To identify to which GPU the offset belongs to +- * BITS[45:40] - Reserved. Not Used. +- * BITS[39:0] - MMAP offset value. Used by TTM. ++ * BITS[45:0] - MMAP offset value + * + * NOTE: struct vm_area_struct.vm_pgoff uses offset in pages. Hence, these + * defines are w.r.t to PAGE_SIZE +@@ -69,7 +68,7 @@ + #define KFD_MMAP_GPU_ID_GET(offset) ((offset & KFD_MMAP_GPU_ID_MASK) \ + >> KFD_MMAP_GPU_ID_SHIFT) + +-#define KFD_MMAP_OFFSET_VALUE_MASK (0xFFFFFFFFFFULL >> PAGE_SHIFT) ++#define KFD_MMAP_OFFSET_VALUE_MASK (0x3FFFFFFFFFFFULL >> PAGE_SHIFT) + #define KFD_MMAP_OFFSET_VALUE_GET(offset) (offset & KFD_MMAP_OFFSET_VALUE_MASK) + + /* +@@ -817,8 +816,8 @@ struct kfd_process_device *kfd_get_process_device_data(struct kfd_dev *dev, + struct kfd_process_device *kfd_create_process_device_data(struct kfd_dev *dev, + struct kfd_process *p); + +-int kfd_reserved_mem_mmap(struct kfd_process *process, +- struct vm_area_struct *vma); ++int kfd_reserved_mem_mmap(struct kfd_dev *dev, struct kfd_process *process, ++ struct vm_area_struct *vma); + + /* KFD process API for creating and translating handles */ + int kfd_process_device_create_obj_handle(struct kfd_process_device *pdd, +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c +index 78ccac0..7459d39 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c +@@ -484,7 +484,8 @@ static int kfd_process_init_cwsr_apu(struct kfd_process *p, struct file *filep) + if (!dev->cwsr_enabled || qpd->cwsr_kaddr || qpd->cwsr_base) + continue; + +- offset = (dev->id | KFD_MMAP_TYPE_RESERVED_MEM) << PAGE_SHIFT; ++ offset = (KFD_MMAP_TYPE_RESERVED_MEM | KFD_MMAP_GPU_ID(dev->id)) ++ << PAGE_SHIFT; + qpd->tba_addr = (uint64_t)vm_mmap(filep, 0, + KFD_CWSR_TBA_TMA_SIZE, PROT_READ | PROT_EXEC, + MAP_SHARED, offset); +@@ -1152,15 +1153,12 @@ static void restore_process_worker(struct work_struct *work) + pr_info("Finished restoring process of pasid %d\n", p->pasid); + } + +-int kfd_reserved_mem_mmap(struct kfd_process *process, +- struct vm_area_struct *vma) ++int kfd_reserved_mem_mmap(struct kfd_dev *dev, struct kfd_process *process, ++ struct vm_area_struct *vma) + { +- struct kfd_dev *dev = kfd_device_by_id(vma->vm_pgoff); + struct kfd_process_device *pdd; + struct qcm_process_device *qpd; + +- if (!dev) +- return -EINVAL; + if ((vma->vm_end - vma->vm_start) != KFD_CWSR_TBA_TMA_SIZE) { + pr_err("Incorrect CWSR mapping size.\n"); + return -EINVAL; +-- +2.7.4 + |