fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / infiniband / hw / ipath / ipath_mr.c
index 4ac31a5..8cc8598 100644 (file)
 
 #include "ipath_verbs.h"
 
+/* Fast memory region */
+struct ipath_fmr {
+       struct ib_fmr ibfmr;
+       u8 page_shift;
+       struct ipath_mregion mr;        /* must be last */
+};
+
+static inline struct ipath_fmr *to_ifmr(struct ib_fmr *ibfmr)
+{
+       return container_of(ibfmr, struct ipath_fmr, ibfmr);
+}
+
 /**
  * ipath_get_dma_mr - get a DMA memory region
  * @pd: protection domain for this memory region
  * @acc: access flags
  *
  * Returns the memory region on success, otherwise returns an errno.
+ * Note that all DMA addresses should be created via the
+ * struct ib_dma_mapping_ops functions (see ipath_dma.c).
  */
 struct ib_mr *ipath_get_dma_mr(struct ib_pd *pd, int acc)
 {
@@ -126,6 +140,7 @@ struct ib_mr *ipath_reg_phys_mr(struct ib_pd *pd,
                goto bail;
        }
 
+       mr->mr.pd = pd;
        mr->mr.user_base = *iova_start;
        mr->mr.iova = *iova_start;
        mr->mr.length = 0;
@@ -136,8 +151,7 @@ struct ib_mr *ipath_reg_phys_mr(struct ib_pd *pd,
        m = 0;
        n = 0;
        for (i = 0; i < num_phys_buf; i++) {
-               mr->mr.map[m]->segs[n].vaddr =
-                       phys_to_virt(buffer_list[i].addr);
+               mr->mr.map[m]->segs[n].vaddr = (void *) buffer_list[i].addr;
                mr->mr.map[m]->segs[n].length = buffer_list[i].size;
                mr->mr.length += buffer_list[i].size;
                n++;
@@ -185,6 +199,7 @@ struct ib_mr *ipath_reg_user_mr(struct ib_pd *pd, struct ib_umem *region,
                goto bail;
        }
 
+       mr->mr.pd = pd;
        mr->mr.user_base = region->user_base;
        mr->mr.iova = region->virt_base;
        mr->mr.length = region->length;
@@ -277,6 +292,7 @@ struct ib_fmr *ipath_alloc_fmr(struct ib_pd *pd, int mr_access_flags,
         * Resources are allocated but no valid mapping (RKEY can't be
         * used).
         */
+       fmr->mr.pd = pd;
        fmr->mr.user_base = 0;
        fmr->mr.iova = 0;
        fmr->mr.length = 0;
@@ -332,7 +348,7 @@ int ipath_map_phys_fmr(struct ib_fmr *ibfmr, u64 * page_list,
        n = 0;
        ps = 1 << fmr->page_shift;
        for (i = 0; i < list_len; i++) {
-               fmr->mr.map[m]->segs[n].vaddr = phys_to_virt(page_list[i]);
+               fmr->mr.map[m]->segs[n].vaddr = (void *) page_list[i];
                fmr->mr.map[m]->segs[n].length = ps;
                if (++n == IPATH_SEGSZ) {
                        m++;