powerpc/dma: Fix dma_iommu_dma_supported compare
authorNishanth Aravamudan <nacc@us.ibm.com>
Wed, 15 Sep 2010 08:05:45 +0000 (08:05 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 13 Oct 2010 05:19:21 +0000 (16:19 +1100)
The table offset is in entries, each of which imply a dma address of
an IOMMU page.

Also, we should check the device can reach the whole IOMMU table.

Signed-off-by: Milton Miller <miltonm@bga.com>
Signed-off-by: Nishanth Aravamudan <nacc@us.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/kernel/dma-iommu.c

index 37771a51811915665e7279f0ec0089e20cfcf51b..6e54a0fd31aa2485591b565bb9e0a8e121835fb7 100644 (file)
@@ -74,16 +74,17 @@ static int dma_iommu_dma_supported(struct device *dev, u64 mask)
 {
        struct iommu_table *tbl = get_iommu_table_base(dev);
 
-       if (!tbl || tbl->it_offset > mask) {
-               printk(KERN_INFO
-                      "Warning: IOMMU offset too big for device mask\n");
-               if (tbl)
-                       printk(KERN_INFO
-                              "mask: 0x%08llx, table offset: 0x%08lx\n",
-                               mask, tbl->it_offset);
-               else
-                       printk(KERN_INFO "mask: 0x%08llx, table unavailable\n",
-                               mask);
+       if (!tbl) {
+               dev_info(dev, "Warning: IOMMU dma not supported: mask 0x%08llx"
+                       ", table unavailable\n", mask);
+               return 0;
+       }
+
+       if ((tbl->it_offset + tbl->it_size) > (mask >> IOMMU_PAGE_SHIFT)) {
+               dev_info(dev, "Warning: IOMMU window too big for device mask\n");
+               dev_info(dev, "mask: 0x%08llx, table end: 0x%08lx\n",
+                               mask, (tbl->it_offset + tbl->it_size) <<
+                               IOMMU_PAGE_SHIFT);
                return 0;
        } else
                return 1;