Commit 0616d609 authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Linus Torvalds

[PATCH] ppc64: DART iommu allocation fix

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: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent a94b1b9b
...@@ -447,6 +447,14 @@ static int __init pmac_probe(int platform) ...@@ -447,6 +447,14 @@ static int __init pmac_probe(int platform)
if (platform != PLATFORM_POWERMAC) if (platform != PLATFORM_POWERMAC)
return 0; 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; return 1;
} }
......
...@@ -83,6 +83,7 @@ extern unsigned long klimit; ...@@ -83,6 +83,7 @@ extern unsigned long klimit;
static int __initdata dt_root_addr_cells; static int __initdata dt_root_addr_cells;
static int __initdata dt_root_size_cells; static int __initdata dt_root_size_cells;
static int __initdata iommu_is_off; static int __initdata iommu_is_off;
int __initdata iommu_force_on;
typedef u32 cell_t; typedef u32 cell_t;
#if 0 #if 0
...@@ -876,9 +877,11 @@ static int __init early_init_dt_scan_chosen(unsigned long node, ...@@ -876,9 +877,11 @@ static int __init early_init_dt_scan_chosen(unsigned long node,
return 0; return 0;
systemcfg->platform = *prop; 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) if (get_flat_dt_prop(node, "linux,iommu-off", NULL) != NULL)
iommu_is_off = 1; iommu_is_off = 1;
if (get_flat_dt_prop(node, "linux,iommu-force-on", NULL) != NULL)
iommu_force_on = 1;
#ifdef CONFIG_PPC_PSERIES #ifdef CONFIG_PPC_PSERIES
/* To help early debugging via the front panel, we retreive a minimal /* To help early debugging via the front panel, we retreive a minimal
......
...@@ -406,16 +406,6 @@ void __init early_setup(unsigned long dt_ptr) ...@@ -406,16 +406,6 @@ void __init early_setup(unsigned long dt_ptr)
DBG("Found, Initializing memory management...\n"); 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 * Initialize stab / SLB management
*/ */
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
#include "pci.h" #include "pci.h"
extern int iommu_force_on;
/* physical base of DART registers */ /* physical base of DART registers */
#define DART_BASE 0xf8033000UL #define DART_BASE 0xf8033000UL
...@@ -305,8 +306,7 @@ void __init alloc_u3_dart_table(void) ...@@ -305,8 +306,7 @@ void __init alloc_u3_dart_table(void)
/* Only reserve DART space if machine has more than 2GB of RAM /* Only reserve DART space if machine has more than 2GB of RAM
* or if requested with iommu=on on cmdline. * or if requested with iommu=on on cmdline.
*/ */
if (lmb_end_of_DRAM() <= 0x80000000ull && if (lmb_end_of_DRAM() <= 0x80000000ull && !iommu_force_on)
get_property(of_chosen, "linux,iommu-force-on", NULL) == NULL)
return; return;
/* 512 pages (2MB) is max DART tablesize. */ /* 512 pages (2MB) is max DART tablesize. */
......
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