[PATCH V4 2/3] powerpc/swiotlb: Enable at early stage and disable if not necessary

Jia Hongtao-B38951 B38951 at freescale.com
Fri Aug 3 12:21:29 EST 2012


> -----Original Message-----
> From: Kumar Gala [mailto:galak at kernel.crashing.org]
> Sent: Thursday, August 02, 2012 8:55 PM
> To: Jia Hongtao-B38951
> Cc: linuxppc-dev at lists.ozlabs.org; Wood Scott-B07421; Li Yang-R58472
> Subject: Re: [PATCH V4 2/3] powerpc/swiotlb: Enable at early stage and
> disable if not necessary
> 
> 
> On Aug 2, 2012, at 6:42 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 <B38951 at freescale.com>
> > Signed-off-by: Li Yang <leoli at freescale.com>
> > ---
> 
> This doesn't seem like it addresses our issue w/regards to not being able
> to map all of memory from PCI.

PCI init will determine ppc_swiotlb_enable due to PCI map. swiotlb_late_init
will handle all swiotlb things depend on the result of pci init.

> 
> 
> > 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  |    2 +-
> > arch/powerpc/sysdev/fsl_pci.c            |    5 +----
> > 7 files changed, 32 insertions(+), 15 deletions(-)
> 
> Don't we also want to update all these:
> 
> arch/powerpc/platforms/85xx/corenet_ds.c:
> ppc_swiotlb_enable = 1;
> arch/powerpc/platforms/85xx/ge_imp3a.c:         ppc_swiotlb_enable = 1;
> arch/powerpc/platforms/85xx/mpc8536_ds.c:
> ppc_swiotlb_enable = 1;
> arch/powerpc/platforms/85xx/mpc85xx_mds.c:
> ppc_swiotlb_enable = 1;
> arch/powerpc/platforms/85xx/p1022_ds.c:         ppc_swiotlb_enable = 1;
> arch/powerpc/platforms/86xx/mpc86xx_hpcn.c:
> ppc_swiotlb_enable = 1;
> 

They are works fine at this point.

I will update all these boards after
[PATCH 3/3] Unify pci/pcie initialization code

> 
> >
> > 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..04260cd 100644
> > --- a/arch/powerpc/platforms/85xx/qemu_e500.c
> > +++ b/arch/powerpc/platforms/85xx/qemu_e500.c
> > @@ -41,7 +41,7 @@ static void __init qemu_e500_setup_arch(void)
> > {
> > 	ppc_md.progress("qemu_e500_setup_arch()", 0);
> >
> > -	fsl_pci_init();
> > +	swiotlb_detect_4g();
> 
> removing fsl_pci_init() seems wrong.

You are right. I will fix this.
Thanks.

-Hongtao.

> 
> > 	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
> >
> 




More information about the Linuxppc-dev mailing list