On Aug 3, 2012, at 5:14 AM, Jia Hongtao wrote: > Remove the dependency on PCI initialization for SWIOTLB initialization. > So that PCI can be initialized at proper time. > > SWIOTLB is partly determined by PCI inbound/outbound map which is assigned > in PCI initialization. But swiotlb_init() should be done at the stage of > mem_init() which is much earlier than PCI initialization. So we reserve the > memory for SWIOTLB first and free it if not necessary. > > All boards are converted to fit this change. > > Signed-off-by: Jia Hongtao <b38...@freescale.com> > Signed-off-by: Li Yang <le...@freescale.com> > --- > arch/powerpc/include/asm/swiotlb.h | 6 ++++++ > arch/powerpc/kernel/dma-swiotlb.c | 20 ++++++++++++++++++++ > arch/powerpc/mm/mem.c | 3 +-- > arch/powerpc/platforms/44x/currituck.c | 10 ++-------- > arch/powerpc/platforms/85xx/mpc85xx_ds.c | 1 + > arch/powerpc/platforms/85xx/qemu_e500.c | 1 + > arch/powerpc/sysdev/fsl_pci.c | 5 +---- > 7 files changed, 32 insertions(+), 14 deletions(-)
Josh, Tony Can you ack the 44x/currituck.c change. thanks - k > > diff --git a/arch/powerpc/include/asm/swiotlb.h > b/arch/powerpc/include/asm/swiotlb.h > index 8979d4c..de99d6e 100644 > --- a/arch/powerpc/include/asm/swiotlb.h > +++ b/arch/powerpc/include/asm/swiotlb.h > @@ -22,4 +22,10 @@ int __init swiotlb_setup_bus_notifier(void); > > extern void pci_dma_dev_setup_swiotlb(struct pci_dev *pdev); > > +#ifdef CONFIG_SWIOTLB > +void swiotlb_detect_4g(void); > +#else > +static inline void swiotlb_detect_4g(void) {} > +#endif > + > #endif /* __ASM_SWIOTLB_H */ > diff --git a/arch/powerpc/kernel/dma-swiotlb.c > b/arch/powerpc/kernel/dma-swiotlb.c > index 4ab88da..aa85550 100644 > --- a/arch/powerpc/kernel/dma-swiotlb.c > +++ b/arch/powerpc/kernel/dma-swiotlb.c > @@ -104,3 +104,23 @@ int __init swiotlb_setup_bus_notifier(void) > &ppc_swiotlb_plat_bus_notifier); > return 0; > } > + > +void swiotlb_detect_4g(void) > +{ > + if ((memblock_end_of_DRAM() - 1) > 0xffffffff) > + ppc_swiotlb_enable = 1; > +} > + > +static int __init swiotlb_late_init(void) > +{ > + if (ppc_swiotlb_enable) { > + swiotlb_print_info(); > + set_pci_dma_ops(&swiotlb_dma_ops); > + ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb; > + } else { > + swiotlb_free(); > + } > + > + return 0; > +} > +subsys_initcall(swiotlb_late_init); > diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c > index baaafde..f23c4e0 100644 > --- a/arch/powerpc/mm/mem.c > +++ b/arch/powerpc/mm/mem.c > @@ -300,8 +300,7 @@ void __init mem_init(void) > unsigned long reservedpages = 0, codesize, initsize, datasize, bsssize; > > #ifdef CONFIG_SWIOTLB > - if (ppc_swiotlb_enable) > - swiotlb_init(1); > + swiotlb_init(0); > #endif > > num_physpages = memblock_phys_mem_size() >> PAGE_SHIFT; > diff --git a/arch/powerpc/platforms/44x/currituck.c > b/arch/powerpc/platforms/44x/currituck.c > index 9f6c33d..6bd89a0 100644 > --- a/arch/powerpc/platforms/44x/currituck.c > +++ b/arch/powerpc/platforms/44x/currituck.c > @@ -21,7 +21,6 @@ > */ > > #include <linux/init.h> > -#include <linux/memblock.h> > #include <linux/of.h> > #include <linux/of_platform.h> > #include <linux/rtc.h> > @@ -159,13 +158,8 @@ static void __init ppc47x_setup_arch(void) > > /* No need to check the DMA config as we /know/ our windows are all of > * RAM. Lets hope that doesn't change */ > -#ifdef CONFIG_SWIOTLB > - if ((memblock_end_of_DRAM() - 1) > 0xffffffff) { > - ppc_swiotlb_enable = 1; > - set_pci_dma_ops(&swiotlb_dma_ops); > - ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb; > - } > -#endif > + swiotlb_detect_4g(); > + > ppc47x_smp_init(); > } > > diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ds.c > b/arch/powerpc/platforms/85xx/mpc85xx_ds.c > index 6d3265f..56f8c8f 100644 > --- a/arch/powerpc/platforms/85xx/mpc85xx_ds.c > +++ b/arch/powerpc/platforms/85xx/mpc85xx_ds.c > @@ -159,6 +159,7 @@ static void __init mpc85xx_ds_setup_arch(void) > if (ppc_md.progress) > ppc_md.progress("mpc85xx_ds_setup_arch()", 0); > > + swiotlb_detect_4g(); > mpc85xx_ds_pci_init(); > mpc85xx_smp_init(); > > diff --git a/arch/powerpc/platforms/85xx/qemu_e500.c > b/arch/powerpc/platforms/85xx/qemu_e500.c > index 95a2e53..3c5490c 100644 > --- a/arch/powerpc/platforms/85xx/qemu_e500.c > +++ b/arch/powerpc/platforms/85xx/qemu_e500.c > @@ -42,6 +42,7 @@ static void __init qemu_e500_setup_arch(void) > ppc_md.progress("qemu_e500_setup_arch()", 0); > > fsl_pci_init(); > + swiotlb_detect_4g(); > mpc85xx_smp_init(); > } > > diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c > index 6938792..da7a3d7 100644 > --- a/arch/powerpc/sysdev/fsl_pci.c > +++ b/arch/powerpc/sysdev/fsl_pci.c > @@ -872,11 +872,8 @@ void __devinit fsl_pci_init(void) > * we need SWIOTLB to handle buffers located outside of > * dma capable memory region > */ > - if (memblock_end_of_DRAM() - 1 > max) { > + if (memblock_end_of_DRAM() - 1 > max) > ppc_swiotlb_enable = 1; > - set_pci_dma_ops(&swiotlb_dma_ops); > - ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb; > - } > #endif > } > #endif > -- > 1.7.5.1 > _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev