Re: [PATCH 8/8] drm/amdkfd: Use kfd fd to mmap mmio
Hi Oak, I'm not sure why this is part of the GWS patch series. It's unrelated to GWS. Anyway, see one comment inline. On 2019-05-23 6:41 p.m., Zeng, Oak wrote: > 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 > --- > drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 46 > > drivers/gpu/drm/amd/amdkfd/kfd_priv.h| 1 + > 2 files changed, 47 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c > b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c > index 455a3db..67d269b 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c > @@ -1309,6 +1309,15 @@ 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; > + args->mmap_offset |= > amdgpu_amdkfd_get_mmio_remap_phys_addr(dev->kgd); It seems the mmio_remap_phys_addr doesn't need to be part of the mmap_offset. It's not used for anything in kfd_mmap. And it unnecessarily exposes a physical address to user mode, which we usually tend to avoid. With that fixes, the patch is Reviewed-by: Felix Kuehling Regards, Felix > + } > + > return 0; > > err_free: > @@ -1880,6 +1889,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; > @@ -1910,6 +1952,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 40a5c67..b61dc53 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h > @@ -59,6 +59,7 @@ > #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) \ ___ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx
Re: [PATCH 8/8] drm/amdkfd: Use kfd fd to mmap mmio
Am 24.05.19 um 00:41 schrieb Zeng, Oak: 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 Acked-by: Christian König --- drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 46 drivers/gpu/drm/amd/amdkfd/kfd_priv.h| 1 + 2 files changed, 47 insertions(+) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c index 455a3db..67d269b 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c @@ -1309,6 +1309,15 @@ 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; + args->mmap_offset |= amdgpu_amdkfd_get_mmio_remap_phys_addr(dev->kgd); + } + return 0; err_free: @@ -1880,6 +1889,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; @@ -1910,6 +1952,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 40a5c67..b61dc53 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h @@ -59,6 +59,7 @@ #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) \ ___ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx
[PATCH 8/8] 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 --- drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 46 drivers/gpu/drm/amd/amdkfd/kfd_priv.h| 1 + 2 files changed, 47 insertions(+) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c index 455a3db..67d269b 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c @@ -1309,6 +1309,15 @@ 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; + args->mmap_offset |= amdgpu_amdkfd_get_mmio_remap_phys_addr(dev->kgd); + } + return 0; err_free: @@ -1880,6 +1889,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; @@ -1910,6 +1952,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 40a5c67..b61dc53 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h @@ -59,6 +59,7 @@ #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.7.4 ___ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx