diff options
| author | Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> | 2009-12-02 06:18:03 +0100 | 
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-12-03 19:42:30 +0000 | 
| commit | 48371cd3f4226275c529bb8675a99572db19cc7c (patch) | |
| tree | c76042ed297179c2c4823d11f2c9d7447049ae1a /arch/arm/mm/cache-l2x0.c | |
| parent | 1f739d7643c4cf78b4f2d9d620c4305aafc7d3b9 (diff) | |
| download | olio-linux-3.10-48371cd3f4226275c529bb8675a99572db19cc7c.tar.xz olio-linux-3.10-48371cd3f4226275c529bb8675a99572db19cc7c.zip  | |
ARM: 5845/1: l2x0: check whether l2x0 already enabled
If running in non-secure mode accessing
some registers of l2x0 will fault. So
check if l2x0 is already enabled, if so
do not access those secure registers.
Signed-off-by: srinidhi kasagar <srinidhi.kasagar@stericsson.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mm/cache-l2x0.c')
| -rw-r--r-- | arch/arm/mm/cache-l2x0.c | 25 | 
1 files changed, 16 insertions, 9 deletions
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index b480f1d3591..747f9a9021b 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c @@ -99,18 +99,25 @@ void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask)  	l2x0_base = base; -	/* disable L2X0 */ -	writel(0, l2x0_base + L2X0_CTRL); +	/* +	 * Check if l2x0 controller is already enabled. +	 * If you are booting from non-secure mode +	 * accessing the below registers will fault. +	 */ +	if (!(readl(l2x0_base + L2X0_CTRL) & 1)) { -	aux = readl(l2x0_base + L2X0_AUX_CTRL); -	aux &= aux_mask; -	aux |= aux_val; -	writel(aux, l2x0_base + L2X0_AUX_CTRL); +		/* l2x0 controller is disabled */ -	l2x0_inv_all(); +		aux = readl(l2x0_base + L2X0_AUX_CTRL); +		aux &= aux_mask; +		aux |= aux_val; +		writel(aux, l2x0_base + L2X0_AUX_CTRL); -	/* enable L2X0 */ -	writel(1, l2x0_base + L2X0_CTRL); +		l2x0_inv_all(); + +		/* enable L2X0 */ +		writel(1, l2x0_base + L2X0_CTRL); +	}  	outer_cache.inv_range = l2x0_inv_range;  	outer_cache.clean_range = l2x0_clean_range;  |