]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - drivers/infiniband/core/device.c
RDMA/core: remove use of dma_virt_ops
[mirror_ubuntu-hirsute-kernel.git] / drivers / infiniband / core / device.c
index ce26564d4edfed67323af82281cf05666ca2369e..3ab1edea6acbe9b2172d20b85da52dcc66279e8f 100644 (file)
@@ -1209,25 +1209,6 @@ out:
        return ret;
 }
 
-static void setup_dma_device(struct ib_device *device,
-                            struct device *dma_device)
-{
-       /*
-        * If the caller does not provide a DMA capable device then the IB
-        * device will be used. In this case the caller should fully setup the
-        * ibdev for DMA. This usually means using dma_virt_ops.
-        */
-#ifdef CONFIG_DMA_VIRT_OPS
-       if (!dma_device) {
-               device->dev.dma_ops = &dma_virt_ops;
-               dma_device = &device->dev;
-       }
-#endif
-       WARN_ON(!dma_device);
-       device->dma_device = dma_device;
-       WARN_ON(!device->dma_device->dma_parms);
-}
-
 /*
  * setup_device() allocates memory and sets up data that requires calling the
  * device ops, this is the only reason these actions are not done during
@@ -1373,7 +1354,14 @@ int ib_register_device(struct ib_device *device, const char *name,
        if (ret)
                return ret;
 
-       setup_dma_device(device, dma_device);
+       /*
+        * If the caller does not provide a DMA capable device then the IB core
+        * will set up ib_sge and scatterlist structures that stash the kernel
+        * virtual address into the address field.
+        */
+       WARN_ON(dma_device && !dma_device->dma_parms);
+       device->dma_device = dma_device;
+
        ret = setup_device(device);
        if (ret)
                return ret;
@@ -2708,6 +2696,21 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
 }
 EXPORT_SYMBOL(ib_set_device_ops);
 
+#ifdef CONFIG_INFINIBAND_VIRT_DMA
+int ib_dma_virt_map_sg(struct ib_device *dev, struct scatterlist *sg, int nents)
+{
+       struct scatterlist *s;
+       int i;
+
+       for_each_sg(sg, s, nents, i) {
+               sg_dma_address(s) = (uintptr_t)sg_virt(s);
+               sg_dma_len(s) = s->length;
+       }
+       return nents;
+}
+EXPORT_SYMBOL(ib_dma_virt_map_sg);
+#endif /* CONFIG_INFINIBAND_VIRT_DMA */
+
 static const struct rdma_nl_cbs ibnl_ls_cb_table[RDMA_NL_LS_NUM_OPS] = {
        [RDMA_NL_LS_OP_RESOLVE] = {
                .doit = ib_nl_handle_resolve_resp,