]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
[PATCH] IB uverbs: add mthca mmap support
authorRoland Dreier <rolandd@cisco.com>
Fri, 8 Jul 2005 00:57:17 +0000 (17:57 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 8 Jul 2005 01:23:49 +0000 (18:23 -0700)
Add support for mmap() method to mthca, so that userspace can get access to
doorbell registers.  This allows userspace to get direct access to the HCA for
data path operations.

Each userspace context gets its own copy of the doorbell registers and is only
allowed to use resources that the kernel has given it access to.  In other
words, this is safe.

Signed-off-by: Roland Dreier <rolandd@cisco.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/infiniband/hw/mthca/mthca_provider.c

index bfd33a470020d12e61fc1a92a8d87716fb6d16e1..9acb8c54ce4f14ba470165e72396ce7d24f97f83 100644 (file)
@@ -35,6 +35,7 @@
  */
 
 #include <ib_smi.h>
+#include <linux/mm.h>
 
 #include "mthca_dev.h"
 #include "mthca_cmd.h"
@@ -340,6 +341,22 @@ static int mthca_dealloc_ucontext(struct ib_ucontext *context)
        return 0;
 }
 
+static int mthca_mmap_uar(struct ib_ucontext *context,
+                         struct vm_area_struct *vma)
+{
+       if (vma->vm_end - vma->vm_start != PAGE_SIZE)
+               return -EINVAL;
+
+       vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+
+       if (remap_pfn_range(vma, vma->vm_start,
+                           to_mucontext(context)->uar.pfn,
+                           PAGE_SIZE, vma->vm_page_prot))
+               return -EAGAIN;
+
+       return 0;
+}
+
 static struct ib_pd *mthca_alloc_pd(struct ib_device *ibdev,
                                    struct ib_ucontext *context,
                                    struct ib_udata *udata)
@@ -766,6 +783,7 @@ int mthca_register_device(struct mthca_dev *dev)
        dev->ib_dev.query_gid            = mthca_query_gid;
        dev->ib_dev.alloc_ucontext       = mthca_alloc_ucontext;
        dev->ib_dev.dealloc_ucontext     = mthca_dealloc_ucontext;
+       dev->ib_dev.mmap                 = mthca_mmap_uar;
        dev->ib_dev.alloc_pd             = mthca_alloc_pd;
        dev->ib_dev.dealloc_pd           = mthca_dealloc_pd;
        dev->ib_dev.create_ah            = mthca_ah_create;