Skip to contentSkip to conversation

arm, arm-kirkwood: disable l2c before linux boot

PATCH New Michael Walle 4 participants 14 messages Dec 18, 2011 – Jan 31, 2012 Arm (32-bit)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 arm, arm-kirkwood: disable l2c before linux boot

The decompressor expects the L2 cache to be disabled. This fixes booting some kernels, which have CONFIG_ARM_PATCH_PHYS_VIRT enabled.

Cc Albert ARIBAUD <[email protected]>
Cc Prafulla Wadaskar <[email protected]>
---
 arch/arm/cpu/arm926ejs/cache.c           |   15 +++++++++++
 arch/arm/cpu/arm926ejs/cpu.c             |    2 +
 arch/arm/cpu/arm926ejs/kirkwood/Makefile |    1 +
 arch/arm/cpu/arm926ejs/kirkwood/cache.c  |   41 ++++++++++++++++++++++++++++++
 4 files changed, 59 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/cpu/arm926ejs/kirkwood/cache.c
arch/arm/cpu/arm926ejs/cache.c +15 -0
index 4415642..7a7d0a6 100644
@@ -73,3 +73,18 @@ void  flush_cache(unsigned long start, unsigned long size)
 {
 }
 #endif /* #ifndef CONFIG_SYS_DCACHE_OFF */
+
+/*
+ * Stub implementations for l2 cache operations
+ */
+void __l2_cache_enable(void)
+{
+}
+void l2_cache_enable(void)
+        __attribute__((weak, alias("__l2_cache_enable")));
+
+void __l2_cache_disable(void)
+{
+}
+void l2_cache_disable(void)
+        __attribute__((weak, alias("__l2_cache_disable")));
arch/arm/cpu/arm926ejs/cpu.c +2 -0
index 5c902df..626384c 100644
@@ -50,6 +50,8 @@ int cleanup_before_linux (void)
 	/* turn off I/D-cache */
 	icache_disable();
 	dcache_disable();
+	l2_cache_disable();
+
 	/* flush I/D-cache */
 	cache_flush();
 
arch/arm/cpu/arm926ejs/kirkwood/Makefile +1 -0
index 0754297..777006c 100644
@@ -30,6 +30,7 @@ COBJS-y	= cpu.o
 COBJS-y	+= dram.o
 COBJS-y	+= mpp.o
 COBJS-y	+= timer.o
+COBJS-y	+= cache.o
 
 SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
 OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS-y))
arch/arm/cpu/arm926ejs/kirkwood/cache.c new file +41 -0

41 lines not on this page · raw message

Signature · 1 line
1.7.2.5
#1 lore raw

PATCH 1/1 arm, arm-kirkwood: disable l2c before linux boot

Am Sonntag 18 Dezember 2011, 23:09:51 schrieb Michael Walle:

Quoted 2 lines

The decompressor expects the L2 cache to be disabled. This fixes booting some kernels, which have CONFIG_ARM_PATCH_PHYS_VIRT enabled.

You should consider applying this patch to the RC, too. CONFIG_ARM_PATCH_PHYS_VIRT is enabled by default since 3.2-rc1.

Signature · 1 line
michael
#2 lore raw

PATCH 1/1 arm, arm-kirkwood: disable l2c before linux boot

In reply to Michael Walle
Quoted 100 lines

The decompressor expects the L2 cache to be disabled. This fixes booting some kernels, which have CONFIG_ARM_PATCH_PHYS_VIRT enabled.

Cc Albert ARIBAUD <[email protected]>
Cc Prafulla Wadaskar <[email protected]>
---
 arch/arm/cpu/arm926ejs/cache.c           |   15 +++++++++++
 arch/arm/cpu/arm926ejs/cpu.c             |    2 +
 arch/arm/cpu/arm926ejs/kirkwood/Makefile |    1 +
 arch/arm/cpu/arm926ejs/kirkwood/cache.c  |   41
++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 0
deletions(-)
 create mode 100644 arch/arm/cpu/arm926ejs/kirkwood/cache.c
(quoted diff) +0 -0

b/arch/arm/cpu/arm926ejs/cache.c index 4415642..7a7d0a6 100644

