|
@@ -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;
|