diff options
author | Dmitry Kalinkin <dmitry.kalinkin@gmail.com> | 2015-02-26 10:53:10 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-03-06 20:03:22 -0500 |
commit | c74a804f115bdedcac72ea52ca33f46cfae3b74f (patch) | |
tree | 0e2c88fa7c1c0ba49147594f70d99688e9345c10 /drivers/vme/vme.c | |
parent | 0cd189a42da07c89c809debc1f6a75f5ec0f5c43 (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.c | 26 |
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 | } |
610 | EXPORT_SYMBOL(vme_master_rmw); | 610 | EXPORT_SYMBOL(vme_master_rmw); |
611 | 611 | ||
612 | int 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 | } | ||
636 | EXPORT_SYMBOL(vme_master_mmap); | ||
637 | |||
612 | void vme_master_free(struct vme_resource *resource) | 638 | void vme_master_free(struct vme_resource *resource) |
613 | { | 639 | { |
614 | struct vme_master_resource *master_image; | 640 | struct vme_master_resource *master_image; |