arch/arm/cpu/arm926ejs/cache.c +15 -0
@@ -73,3 +73,18 @@ void  flush_cache(unsigned long start, unsigned long
 size) {
 }
 #endif /* #ifndef CONFIG_SYS_DCACHE_OFF */
+
+/*
+ * Stub implementations for l2 cache operations
+ */
+void __l2_cache_enable(void)
+{
+}
+void l2_cache_enable(void)
+        __attribute__((weak, alias("__l2_cache_enable")));
+
+void __l2_cache_disable(void)
+{
+}
+void l2_cache_disable(void)
+        __attribute__((weak, alias("__l2_cache_disable")));
arch/arm/cpu/arm926ejs/cpu.c +2 -0
index 5c902df..626384c 100644
@@ -50,6 +50,8 @@ int cleanup_before_linux (void)
 	/* turn off I/D-cache */
 	icache_disable();
 	dcache_disable();
+	l2_cache_disable();
+
 	/* flush I/D-cache */
 	cache_flush();
 
(quoted diff) +0 -0

b/arch/arm/cpu/arm926ejs/kirkwood/Makefile index 0754297..777006c 100644

arch/arm/cpu/arm926ejs/kirkwood/Makefile +1 -0
@@ -30,6 +30,7 @@ COBJS-y	= cpu.o
 COBJS-y	+= dram.o
 COBJS-y	+= mpp.o
 COBJS-y	+= timer.o
+COBJS-y	+= cache.o
 
 SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
 OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS-y))
(quoted diff) +0 -0

b/arch/arm/cpu/arm926ejs/kirkwood/cache.c new file mode 100644 index 0000000..84207f7

arch/arm/cpu/arm926ejs/kirkwood/cache.c new file +31 -0
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2011 Michael Walle
+ * Michael Walle <[email protected]>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc.
+ */
+#include <common.h>
+#include <asm/arch/cpu.h>
+
+void l2_cache_enable()
+{
+	u32 ctrl;
+
+	ctrl = readfr_extra_feature_reg();
+	ctrl |= 1 << 22;	/* enable l2 cache */
+	writefr_extra_feature_reg(ctrl);

arch/arm/cpu/arm926ejs/kirkwood/cache.c line 41

Quoted 10 lines
arch/arm/cpu/arm926ejs/kirkwood/cache.c new file +10 -0
+}
+
+void l2_cache_disable()
+{
+	u32 ctrl;
+
+	ctrl = readfr_extra_feature_reg();
+	ctrl &= ~(1 << 22);	/* disable l2 cache */
+	writefr_extra_feature_reg(ctrl);
+}

Please use #define <name> to define the magic value above (1 << 22) and then use it.

M

#3 lore raw

PATCH 1/1 arm, arm-kirkwood: disable l2c before linux boot

Am Montag 19 Dezember 2011, 00:04:18 schrieb Marek Vasut:
[..snip..]

Quoted 4 lines

Please use #define <name> to define the magic value above (1 << 22) and then use it.

M

The bit was taken from arch/arm/cpu/arm926ejs/kirkwood/cpu.c. Unfortunately there is no documentation publicly available, so i can only guess names.

FEROCEON_EXTRA_FEATURE_L2C_EN ?

