aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/vme/vme.c
diff options
context:
space:
mode:
authorDmitry Kalinkin <dmitry.kalinkin@gmail.com>2015-02-26 10:53:10 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-03-06 20:03:22 -0500
commitc74a804f115bdedcac72ea52ca33f46cfae3b74f (patch)
tree0e2c88fa7c1c0ba49147594f70d99688e9345c10 /drivers/vme/vme.c
parent0cd189a42da07c89c809debc1f6a75f5ec0f5c43 (diff)
staging: vme: mmap() support for vme_user
We also make sure that user won't be able to reconfigure the window while it is mmap'ed. Signed-off-by: Dmitry Kalinkin <dmitry.kalinkin@gmail.com> Cc: Martyn Welch <martyn.welch@ge.com> Cc: Igor Alekseev <igor.alekseev@itep.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/vme/vme.c')
-rw-r--r--drivers/vme/vme.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/vme/vme.c b/drivers/vme/vme.c
index d95fb848dd03..6bab2c4ed77c 100644
--- a/drivers/vme/vme.c
+++ b/drivers/vme/vme.c
@@ -609,6 +609,32 @@ unsigned int vme_master_rmw(struct vme_resource *resource, unsigned int mask,
609} 609}
610EXPORT_SYMBOL(vme_master_rmw); 610EXPORT_SYMBOL(vme_master_rmw);
611 611
612int vme_master_mmap(struct vme_resource *resource, struct vm_area_struct *vma)
613{
614 struct vme_master_resource *image;
615 phys_addr_t phys_addr;
616 unsigned long vma_size;
617
618 if (resource->type != VME_MASTER) {
619 pr_err("Not a master resource\n");
620 return -EINVAL;
621 }
622
623 image = list_entry(resource->entry, struct vme_master_resource, list);
624 phys_addr = image->bus_resource.start + (vma->vm_pgoff << PAGE_SHIFT);
625 vma_size = vma->vm_end - vma->vm_start;
626
627 if (phys_addr + vma_size > image->bus_resource.end + 1) {
628 pr_err("Map size cannot exceed the window size\n");
629 return -EFAULT;
630 }
631
632 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
633
634 return vm_iomap_memory(vma, phys_addr, vma->vm_end - vma->vm_start);
635}
636EXPORT_SYMBOL(vme_master_mmap);
637
612void vme_master_free(struct vme_resource *resource) 638void vme_master_free(struct vme_resource *resource)
613{ 639{
614 struct vme_master_resource *master_image; 640 struct vme_master_resource *master_image;