powerpc: Change archdata dma_data to a union
Sometimes this is used to hold a simple offset, and sometimes it is used to hold a pointer. This patch changes it to a union containing void * and dma_addr_t. get/set accessors are also provided, because it was getting a bit ugly to get to the actual data. Signed-off-by: Becky Bruce <beckyb@kernel.crashing.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
committed by
Benjamin Herrenschmidt
parent
1cebd7a0f6
commit
738ef42e32
@ -15,7 +15,16 @@ struct dev_archdata {
|
||||
|
||||
/* DMA operations on that device */
|
||||
struct dma_map_ops *dma_ops;
|
||||
void *dma_data;
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
union {
|
||||
dma_addr_t dma_offset;
|
||||
void *iommu_table_base;
|
||||
} dma_data;
|
||||
|
||||
#ifdef CONFIG_SWIOTLB
|
||||
dma_addr_t max_direct_dma_addr;
|
||||
#endif
|
||||
|
@ -97,14 +97,20 @@ static inline void set_dma_ops(struct device *dev, struct dma_map_ops *ops)
|
||||
* swiotlb use this function, but it is typically not used by implementations
|
||||
* with an iommu.
|
||||
*/
|
||||
static inline unsigned long get_dma_offset(struct device *dev)
|
||||
static inline dma_addr_t get_dma_offset(struct device *dev)
|
||||
{
|
||||
if (dev)
|
||||
return (unsigned long)dev->archdata.dma_data;
|
||||
return dev->archdata.dma_data.dma_offset;
|
||||
|
||||
return PCI_DRAM_OFFSET;
|
||||
}
|
||||
|
||||
static inline void set_dma_offset(struct device *dev, dma_addr_t off)
|
||||
{
|
||||
if (dev)
|
||||
dev->archdata.dma_data.dma_offset = off;
|
||||
}
|
||||
|
||||
/* this will be removed soon */
|
||||
#define flush_write_buffers()
|
||||
|
||||
|
@ -70,6 +70,16 @@ struct iommu_table {
|
||||
|
||||
struct scatterlist;
|
||||
|
||||
static inline void set_iommu_table_base(struct device *dev, void *base)
|
||||
{
|
||||
dev->archdata.dma_data.iommu_table_base = base;
|
||||
}
|
||||
|
||||
static inline void *get_iommu_table_base(struct device *dev)
|
||||
{
|
||||
return dev->archdata.dma_data.iommu_table_base;
|
||||
}
|
||||
|
||||
/* Frees table for an individual device node */
|
||||
extern void iommu_free_table(struct iommu_table *tbl, const char *node_name);
|
||||
|
||||
|
Reference in New Issue
Block a user