Merge tag 'v5.10-rockchip-dtsfixes1' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / drivers / infiniband / core / device.c
index 23ee65a..a3b1fc8 100644 (file)
@@ -1177,58 +1177,23 @@ out:
        return ret;
 }
 
-static void setup_dma_device(struct ib_device *device)
+static void setup_dma_device(struct ib_device *device,
+                            struct device *dma_device)
 {
-       struct device *parent = device->dev.parent;
-
-       WARN_ON_ONCE(device->dma_device);
-
-#ifdef CONFIG_DMA_OPS
-       if (device->dev.dma_ops) {
-               /*
-                * The caller provided custom DMA operations. Copy the
-                * DMA-related fields that are used by e.g. dma_alloc_coherent()
-                * into device->dev.
-                */
-               device->dma_device = &device->dev;
-               if (!device->dev.dma_mask) {
-                       if (parent)
-                               device->dev.dma_mask = parent->dma_mask;
-                       else
-                               WARN_ON_ONCE(true);
-               }
-               if (!device->dev.coherent_dma_mask) {
-                       if (parent)
-                               device->dev.coherent_dma_mask =
-                                       parent->coherent_dma_mask;
-                       else
-                               WARN_ON_ONCE(true);
-               }
-       } else
-#endif /* CONFIG_DMA_OPS */
-       {
-               /*
-                * The caller did not provide custom DMA operations. Use the
-                * DMA mapping operations of the parent device.
-                */
-               WARN_ON_ONCE(!parent);
-               device->dma_device = parent;
-       }
-
-       if (!device->dev.dma_parms) {
-               if (parent) {
-                       /*
-                        * The caller did not provide DMA parameters, so
-                        * 'parent' probably represents a PCI device. The PCI
-                        * core sets the maximum segment size to 64
-                        * KB. Increase this parameter to 2 GB.
-                        */
-                       device->dev.dma_parms = parent->dma_parms;
-                       dma_set_max_seg_size(device->dma_device, SZ_2G);
-               } else {
-                       WARN_ON_ONCE(true);
-               }
+       /*
+        * 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);
 }
 
 /*
@@ -1241,7 +1206,6 @@ static int setup_device(struct ib_device *device)
        struct ib_udata uhw = {.outlen = 0, .inlen = 0};
        int ret;
 
-       setup_dma_device(device);
        ib_device_check_mandatory(device);
 
        ret = setup_port_data(device);
@@ -1354,7 +1318,10 @@ static void prevent_dealloc_device(struct ib_device *ib_dev)
  * ib_register_device - Register an IB device with IB core
  * @device: Device to register
  * @name: unique string device name. This may include a '%' which will
- * cause a unique index to be added to the passed device name.
+ *       cause a unique index to be added to the passed device name.
+ * @dma_device: pointer to a DMA-capable device. If %NULL, 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.
  *
  * Low-level drivers use ib_register_device() to register their
  * devices with the IB core.  All registered clients will receive a
@@ -1365,7 +1332,8 @@ static void prevent_dealloc_device(struct ib_device *ib_dev)
  * asynchronously then the device pointer may become freed as soon as this
  * function returns.
  */
-int ib_register_device(struct ib_device *device, const char *name)
+int ib_register_device(struct ib_device *device, const char *name,
+                      struct device *dma_device)
 {
        int ret;
 
@@ -1373,6 +1341,7 @@ int ib_register_device(struct ib_device *device, const char *name)
        if (ret)
                return ret;
 
+       setup_dma_device(device, dma_device);
        ret = setup_device(device);
        if (ret)
                return ret;
@@ -2697,7 +2666,9 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
        SET_OBJ_SIZE(dev_ops, ib_ah);
        SET_OBJ_SIZE(dev_ops, ib_counters);
        SET_OBJ_SIZE(dev_ops, ib_cq);
+       SET_OBJ_SIZE(dev_ops, ib_mw);
        SET_OBJ_SIZE(dev_ops, ib_pd);
+       SET_OBJ_SIZE(dev_ops, ib_rwq_ind_table);
        SET_OBJ_SIZE(dev_ops, ib_srq);
        SET_OBJ_SIZE(dev_ops, ib_ucontext);
        SET_OBJ_SIZE(dev_ops, ib_xrcd);