ppc64: DART iommu allocation fix
PATCH 1/1 ppc64: DART iommu allocation fix
Hi !
The current code allocating the DART has a couple of bugs, first it's called on all machines including the ones who have no DART (oops), and then it tries to access the device-tree using the "of_chosen" pointer before it was initialized.
The enclosed patch fixes these.
Signed-off-by Benjamin Herrenschmidt <[email protected]>
===== arch/ppc64/kernel/pmac_setup.c 1.8 vs edited =====
arch/ppc64/kernel/pmac_setup.c +8 -0
@@ -447,6 +447,14 @@if (platform !=PLATFORM_POWERMAC )return 0 ; +/* +* On U3, the DART (iommu) must be allocated now since it +* has an impact on htab_initialize (due to the large page it +* occupies having to be broken up so the DART itself is not +* part of the cacheable linar mapping +*/ +alloc_u3_dart_table (); +return 1 ; }
===== arch/ppc64/kernel/prom.c 1.101 vs edited =====
arch/ppc64/kernel/prom.c +4 -1
@@ -83,6 +83,7 @@static int __initdata dt_root_addr_cells;static int __initdata dt_root_size_cells;static int __initdata iommu_is_off; +int __initdata iommu_force_on;typedef u32 cell_t ;#if 0
@@ -876,9 +877,11 @@return 0 ; systemcfg->platform = *prop; -/* check if iommu is forced off */ +/* check if iommu is forced on or off */ if (get_flat_dt_prop (node,"linux,iommu-off" ,NULL ) !=NULL ) iommu_is_off =1 ; +if (get_flat_dt_prop (node,"linux,iommu-force-on" ,NULL ) !=NULL ) + iommu_force_on =1 ;#ifdef CONFIG_PPC_PSERIES /* To help early debugging via the front panel, we retreive a minimal
===== arch/ppc64/kernel/setup.c 1.80 vs edited =====
arch/ppc64/kernel/setup.c +0 -10
@@ -406,16 +406,6 @@DBG ("Found, Initializing memory management...\n" ); -#ifdef CONFIG_U3_DART -/* -* On U3, the DART (iommu) must be allocated now since it -* has an impact on htab_initialize (due to the large page it -* occupies having to be broken up so the DART itself is not -* part of the cacheable linar mapping -*/ -alloc_u3_dart_table (); -#endif /* CONFIG_U3_DART */ -/* * Initialize stab / SLB management */
===== arch/ppc64/kernel/u3_iommu.c 1.6 vs edited =====
arch/ppc64/kernel/u3_iommu.c +2 -2
@@ -47,6 +47,7 @@#include "pci.h" +extern int iommu_force_on;/* physical base of DART registers */ #define DART_BASE 0xf8033000UL
@@ -305,8 +306,7 @@/* Only reserve DART space if machine has more than 2GB of RAM * or if requested with iommu=on on cmdline. */ -if (lmb_end_of_DRAM () <=0x80000000ull && -get_property (of_chosen,"linux,iommu-force-on" ,NULL ) ==NULL ) +if (lmb_end_of_DRAM () <=0x80000000ull && !iommu_force_on)return ;/* 512 pages (2MB) is max DART tablesize. */