|
@@ -746,6 +746,21 @@ static int dma_4u_mapping_error(struct device *dev, dma_addr_t dma_addr)
|
|
return dma_addr == SPARC_MAPPING_ERROR;
|
|
return dma_addr == SPARC_MAPPING_ERROR;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int dma_4u_supported(struct device *dev, u64 device_mask)
|
|
|
|
+{
|
|
|
|
+ struct iommu *iommu = dev->archdata.iommu;
|
|
|
|
+
|
|
|
|
+ if (device_mask > DMA_BIT_MASK(32))
|
|
|
|
+ return 0;
|
|
|
|
+ if ((device_mask & iommu->dma_addr_mask) == iommu->dma_addr_mask)
|
|
|
|
+ return 1;
|
|
|
|
+#ifdef CONFIG_PCI
|
|
|
|
+ if (dev_is_pci(dev))
|
|
|
|
+ return pci64_dma_supported(to_pci_dev(dev), device_mask);
|
|
|
|
+#endif
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static const struct dma_map_ops sun4u_dma_ops = {
|
|
static const struct dma_map_ops sun4u_dma_ops = {
|
|
.alloc = dma_4u_alloc_coherent,
|
|
.alloc = dma_4u_alloc_coherent,
|
|
.free = dma_4u_free_coherent,
|
|
.free = dma_4u_free_coherent,
|
|
@@ -755,32 +770,9 @@ static const struct dma_map_ops sun4u_dma_ops = {
|
|
.unmap_sg = dma_4u_unmap_sg,
|
|
.unmap_sg = dma_4u_unmap_sg,
|
|
.sync_single_for_cpu = dma_4u_sync_single_for_cpu,
|
|
.sync_single_for_cpu = dma_4u_sync_single_for_cpu,
|
|
.sync_sg_for_cpu = dma_4u_sync_sg_for_cpu,
|
|
.sync_sg_for_cpu = dma_4u_sync_sg_for_cpu,
|
|
|
|
+ .dma_supported = dma_4u_supported,
|
|
.mapping_error = dma_4u_mapping_error,
|
|
.mapping_error = dma_4u_mapping_error,
|
|
};
|
|
};
|
|
|
|
|
|
const struct dma_map_ops *dma_ops = &sun4u_dma_ops;
|
|
const struct dma_map_ops *dma_ops = &sun4u_dma_ops;
|
|
EXPORT_SYMBOL(dma_ops);
|
|
EXPORT_SYMBOL(dma_ops);
|
|
-
|
|
|
|
-int dma_supported(struct device *dev, u64 device_mask)
|
|
|
|
-{
|
|
|
|
- struct iommu *iommu = dev->archdata.iommu;
|
|
|
|
- u64 dma_addr_mask = iommu->dma_addr_mask;
|
|
|
|
-
|
|
|
|
- if (device_mask > DMA_BIT_MASK(32)) {
|
|
|
|
- if (iommu->atu)
|
|
|
|
- dma_addr_mask = iommu->atu->dma_addr_mask;
|
|
|
|
- else
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ((device_mask & dma_addr_mask) == dma_addr_mask)
|
|
|
|
- return 1;
|
|
|
|
-
|
|
|
|
-#ifdef CONFIG_PCI
|
|
|
|
- if (dev_is_pci(dev))
|
|
|
|
- return pci64_dma_supported(to_pci_dev(dev), device_mask);
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-EXPORT_SYMBOL(dma_supported);
|
|
|