On Wed, 2009-09-02 at 17:23 -0500, Becky Bruce wrote: > 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.
Looks good, but please respin the two patches with the comment I suggested added :-) Cheers, Ben. > Signed-off-by: Becky Bruce <bec...@kernel.crashing.org> > --- > arch/powerpc/include/asm/device.h | 11 ++++++++++- > arch/powerpc/include/asm/dma-mapping.h | 10 ++++++++-- > arch/powerpc/include/asm/iommu.h | 10 ++++++++++ > arch/powerpc/kernel/dma-iommu.c | 16 ++++++++-------- > arch/powerpc/kernel/pci-common.c | 2 +- > arch/powerpc/kernel/vio.c | 2 +- > arch/powerpc/platforms/cell/beat_iommu.c | 2 +- > arch/powerpc/platforms/cell/iommu.c | 9 +++------ > arch/powerpc/platforms/iseries/iommu.c | 2 +- > arch/powerpc/platforms/pasemi/iommu.c | 2 +- > arch/powerpc/platforms/pseries/iommu.c | 8 ++++---- > arch/powerpc/sysdev/dart_iommu.c | 2 +- > 12 files changed, 49 insertions(+), 27 deletions(-) > > diff --git a/arch/powerpc/include/asm/device.h > b/arch/powerpc/include/asm/device.h > index 67fcd7f..07ca8b5 100644 > --- a/arch/powerpc/include/asm/device.h > +++ b/arch/powerpc/include/asm/device.h > @@ -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 > diff --git a/arch/powerpc/include/asm/dma-mapping.h > b/arch/powerpc/include/asm/dma-mapping.h > index eef4db1..e9f4fe9 100644 > --- a/arch/powerpc/include/asm/dma-mapping.h > +++ b/arch/powerpc/include/asm/dma-mapping.h > @@ -89,14 +89,20 @@ static inline void set_dma_ops(struct device *dev, struct > dma_map_ops *ops) > dev->archdata.dma_ops = ops; > } > > -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() > > diff --git a/arch/powerpc/include/asm/iommu.h > b/arch/powerpc/include/asm/iommu.h > index 7464c0d..edfc980 100644 > --- a/arch/powerpc/include/asm/iommu.h > +++ b/arch/powerpc/include/asm/iommu.h > @@ -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); > > diff --git a/arch/powerpc/kernel/dma-iommu.c b/arch/powerpc/kernel/dma-iommu.c > index 87ddb3f..37771a5 100644 > --- a/arch/powerpc/kernel/dma-iommu.c > +++ b/arch/powerpc/kernel/dma-iommu.c > @@ -18,7 +18,7 @@ > static void *dma_iommu_alloc_coherent(struct device *dev, size_t size, > dma_addr_t *dma_handle, gfp_t flag) > { > - return iommu_alloc_coherent(dev, dev->archdata.dma_data, size, > + return iommu_alloc_coherent(dev, get_iommu_table_base(dev), size, > dma_handle, device_to_mask(dev), flag, > dev_to_node(dev)); > } > @@ -26,7 +26,7 @@ static void *dma_iommu_alloc_coherent(struct device *dev, > size_t size, > static void dma_iommu_free_coherent(struct device *dev, size_t size, > void *vaddr, dma_addr_t dma_handle) > { > - iommu_free_coherent(dev->archdata.dma_data, size, vaddr, dma_handle); > + iommu_free_coherent(get_iommu_table_base(dev), size, vaddr, dma_handle); > } > > /* Creates TCEs for a user provided buffer. The user buffer must be > @@ -39,8 +39,8 @@ static dma_addr_t dma_iommu_map_page(struct device *dev, > struct page *page, > enum dma_data_direction direction, > struct dma_attrs *attrs) > { > - return iommu_map_page(dev, dev->archdata.dma_data, page, offset, size, > - device_to_mask(dev), direction, attrs); > + return iommu_map_page(dev, get_iommu_table_base(dev), page, offset, > + size, device_to_mask(dev), direction, attrs); > } > > > @@ -48,7 +48,7 @@ static void dma_iommu_unmap_page(struct device *dev, > dma_addr_t dma_handle, > size_t size, enum dma_data_direction direction, > struct dma_attrs *attrs) > { > - iommu_unmap_page(dev->archdata.dma_data, dma_handle, size, direction, > + iommu_unmap_page(get_iommu_table_base(dev), dma_handle, size, direction, > attrs); > } > > @@ -57,7 +57,7 @@ static int dma_iommu_map_sg(struct device *dev, struct > scatterlist *sglist, > int nelems, enum dma_data_direction direction, > struct dma_attrs *attrs) > { > - return iommu_map_sg(dev, dev->archdata.dma_data, sglist, nelems, > + return iommu_map_sg(dev, get_iommu_table_base(dev), sglist, nelems, > device_to_mask(dev), direction, attrs); > } > > @@ -65,14 +65,14 @@ static void dma_iommu_unmap_sg(struct device *dev, struct > scatterlist *sglist, > int nelems, enum dma_data_direction direction, > struct dma_attrs *attrs) > { > - iommu_unmap_sg(dev->archdata.dma_data, sglist, nelems, direction, > + iommu_unmap_sg(get_iommu_table_base(dev), sglist, nelems, direction, > attrs); > } > > /* We support DMA to/from any memory page via the iommu */ > static int dma_iommu_dma_supported(struct device *dev, u64 mask) > { > - struct iommu_table *tbl = dev->archdata.dma_data; > + struct iommu_table *tbl = get_iommu_table_base(dev); > > if (!tbl || tbl->it_offset > mask) { > printk(KERN_INFO > diff --git a/arch/powerpc/kernel/pci-common.c > b/arch/powerpc/kernel/pci-common.c > index e9f4840..bb8209e 100644 > --- a/arch/powerpc/kernel/pci-common.c > +++ b/arch/powerpc/kernel/pci-common.c > @@ -1117,7 +1117,7 @@ void __devinit pcibios_setup_bus_devices(struct pci_bus > *bus) > > /* Hook up default DMA ops */ > sd->dma_ops = pci_dma_ops; > - sd->dma_data = (void *)PCI_DRAM_OFFSET; > + set_dma_offset(&dev->dev, PCI_DRAM_OFFSET); > > /* Additional platform DMA/iommu setup */ > if (ppc_md.pci_dma_dev_setup) > diff --git a/arch/powerpc/kernel/vio.c b/arch/powerpc/kernel/vio.c > index bc7b41e..8d9275f 100644 > --- a/arch/powerpc/kernel/vio.c > +++ b/arch/powerpc/kernel/vio.c > @@ -1233,7 +1233,7 @@ struct vio_dev *vio_register_device_node(struct > device_node *of_node) > vio_cmo_set_dma_ops(viodev); > else > viodev->dev.archdata.dma_ops = &dma_iommu_ops; > - viodev->dev.archdata.dma_data = vio_build_iommu_table(viodev); > + set_iommu_table_base(&viodev->dev, vio_build_iommu_table(viodev)); > set_dev_node(&viodev->dev, of_node_to_nid(of_node)); > > /* init generic 'struct device' fields: */ > diff --git a/arch/powerpc/platforms/cell/beat_iommu.c > b/arch/powerpc/platforms/cell/beat_iommu.c > index 93b0efd..39d361c 100644 > --- a/arch/powerpc/platforms/cell/beat_iommu.c > +++ b/arch/powerpc/platforms/cell/beat_iommu.c > @@ -77,7 +77,7 @@ static void __init celleb_init_direct_mapping(void) > static void celleb_dma_dev_setup(struct device *dev) > { > dev->archdata.dma_ops = get_pci_dma_ops(); > - dev->archdata.dma_data = (void *)celleb_dma_direct_offset; > + set_dma_offset(dev, celleb_dma_direct_offset); > } > > static void celleb_pci_dma_dev_setup(struct pci_dev *pdev) > diff --git a/arch/powerpc/platforms/cell/iommu.c > b/arch/powerpc/platforms/cell/iommu.c > index 416db17..ca5bfdf 100644 > --- a/arch/powerpc/platforms/cell/iommu.c > +++ b/arch/powerpc/platforms/cell/iommu.c > @@ -657,15 +657,13 @@ static void cell_dma_dev_setup_fixed(struct device > *dev); > > static void cell_dma_dev_setup(struct device *dev) > { > - struct dev_archdata *archdata = &dev->archdata; > - > /* Order is important here, these are not mutually exclusive */ > if (get_dma_ops(dev) == &dma_iommu_fixed_ops) > cell_dma_dev_setup_fixed(dev); > else if (get_pci_dma_ops() == &dma_iommu_ops) > - archdata->dma_data = cell_get_iommu_table(dev); > + set_iommu_table_base(dev, cell_get_iommu_table(dev)); > else if (get_pci_dma_ops() == &dma_direct_ops) > - archdata->dma_data = (void *)cell_dma_direct_offset; > + set_dma_offset(dev, cell_dma_direct_offset); > else > BUG(); > } > @@ -973,11 +971,10 @@ static int dma_set_mask_and_switch(struct device *dev, > u64 dma_mask) > > static void cell_dma_dev_setup_fixed(struct device *dev) > { > - struct dev_archdata *archdata = &dev->archdata; > u64 addr; > > addr = cell_iommu_get_fixed_address(dev) + dma_iommu_fixed_base; > - archdata->dma_data = (void *)addr; > + set_dma_offset(dev, addr); > > dev_dbg(dev, "iommu: fixed addr = %llx\n", addr); > } > diff --git a/arch/powerpc/platforms/iseries/iommu.c > b/arch/powerpc/platforms/iseries/iommu.c > index 6c1e101..9d53cb4 100644 > --- a/arch/powerpc/platforms/iseries/iommu.c > +++ b/arch/powerpc/platforms/iseries/iommu.c > @@ -193,7 +193,7 @@ static void pci_dma_dev_setup_iseries(struct pci_dev > *pdev) > pdn->iommu_table = iommu_init_table(tbl, -1); > else > kfree(tbl); > - pdev->dev.archdata.dma_data = pdn->iommu_table; > + set_iommu_table_base(&pdev->dev, pdn->iommu_table); > } > #else > #define pci_dma_dev_setup_iseries NULL > diff --git a/arch/powerpc/platforms/pasemi/iommu.c > b/arch/powerpc/platforms/pasemi/iommu.c > index a0ff03a..7b1d608 100644 > --- a/arch/powerpc/platforms/pasemi/iommu.c > +++ b/arch/powerpc/platforms/pasemi/iommu.c > @@ -189,7 +189,7 @@ static void pci_dma_dev_setup_pasemi(struct pci_dev *dev) > } > #endif > > - dev->dev.archdata.dma_data = &iommu_table_iobmap; > + set_iommu_table_base(&dev->dev, &iommu_table_iobmap); > } > > static void pci_dma_bus_setup_null(struct pci_bus *b) { } > diff --git a/arch/powerpc/platforms/pseries/iommu.c > b/arch/powerpc/platforms/pseries/iommu.c > index 661c8e0..1a0000a 100644 > --- a/arch/powerpc/platforms/pseries/iommu.c > +++ b/arch/powerpc/platforms/pseries/iommu.c > @@ -482,7 +482,7 @@ static void pci_dma_dev_setup_pSeries(struct pci_dev *dev) > phb->node); > iommu_table_setparms(phb, dn, tbl); > PCI_DN(dn)->iommu_table = iommu_init_table(tbl, phb->node); > - dev->dev.archdata.dma_data = PCI_DN(dn)->iommu_table; > + set_iommu_table_base(&dev->dev, PCI_DN(dn)->iommu_table); > return; > } > > @@ -494,7 +494,7 @@ static void pci_dma_dev_setup_pSeries(struct pci_dev *dev) > dn = dn->parent; > > if (dn && PCI_DN(dn)) > - dev->dev.archdata.dma_data = PCI_DN(dn)->iommu_table; > + set_iommu_table_base(&dev->dev, PCI_DN(dn)->iommu_table); > else > printk(KERN_WARNING "iommu: Device %s has no iommu table\n", > pci_name(dev)); > @@ -538,7 +538,7 @@ static void pci_dma_dev_setup_pSeriesLP(struct pci_dev > *dev) > */ > if (dma_window == NULL || pdn->parent == NULL) { > pr_debug(" no dma window for device, linking to parent\n"); > - dev->dev.archdata.dma_data = PCI_DN(pdn)->iommu_table; > + set_iommu_table_base(&dev->dev, PCI_DN(pdn)->iommu_table); > return; > } > > @@ -554,7 +554,7 @@ static void pci_dma_dev_setup_pSeriesLP(struct pci_dev > *dev) > pr_debug(" found DMA window, table: %p\n", pci->iommu_table); > } > > - dev->dev.archdata.dma_data = pci->iommu_table; > + set_iommu_table_base(&dev->dev, pci->iommu_table); > } > #else /* CONFIG_PCI */ > #define pci_dma_bus_setup_pSeries NULL > diff --git a/arch/powerpc/sysdev/dart_iommu.c > b/arch/powerpc/sysdev/dart_iommu.c > index 89639ec..ae3c4db 100644 > --- a/arch/powerpc/sysdev/dart_iommu.c > +++ b/arch/powerpc/sysdev/dart_iommu.c > @@ -297,7 +297,7 @@ static void pci_dma_dev_setup_dart(struct pci_dev *dev) > /* We only have one iommu table on the mac for now, which makes > * things simple. Setup all PCI devices to point to this table > */ > - dev->dev.archdata.dma_data = &iommu_table_dart; > + set_iommu_table_base(&dev->dev, &iommu_table_dart); > } > > static void pci_dma_bus_setup_dart(struct pci_bus *bus) _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev