powerpc/dma: Add optional platform override of dma_set_mask()
PATCH 1/2 powerpc/dma: Add optional platform override of dma_set_mask()
Some platforms may want to override dma_set_mask() to take into account some specific "features" such as the availability of a direct-map window in addition to an iommu.
Signed-off-by Benjamin Herrenschmidt <[email protected]>
--- arch/powerpc/include/asm/dma-mapping.h | 14 +------------- arch/powerpc/include/asm/machdep.h | 3 +++ arch/powerpc/kernel/dma.c | 18 ++++++++++++++++++ 3 files changed, 22 insertions(+), 13 deletions(-)
arch/powerpc/include/asm/dma-mapping.h +1 -13
@@ -127,19 +127,7 @@ static inline int dma_supported(struct device *dev, u64 mask)return dma_ops->dma_supported (dev, mask); } -static inline int dma_set_mask (struct device *dev,u64 dma_mask) -{ -struct dma_map_ops *dma_ops =get_dma_ops (dev); - -if (unlikely (dma_ops ==NULL )) -return -EIO ; -if (dma_ops->set_dma_mask !=NULL ) -return dma_ops->set_dma_mask (dev, dma_mask); -if (!dev->dma_mask || !dma_supported (dev, dma_mask)) -return -EIO ; - *dev->dma_mask = dma_mask; -return 0 ; -} +extern int dma_set_mask (struct device *dev,u64 dma_mask);static inline void *dma_alloc_coherent (struct device *dev,size_t size,dma_addr_t *dma_handle,gfp_t flag)
arch/powerpc/include/asm/machdep.h +3 -0
@@ -102,6 +102,9 @@ struct machdep_calls {void (*pci_dma_dev_setup)(struct pci_dev *dev);void (*pci_dma_bus_setup)(struct pci_bus *bus); +/* Platform set_dma_mask override */ +int (*dma_set_mask)(struct device *dev,u64 dma_mask); +int (*probe)(void );void (*setup_arch)(void );/* Optional, may be NULL */ void (*init_early)(void );
arch/powerpc/kernel/dma.c +18 -0
@@ -12,6 +12,7 @@#include <linux/memblock.h> #include <asm/bug.h> #include <asm/abs_addr.h> +#include <asm/machdep.h> /* * Generic direct DMA implementation
@@ -154,6 +155,23 @@ EXPORT_SYMBOL(dma_direct_ops);#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16) +int dma_set_mask (struct device *dev,u64 dma_mask) +{ +struct dma_map_ops *dma_ops =get_dma_ops (dev); + +if (ppc_md.dma_set_mask) +return ppc_md.dma_set_mask (dev, dma_mask); +if (unlikely (dma_ops ==NULL )) +return -EIO ; +if (dma_ops->set_dma_mask !=NULL ) +return dma_ops->set_dma_mask (dev, dma_mask); +if (!dev->dma_mask || !dma_supported (dev, dma_mask)) +return -EIO ; + *dev->dma_mask = dma_mask; +return 0 ; +} +EXPORT_SYMBOL (dma_set_mask); +static int __init dma_init (void ) {dma_debug_init (PREALLOC_DMA_DEBUG_ENTRIES );