Even the linux kernel has no proper macro names :(

Signature · 1 line
Michael
#4 lore raw

PATCH 1/1 arm, arm-kirkwood: disable l2c before linux boot

Hi Michael,

Le 19/12/2011 00:21, Michael Walle a ?crit :

Quoted 11 lines

Am Montag 19 Dezember 2011, 00:04:18 schrieb Marek Vasut:
[..snip..]

Quoted 4 lines

Please use #define<name> to define the magic value above (1<< 22) and then use it.

M

The bit was taken from arch/arm/cpu/arm926ejs/kirkwood/cpu.c. Unfortunately there is no documentation publicly available, so i can only guess names.

FEROCEON_EXTRA_FEATURE_L2C_EN ?

Works for me.

Quoted 1 line

Even the linux kernel has no proper macro names :(

Time we told them to have one, then. :)

I assume the patch was tested against a 3.2-rc1 kernel and also a pre-3.2-rc1 kernel to avoid regression?

Amicalement,

Signature · 1 line
Albert.
#5 lore raw

PATCH 1/1 arm, arm-kirkwood: disable l2c before linux boot

Am Dienstag 20 Dezember 2011, 08:04:23 schrieb Albert ARIBAUD:

Quoted 2 lines

I assume the patch was tested against a 3.2-rc1 kernel and also a pre-3.2-rc1 kernel to avoid regression?

Tested with 3.0, 3.1 and 3.2-rc both with CONFIG_ARM_PATCH_PHYS_VIRT enabled and disabled.

Signature · 1 line
Michael
#6 lore raw

PATCH 1/1 arm, arm-kirkwood: disable l2c before linux boot

In reply to Marek Vasut

The decompressor expects the L2 cache to be disabled. This fixes booting some kernels, which have CONFIG_ARM_PATCH_PHYS_VIRT enabled.

Cc Albert ARIBAUD <[email protected]>
Cc Prafulla Wadaskar <[email protected]>
---
 arch/arm/cpu/arm926ejs/cache.c           |   15 ++++++++++
 arch/arm/cpu/arm926ejs/cpu.c             |    2 +
 arch/arm/cpu/arm926ejs/kirkwood/Makefile |    1 +
 arch/arm/cpu/arm926ejs/kirkwood/cache.c  |   43 ++++++++++++++++++++++++++++++
 4 files changed, 61 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/cpu/arm926ejs/kirkwood/cache.c
arch/arm/cpu/arm926ejs/cache.c +15 -0
index 4415642..7a7d0a6 100644
@@ -73,3 +73,18 @@ void  flush_cache(unsigned long start, unsigned long size)
 {
 }
 #endif /* #ifndef CONFIG_SYS_DCACHE_OFF */
+
+/*
+ * Stub implementations for l2 cache operations
+ */
+void __l2_cache_enable(void)
+{
+}
+void l2_cache_enable(void)
+        __attribute__((weak, alias("__l2_cache_enable")));
+
+void __l2_cache_disable(void)
+{
+}
+void l2_cache_disable(void)
+        __attribute__((weak, alias("__l2_cache_disable")));
arch/arm/cpu/arm926ejs/cpu.c +2 -0
index 5c902df..626384c 100644
@@ -50,6 +50,8 @@ int cleanup_before_linux (void)
 	/* turn off I/D-cache */
 	icache_disable();
 	dcache_disable();
+	l2_cache_disable();
+
 	/* flush I/D-cache */
 	cache_flush();
 
arch/arm/cpu/arm926ejs/kirkwood/Makefile +1 -0
index 0754297..777006c 100644
@@ -30,6 +30,7 @@ COBJS-y	= cpu.o
 COBJS-y	+= dram.o
 COBJS-y	+= mpp.o
 COBJS-y	+= timer.o
+COBJS-y	+= cache.o
 
 SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
 OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS-y))
arch/arm/cpu/arm926ejs/kirkwood/cache.c new file +43 -0

43 lines not on this page · raw message

Signature · 1 line
1.7.2.5
#7 lore raw

PATCH 1/1 arm, arm-kirkwood: disable l2c before linux boot

Quoted 102 lines

The decompressor expects the L2 cache to be disabled. This fixes booting some kernels, which have CONFIG_ARM_PATCH_PHYS_VIRT enabled.

Cc Albert ARIBAUD <[email protected]>
Cc Prafulla Wadaskar <[email protected]>
---
 arch/arm/cpu/arm926ejs/cache.c           |   15 ++++++++++
 arch/arm/cpu/arm926ejs/cpu.c             |    2 +
 arch/arm/cpu/arm926ejs/kirkwood/Makefile |    1 +
 arch/arm/cpu/arm926ejs/kirkwood/cache.c  |   43
++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 0
deletions(-)
 create mode 100644 arch/arm/cpu/arm926ejs/kirkwood/cache.c
(quoted diff) +0 -0

b/arch/arm/cpu/arm926ejs/cache.c index 4415642..7a7d0a6 100644

