]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
powerpc: Add 86xx support for SWIOTLB
authorBecky Bruce <beckyb@kernel.crashing.org>
Thu, 14 May 2009 22:42:29 +0000 (17:42 -0500)
committerKumar Gala <galak@kernel.crashing.org>
Tue, 16 Jun 2009 02:45:29 +0000 (21:45 -0500)
This is the final bit of code to allow enabling swiotlb on
mpc86xx.  The platform-specific code is very small and consists
of enabling SWIOTLB in the config file, registering the
swiotlb_setup_bus_notifier initcall, and setting pci_dma_ops
to point to swiotlb_pci_dma_ops if we have more memory than
can be mapped by the inbound PCI windows.

Signed-off-by: Becky Bruce <beckyb@kernel.crashing.org>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
arch/powerpc/platforms/86xx/Kconfig
arch/powerpc/platforms/86xx/mpc86xx_hpcn.c

index fdaf4ddaa955c90c2a263afd62d4ba63fff0b249..9c7b64a3402b69fc90c87c9f9a958b70092f6116 100644 (file)
@@ -15,6 +15,7 @@ config MPC8641_HPCN
        select DEFAULT_UIMAGE
        select FSL_ULI1575
        select HAS_RAPIDIO
+       select SWIOTLB
        help
          This option enables support for the MPC8641 HPCN board.
 
index 7e9e83c04a8ac631fad1677d0f55f8d60558a432..66327024a6a6bd73a7597e2220f73600ff29187a 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/delay.h>
 #include <linux/seq_file.h>
 #include <linux/of_platform.h>
+#include <linux/lmb.h>
 
 #include <asm/system.h>
 #include <asm/time.h>
@@ -27,6 +28,7 @@
 #include <asm/prom.h>
 #include <mm/mmu_decl.h>
 #include <asm/udbg.h>
+#include <asm/swiotlb.h>
 
 #include <asm/mpic.h>
 
@@ -70,7 +72,9 @@ mpc86xx_hpcn_setup_arch(void)
 {
 #ifdef CONFIG_PCI
        struct device_node *np;
+       struct pci_controller *hose;
 #endif
+       dma_addr_t max = 0xffffffff;
 
        if (ppc_md.progress)
                ppc_md.progress("mpc86xx_hpcn_setup_arch()", 0);
@@ -83,6 +87,9 @@ mpc86xx_hpcn_setup_arch(void)
                        fsl_add_bridge(np, 1);
                else
                        fsl_add_bridge(np, 0);
+               hose = pci_find_hose_for_OF_device(np);
+               max = min(max, hose->dma_window_base_cur +
+                         hose->dma_window_size);
        }
 
        ppc_md.pci_exclude_device = mpc86xx_exclude_device;
@@ -94,6 +101,13 @@ mpc86xx_hpcn_setup_arch(void)
 #ifdef CONFIG_SMP
        mpc86xx_smp_init();
 #endif
+
+#ifdef CONFIG_SWIOTLB
+       if (lmb_end_of_DRAM() > max) {
+               ppc_swiotlb_enable = 1;
+               set_pci_dma_ops(&swiotlb_pci_dma_ops);
+       }
+#endif
 }
 
 
@@ -158,6 +172,7 @@ static int __init declare_of_platform_devices(void)
        return 0;
 }
 machine_device_initcall(mpc86xx_hpcn, declare_of_platform_devices);
+machine_arch_initcall(mpc86xx_hpcn, swiotlb_setup_bus_notifier);
 
 define_machine(mpc86xx_hpcn) {
        .name                   = "MPC86xx HPCN",