Re: [RFC][PATCH 1/2] uio: allow drivers to override the pgprot for mmap
From: Hans J. Koch <hidden>
Date: 2011-10-28 21:51:23
Also in:
lkml
On Fri, Oct 28, 2011 at 10:50:29AM -0500, Kumar Gala wrote:
For some devices, the default behavior of pgprot_noncached() is not appropriate for all of its mappable regions. This provides a means for the kernel side of the UIO driver to override the flags without having to implement its own full mmap callback.
Thanks for also providing an example driver showing the use of this. You should also post this driver in a mainline-ready version, I'm a bit uncomfortable with adding a new function pointer without having any users. And since you change uio_driver.h you should also update documentation accordingly (Documentation/DocBook/uio-howto.tmpl). Otherwise, I have no general objections. Thanks, Hans
quoted hunk ↗ jump to hunk
Signed-off-by: Kumar Gala <redacted> Signed-off-by: Geoff Thorpe <redacted> --- drivers/uio/uio.c | 6 +++++- include/linux/uio_driver.h | 3 +++ 2 files changed, 8 insertions(+), 1 deletions(-)diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c index dc27d89..0aebe27 100644 --- a/drivers/uio/uio.c +++ b/drivers/uio/uio.c@@ -655,7 +655,11 @@ static int uio_mmap_physical(struct vm_area_struct *vma) vma->vm_flags |= VM_IO | VM_RESERVED; - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); + if (idev->info->set_pgprot) + vma->vm_page_prot = idev->info->set_pgprot(idev->info, mi, + vma->vm_page_prot); + else + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); return remap_pfn_range(vma, vma->vm_start,diff --git a/include/linux/uio_driver.h b/include/linux/uio_driver.h index fd99ff9..edfe7c8 100644 --- a/include/linux/uio_driver.h +++ b/include/linux/uio_driver.h@@ -80,6 +80,7 @@ struct uio_device; * @open: open operation for this uio device * @release: release operation for this uio device * @irqcontrol: disable/enable irqs when 0/1 is written to /dev/uioX + * @set_pgprot: allow driver to override default(noncached) pgprot */ struct uio_info { struct uio_device *uio_dev;@@ -95,6 +96,8 @@ struct uio_info { int (*open)(struct uio_info *info, struct inode *inode); int (*release)(struct uio_info *info, struct inode *inode); int (*irqcontrol)(struct uio_info *info, s32 irq_on); + pgprot_t (*set_pgprot)(struct uio_info *uio, unsigned int mem_idx, + pgprot_t prot); }; extern int __must_check-- 1.7.3.4