powerpc/dma: Fix dma_iommu_dma_supported compare

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>

authored by Nishanth Aravamudan and committed by Benjamin Herrenschmidt 1cb8e85a dda804ad

+11 -10
+11 -10
arch/powerpc/kernel/dma-iommu.c
··· 74 { 75 struct iommu_table *tbl = get_iommu_table_base(dev); 76 77 - if (!tbl || tbl->it_offset > mask) { 78 - printk(KERN_INFO 79 - "Warning: IOMMU offset too big for device mask\n"); 80 - if (tbl) 81 - printk(KERN_INFO 82 - "mask: 0x%08llx, table offset: 0x%08lx\n", 83 - mask, tbl->it_offset); 84 - else 85 - printk(KERN_INFO "mask: 0x%08llx, table unavailable\n", 86 - mask); 87 return 0; 88 } else 89 return 1;
··· 74 { 75 struct iommu_table *tbl = get_iommu_table_base(dev); 76 77 + if (!tbl) { 78 + dev_info(dev, "Warning: IOMMU dma not supported: mask 0x%08llx" 79 + ", table unavailable\n", mask); 80 + return 0; 81 + } 82 + 83 + if ((tbl->it_offset + tbl->it_size) > (mask >> IOMMU_PAGE_SHIFT)) { 84 + dev_info(dev, "Warning: IOMMU window too big for device mask\n"); 85 + dev_info(dev, "mask: 0x%08llx, table end: 0x%08lx\n", 86 + mask, (tbl->it_offset + tbl->it_size) << 87 + IOMMU_PAGE_SHIFT); 88 return 0; 89 } else 90 return 1;