arch/arm/cpu/arm926ejs/cache.c +15 -0
@@ -73,3 +73,18 @@ void  flush_cache(unsigned long start, unsigned long
 size) {
 }
 #endif /* #ifndef CONFIG_SYS_DCACHE_OFF */
+
+/*
+ * Stub implementations for l2 cache operations
+ */
+void __l2_cache_enable(void)
+{
+}
+void l2_cache_enable(void)
+        __attribute__((weak, alias("__l2_cache_enable")));
+
+void __l2_cache_disable(void)
+{
+}
+void l2_cache_disable(void)
+        __attribute__((weak, alias("__l2_cache_disable")));
arch/arm/cpu/arm926ejs/cpu.c +2 -0
index 5c902df..626384c 100644
@@ -50,6 +50,8 @@ int cleanup_before_linux (void)
 	/* turn off I/D-cache */
 	icache_disable();
 	dcache_disable();
+	l2_cache_disable();
+
 	/* flush I/D-cache */
 	cache_flush();
 
(quoted diff) +0 -0

b/arch/arm/cpu/arm926ejs/kirkwood/Makefile index 0754297..777006c 100644

arch/arm/cpu/arm926ejs/kirkwood/Makefile +1 -0
@@ -30,6 +30,7 @@ COBJS-y	= cpu.o
 COBJS-y	+= dram.o
 COBJS-y	+= mpp.o
 COBJS-y	+= timer.o
+COBJS-y	+= cache.o
 
 SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
 OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS-y))
(quoted diff) +0 -0

b/arch/arm/cpu/arm926ejs/kirkwood/cache.c new file mode 100644 index 0000000..df90cb9

arch/arm/cpu/arm926ejs/kirkwood/cache.c new file +33 -0
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2011 Michael Walle
+ * Michael Walle <[email protected]>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc.
+ */
+#include <common.h>
+#include <asm/arch/cpu.h>
+
+#define FEROCEON_EXTRA_FEATURE_L2C_EN (1<<22)
+
+void l2_cache_enable()
+{
+	u32 ctrl;
+
+	ctrl = readfr_extra_feature_reg();
+	ctrl |= FEROCEON_EXTRA_FEATURE_L2C_EN;
+	writefr_extra_feature_reg(ctrl);

arch/arm/cpu/arm926ejs/kirkwood/cache.c line 43

Quoted 10 lines
arch/arm/cpu/arm926ejs/kirkwood/cache.c new file +10 -0
+}
+
+void l2_cache_disable()
+{
+	u32 ctrl;
+
+	ctrl = readfr_extra_feature_reg();
+	ctrl &= ~FEROCEON_EXTRA_FEATURE_L2C_EN;
+	writefr_extra_feature_reg(ctrl);
+}

Fine by me ...

#8 lore raw

PATCH 1/1 arm, arm-kirkwood: disable l2c before linux boot

In reply to Michael Walle

Am Mittwoch 21 Dezember 2011, 00:35:46 schrieb Michael Walle:

Quoted 2 lines

The decompressor expects the L2 cache to be disabled. This fixes booting some kernels, which have CONFIG_ARM_PATCH_PHYS_VIRT enabled.

Ping :)

Signature · 1 line
Michael
#9 lore raw

PATCH 1/1 arm, arm-kirkwood: disable l2c before linux boot

Hi Michael,

Le 02/01/2012 19:37, Michael Walle a ?crit :

Quoted 5 lines

Am Mittwoch 21 Dezember 2011, 00:35:46 schrieb Michael Walle:

Quoted 2 lines

The decompressor expects the L2 cache to be disabled. This fixes booting some kernels, which have CONFIG_ARM_PATCH_PHYS_VIRT enabled.

Ping :)

Sorry, start of year was hectic.

That's V2 of the patch, correct? But it has no V2 tag, nor history.

Also, I'm missing something: you introduce two functions, for enabling and disabling the cache, yet the code uses only the one for disabling. So what enabled it in the first place?

Regards,
Albert.

#10 lore raw

PATCH v2 1/1 arm, arm-kirkwood: disable l2c before linux boot

In reply to Marek Vasut

The decompressor expects the L2 cache to be disabled. This fixes booting some kernels, which have CONFIG_ARM_PATCH_PHYS_VIRT enabled.

Cc Albert ARIBAUD <[email protected]>
Cc Prafulla Wadaskar <[email protected]>

---
This is a repost, because the former had no version tag nor a history.

v2:
- replace magic number with macro

 arch/arm/cpu/arm926ejs/cache.c           |   15 ++++++++++
 arch/arm/cpu/arm926ejs/cpu.c             |    2 +
 arch/arm/cpu/arm926ejs/kirkwood/Makefile |    1 +
 arch/arm/cpu/arm926ejs/kirkwood/cache.c  |   43 ++++++++++++++++++++++++++++++
 4 files changed, 61 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/cpu/arm926ejs/kirkwood/cache.c
arch/arm/cpu/arm926ejs/cache.c +15 -0
index ee90ab7..ba13154 100644
@@ -68,3 +68,18 @@ void  flush_cache(unsigned long start, unsigned long size)
 {
 }
 #endif /* #ifndef CONFIG_SYS_DCACHE_OFF */
+
+/*
+ * Stub implementations for l2 cache operations
+ */
+void __l2_cache_enable(void)
+{
+}
+void l2_cache_enable(void)
+        __attribute__((weak, alias("__l2_cache_enable")));
+
+void __l2_cache_disable(void)
+{
+}
+void l2_cache_disable(void)
+        __attribute__((weak, alias("__l2_cache_disable")));
arch/arm/cpu/arm926ejs/cpu.c +2 -0
index 5c902df..626384c 100644
@@ -50,6 +50,8 @@ int cleanup_before_linux (void)
 	/* turn off I/D-cache */
 	icache_disable();
 	dcache_disable();
+	l2_cache_disable();
+
 	/* flush I/D-cache */
 	cache_flush();
 
arch/arm/cpu/arm926ejs/kirkwood/Makefile +1 -0
index 0754297..777006c 100644
@@ -30,6 +30,7 @@ COBJS-y	= cpu.o
 COBJS-y	+= dram.o
 COBJS-y	+= mpp.o
 COBJS-y	+= timer.o
+COBJS-y	+= cache.o
 
 SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
 OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS-y))
arch/arm/cpu/arm926ejs/kirkwood/cache.c new file +43 -0

43 lines not on this page · raw message

Signature · 1 line
1.7.2.5
#11 lore raw

PATCH v2 1/1 arm, arm-kirkwood: disable l2c before linux boot

[Sorry can't answer to the original message, because it was blocked by spam filter]

Quoted 3 lines

Also, I'm missing something: you introduce two functions, for enabling and disabling the cache, yet the code uses only the one for disabling. So what enabled it in the first place?

The L2C is enabled in arch_misc_init() in
arch/arm/cpu/arm926ejs/kirkwood/cpu.c

My enable function is just for completeness atm.

Signature · 1 line
Michael
#12 lore raw

PATCH v2 1/1 arm, arm-kirkwood: disable l2c before linux boot

Am Freitag 13 Januar 2012, 23:59:08 schrieb Michael Walle:

Quoted 11 lines

[Sorry can't answer to the original message, because it was blocked by spam filter]

Quoted 3 lines

Also, I'm missing something: you introduce two functions, for enabling and disabling the cache, yet the code uses only the one for disabling. So what enabled it in the first place?

The L2C is enabled in arch_misc_init() in
arch/arm/cpu/arm926ejs/kirkwood/cpu.c

My enable function is just for completeness atm.

Ping.

Is there something still uncertain?

Signature · 1 line
Michael
#13 lore raw

PATCH v2 1/1 arm, arm-kirkwood: disable l2c before linux boot

Dear Michael Walle,

Quoted 6 lines · In message <[email protected]> you wrote:
Quoted 2 lines

My enable function is just for completeness atm.

Ping.

Is there something still uncertain?

Nothing is uncertain.

But we do not add dead code.

Best regards,

Wolfgang Denk

Signature · 4 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Pray to God, but keep rowing to shore. - Russian Proverb