powerpc/iommu: Remove dma_data union
PATCH 1/3 powerpc/iommu: Remove dma_data union
To support "hybrid" DMA ops in a subsequent patch, we will need both a direct DMA offset and an iommu pointer. Those are currently exclusive (a union), so change them to be separate fields.
While there, also type iommu_table_base properly and make exist only on CONFIG_PPC64 since it's not referenced on 32-bit at all.
Signed-off-by Benjamin Herrenschmidt <[email protected]>
--- arch/powerpc/include/asm/device.h | 15 +++++++++------ arch/powerpc/include/asm/dma-mapping.h | 4 ++-- arch/powerpc/include/asm/iommu.h | 31 +++++++++++++++++++++++++------ 3 files changed, 36 insertions(+), 14 deletions(-)
arch/powerpc/include/asm/device.h +9 -6
@@ -10,6 +10,7 @@ struct dma_map_ops;struct device_node ;#ifdef CONFIG_PPC64 struct pci_dn ; +struct iommu_table ;#endif /*
@@ -23,13 +24,15 @@ struct dev_archdata {struct dma_map_ops *dma_ops;/* -* When an iommu is in use, dma_data is used as a ptr to the base of the -* iommu_table. Otherwise, it is a simple numerical offset. +* These two used to be a union. However, with the hybrid ops we need +* both so here we store both a DMA offset for direct mappings and +* an iommu_table for remapped DMA. */ -union { -dma_addr_t dma_offset; -void *iommu_table_base; - } dma_data; +dma_addr_t dma_offset; + +#ifdef CONFIG_PPC64 +struct iommu_table *iommu_table_base; +#endif #ifdef CONFIG_IOMMU_API void *iommu_domain;
arch/powerpc/include/asm/dma-mapping.h +2 -2
@@ -106,7 +106,7 @@ static inline void set_dma_ops(struct device *dev, struct dma_map_ops *ops)static inline dma_addr_t get_dma_offset (struct device *dev) {if (dev) -return dev->archdata.dma_data.dma_offset; +return dev->archdata.dma_offset;return PCI_DRAM_OFFSET ; }
@@ -114,7 +114,7 @@ static inline dma_addr_t get_dma_offset(struct device *dev)static inline void set_dma_offset (struct device *dev,dma_addr_t off) {if (dev) - dev->archdata.dma_data.dma_offset = off; + dev->archdata.dma_offset = off; }/* this will be removed soon */
arch/powerpc/include/asm/iommu.h +22 -3
@@ -93,16 +93,21 @@ int get_iommu_order(unsigned long size, struct iommu_table *tbl)struct scatterlist ; -static inline void set_iommu_table_base (struct device *dev,void *base) +#ifdef CONFIG_PPC64 + +static inline void set_iommu_table_base (struct device *dev, +struct iommu_table *base) { - dev->archdata.dma_data.iommu_table_base = base; + dev->archdata.iommu_table_base = base; }static inline void *get_iommu_table_base (struct device *dev) { -return dev->archdata.dma_data.iommu_table_base; +return dev->archdata.iommu_table_base; } +extern int dma_iommu_dma_supported (struct device *dev,u64 mask); +/* Frees table for an individual device node */ extern void iommu_free_table (struct iommu_table *tbl,const char *node_name);
@@ -146,6 +151,20 @@ static inline void set_iommu_table_base_and_group(struct device *dev,iommu_add_device (dev); } +#else + +static inline void *get_iommu_table_base (struct device *dev) +{ +return NULL ; +} + +static inline int dma_iommu_dma_supported (struct device *dev,u64 mask) +{ +return 0 ; +} + +#endif /* CONFIG_PPC64 */ + extern int ppc_iommu_map_sg(struct device *dev, struct iommu_table *tbl, struct scatterlist *sglist, int nelems, unsigned long mask,