|
@@ -1026,9 +1026,12 @@ static int dma_set_mask_pSeriesLP(struct device *dev, u64 dma_mask)
|
|
|
const void *dma_window = NULL;
|
|
|
u64 dma_offset;
|
|
|
|
|
|
- if (!dev->dma_mask || !dma_supported(dev, dma_mask))
|
|
|
+ if (!dev->dma_mask)
|
|
|
return -EIO;
|
|
|
|
|
|
+ if (!dev_is_pci(dev))
|
|
|
+ goto check_mask;
|
|
|
+
|
|
|
pdev = to_pci_dev(dev);
|
|
|
|
|
|
/* only attempt to use a new window if 64-bit DMA is requested */
|
|
@@ -1059,13 +1062,17 @@ static int dma_set_mask_pSeriesLP(struct device *dev, u64 dma_mask)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* fall-through to iommu ops */
|
|
|
- if (!ddw_enabled) {
|
|
|
- dev_info(dev, "Using 32-bit DMA via iommu\n");
|
|
|
+ /* fall back on iommu ops, restore table pointer with ops */
|
|
|
+ if (!ddw_enabled && get_dma_ops(dev) != &dma_iommu_ops) {
|
|
|
+ dev_info(dev, "Restoring 32-bit DMA via iommu\n");
|
|
|
set_dma_ops(dev, &dma_iommu_ops);
|
|
|
pci_dma_dev_setup_pSeriesLP(pdev);
|
|
|
}
|
|
|
|
|
|
+check_mask:
|
|
|
+ if (!dma_supported(dev, dma_mask))
|
|
|
+ return -EIO;
|
|
|
+
|
|
|
*dev->dma_mask = dma_mask;
|
|
|
return 0;
|
|
|
}
|