summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCatalin Marinas <catalin.marinas@arm.com>2010-03-09 09:55:10 +0000
committerColin Cross <ccross@android.com>2010-10-06 16:26:32 -0700
commit0ec7f7e47cf5406abbf87da3cd4c556da0f1dcbc (patch)
treeb7b37de11bf56761976ba306ee0492039ab45633
parent771f2628641969b7fb71f7aa04495943016742bc (diff)
Add "nol2x0" early param to avoid initialisation of the L2 controller
Some development platforms may have issues with this controller, so allow easy disabling from the kernel command line. The patch also adds a check for l2x0_disabled in the realview_pbx.c code to avoid setting additional L2x0 registers. Change-Id: Icbbd3e054688811200a4c96bf7e0a81c9c0ab790 Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
-rw-r--r--arch/arm/include/asm/hardware/cache-l2x0.h1
-rw-r--r--arch/arm/mach-realview/realview_pbx.c2
-rw-r--r--arch/arm/mm/cache-l2x0.c19
3 files changed, 21 insertions, 1 deletions
diff --git a/arch/arm/include/asm/hardware/cache-l2x0.h b/arch/arm/include/asm/hardware/cache-l2x0.h
index 89e2ff8a3585..787c06ada555 100644
--- a/arch/arm/include/asm/hardware/cache-l2x0.h
+++ b/arch/arm/include/asm/hardware/cache-l2x0.h
@@ -59,6 +59,7 @@
extern void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask);
extern void l2x0_shutdown(void);
extern void l2x0_restart(void);
+extern bool l2x0_disabled;
#endif
#endif
diff --git a/arch/arm/mach-realview/realview_pbx.c b/arch/arm/mach-realview/realview_pbx.c
index 9428eff0b116..af13eb6e553c 100644
--- a/arch/arm/mach-realview/realview_pbx.c
+++ b/arch/arm/mach-realview/realview_pbx.c
@@ -382,7 +382,7 @@ static void __init realview_pbx_init(void)
int i;
#ifdef CONFIG_CACHE_L2X0
- if (core_tile_pbxa9mp()) {
+ if (!l2x0_disabled && core_tile_pbxa9mp()) {
void __iomem *l2x0_base =
__io_address(REALVIEW_PBX_TILE_L220_BASE);
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c
index 9eb79d84b460..9abfa5d2b750 100644
--- a/arch/arm/mm/cache-l2x0.c
+++ b/arch/arm/mm/cache-l2x0.c
@@ -27,6 +27,7 @@
static void __iomem *l2x0_base;
static uint32_t l2x0_way_mask; /* Bitmask of active ways */
+bool l2x0_disabled;
static inline void cache_wait_always(void __iomem *reg, unsigned long mask)
{
@@ -249,6 +250,9 @@ void l2x0_shutdown(void)
{
unsigned long flags;
+ if (l2x0_disabled)
+ return;
+
BUG_ON(num_online_cpus() > 1);
local_irq_save(flags);
@@ -282,6 +286,9 @@ static void l2x0_enable(__u32 aux_val, __u32 aux_mask)
int ways;
const char *type;
+ if (l2x0_disabled)
+ return;
+
cache_id = readl_relaxed(l2x0_base + L2X0_CACHE_ID);
aux = readl_relaxed(l2x0_base + L2X0_AUX_CTRL);
@@ -338,6 +345,11 @@ void l2x0_restart(void)
void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask)
{
+ if (l2x0_disabled) {
+ pr_info(L2CC_TYPE " cache controller disabled\n");
+ return;
+ }
+
l2x0_base = base;
l2x0_enable(aux_val, aux_mask);
@@ -347,3 +359,10 @@ void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask)
outer_cache.flush_range = l2x0_flush_range;
outer_cache.sync = l2x0_cache_sync;
}
+
+static int __init l2x0_disable(char *unused)
+{
+ l2x0_disabled = 1;
+ return 0;
+}
+early_param("nol2x0", l2x0_disable);