[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