powerpc/vio: Remove dma not supported warnings
authorAnton Blanchard <anton@samba.org>
Sun, 24 Jun 2012 18:23:53 +0000 (18:23 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Tue, 10 Jul 2012 09:18:51 +0000 (19:18 +1000)
During boot we see a number of these warnings:

vio 30000000: Warning: IOMMU dma not supported: mask 0xffffffffffffffff, table unavailable

The reason for this is that we set IOMMU properties for all VIO
devices even if they are not DMA capable.

Only set DMA ops, table and mask for devices with a DMA window.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/kernel/vio.c

index 06cbc309b817d6bcd8aaa218ce7b663ecae1d99d..7d05fe2b5637049c2f158fa537099c958da6dfbe 100644 (file)
@@ -1397,21 +1397,27 @@ struct vio_dev *vio_register_device_node(struct device_node *of_node)
        viodev->name = of_node->name;
        viodev->dev.of_node = of_node_get(of_node);
 
-       if (firmware_has_feature(FW_FEATURE_CMO))
-               vio_cmo_set_dma_ops(viodev);
-       else
-               set_dma_ops(&viodev->dev, &dma_iommu_ops);
-       set_iommu_table_base(&viodev->dev, vio_build_iommu_table(viodev));
        set_dev_node(&viodev->dev, of_node_to_nid(of_node));
 
        /* init generic 'struct device' fields: */
        viodev->dev.parent = &vio_bus_device.dev;
        viodev->dev.bus = &vio_bus_type;
        viodev->dev.release = vio_dev_release;
-        /* needed to ensure proper operation of coherent allocations
-         * later, in case driver doesn't set it explicitly */
-        dma_set_mask(&viodev->dev, DMA_BIT_MASK(64));
-        dma_set_coherent_mask(&viodev->dev, DMA_BIT_MASK(64));
+
+       if (of_get_property(viodev->dev.of_node, "ibm,my-dma-window", NULL)) {
+               if (firmware_has_feature(FW_FEATURE_CMO))
+                       vio_cmo_set_dma_ops(viodev);
+               else
+                       set_dma_ops(&viodev->dev, &dma_iommu_ops);
+
+               set_iommu_table_base(&viodev->dev,
+                                    vio_build_iommu_table(viodev));
+
+               /* needed to ensure proper operation of coherent allocations
+                * later, in case driver doesn't set it explicitly */
+               dma_set_mask(&viodev->dev, DMA_BIT_MASK(64));
+               dma_set_coherent_mask(&viodev->dev, DMA_BIT_MASK(64));
+       }
 
        /* register with generic device framework */
        if (device_register(&viodev->dev)) {