Commit 688ba1db authored by Jia Hongtao's avatar Jia Hongtao Committed by Kumar Gala

powerpc/swiotlb: Enable at early stage and disable if not necessary

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: default avatarJia Hongtao <B38951@freescale.com>
Signed-off-by: default avatarLi Yang <leoli@freescale.com>
Acked-by: default avatarTony Breeds <tony@bakeyournoodle.com>
Signed-off-by: default avatarKumar Gala <galak@kernel.crashing.org>
parent 39be5b4a
...@@ -22,4 +22,10 @@ int __init swiotlb_setup_bus_notifier(void); ...@@ -22,4 +22,10 @@ int __init swiotlb_setup_bus_notifier(void);
extern void pci_dma_dev_setup_swiotlb(struct pci_dev *pdev); 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 */ #endif /* __ASM_SWIOTLB_H */
...@@ -105,3 +105,23 @@ int __init swiotlb_setup_bus_notifier(void) ...@@ -105,3 +105,23 @@ int __init swiotlb_setup_bus_notifier(void)
&ppc_swiotlb_plat_bus_notifier); &ppc_swiotlb_plat_bus_notifier);
return 0; 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);
...@@ -300,8 +300,7 @@ void __init mem_init(void) ...@@ -300,8 +300,7 @@ void __init mem_init(void)
unsigned long reservedpages = 0, codesize, initsize, datasize, bsssize; unsigned long reservedpages = 0, codesize, initsize, datasize, bsssize;
#ifdef CONFIG_SWIOTLB #ifdef CONFIG_SWIOTLB
if (ppc_swiotlb_enable) swiotlb_init(0);
swiotlb_init(1);
#endif #endif
num_physpages = memblock_phys_mem_size() >> PAGE_SHIFT; num_physpages = memblock_phys_mem_size() >> PAGE_SHIFT;
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
*/ */
#include <linux/init.h> #include <linux/init.h>
#include <linux/memblock.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/rtc.h> #include <linux/rtc.h>
...@@ -159,13 +158,8 @@ static void __init ppc47x_setup_arch(void) ...@@ -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 /* No need to check the DMA config as we /know/ our windows are all of
* RAM. Lets hope that doesn't change */ * RAM. Lets hope that doesn't change */
#ifdef CONFIG_SWIOTLB swiotlb_detect_4g();
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
ppc47x_smp_init(); ppc47x_smp_init();
} }
......
...@@ -159,6 +159,7 @@ static void __init mpc85xx_ds_setup_arch(void) ...@@ -159,6 +159,7 @@ static void __init mpc85xx_ds_setup_arch(void)
if (ppc_md.progress) if (ppc_md.progress)
ppc_md.progress("mpc85xx_ds_setup_arch()", 0); ppc_md.progress("mpc85xx_ds_setup_arch()", 0);
swiotlb_detect_4g();
mpc85xx_ds_pci_init(); mpc85xx_ds_pci_init();
mpc85xx_smp_init(); mpc85xx_smp_init();
......
...@@ -42,6 +42,7 @@ static void __init qemu_e500_setup_arch(void) ...@@ -42,6 +42,7 @@ static void __init qemu_e500_setup_arch(void)
ppc_md.progress("qemu_e500_setup_arch()", 0); ppc_md.progress("qemu_e500_setup_arch()", 0);
fsl_pci_init(); fsl_pci_init();
swiotlb_detect_4g();
mpc85xx_smp_init(); mpc85xx_smp_init();
} }
......
...@@ -872,11 +872,8 @@ void __devinit fsl_pci_init(void) ...@@ -872,11 +872,8 @@ void __devinit fsl_pci_init(void)
* we need SWIOTLB to handle buffers located outside of * we need SWIOTLB to handle buffers located outside of
* dma capable memory region * dma capable memory region
*/ */
if (memblock_end_of_DRAM() - 1 > max) { if (memblock_end_of_DRAM() - 1 > max)
ppc_swiotlb_enable = 1; ppc_swiotlb_enable = 1;
set_pci_dma_ops(&swiotlb_dma_ops);
ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb;
}
#endif #endif
} }
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment