Ralf,
Following is a fix for the currently broken TLB cache coherency
attributes setup. Of R4[04]00 processors only the MC versions support
cache coherency. Looking at the current setup I infer SB1 is another CPU
that supports it -- for any other CPU, the patch will have to be updated.
Then it's only relevant for SMP setups.
My R4400SC locks up solid (and I mean it, even NMI doesn't work) when a
write back of a line marked as CACHABLE_COW is to happen. Somebody's
laziness costed me a week of debugging, sigh... :-(
OK to apply?
Maciej
--
+ Maciej W. Rozycki, Technical University of Gdansk, Poland +
+--------------------------------------------------------------+
+ e-mail: macro@ds2.pg.gda.pl, PGP key available +
patch-mips-2.4.19-rc1-20020705-cache-coherency-2
diff -up --recursive --new-file
linux-mips-2.4.19-rc1-20020705.macro/arch/mips/config.in
linux-mips-2.4.19-rc1-20020705/arch/mips/config.in
--- linux-mips-2.4.19-rc1-20020705.macro/arch/mips/config.in 2002-06-27
02:57:13.000000000 +0000
+++ linux-mips-2.4.19-rc1-20020705/arch/mips/config.in 2002-07-05
14:58:52.000000000 +0000
@@ -393,6 +393,19 @@ else
fi
fi
fi
+
+if [ "$CONFIG_CPU_R4X00" = "y" -o "$CONFIG_CPU_SB1" = "y" ]; then
+ define_bool CONFIG_CPU_CACHE_COHERENCY $CONFIG_SMP
+else
+ define_bool CONFIG_CPU_CACHE_COHERENCY n
+fi
+
+if [ "$CONFIG_VTAG_ICACHE" != "y" ]; then
+ define_bool CONFIG_VTAG_ICACHE n
+fi
+if [ "$CONFIG_CPU_HAS_PREFETCH" != "y" ]; then
+ define_bool CONFIG_CPU_HAS_PREFETCH n
+fi
endmenu
mainmenu_option next_comment
diff -up --recursive --new-file
linux-mips-2.4.19-rc1-20020705.macro/arch/mips64/config.in
linux-mips-2.4.19-rc1-20020705/arch/mips64/config.in
--- linux-mips-2.4.19-rc1-20020705.macro/arch/mips64/config.in 2002-06-27
02:57:26.000000000 +0000
+++ linux-mips-2.4.19-rc1-20020705/arch/mips64/config.in 2002-07-05
14:59:16.000000000 +0000
@@ -126,7 +126,6 @@ choice 'CPU type' \
R8000 CONFIG_CPU_R8000 \
R10000 CONFIG_CPU_R10000 \
SB1 CONFIG_CPU_SB1" R4x00
-endmenu
if [ "$CONFIG_CPU_SB1" = "y" ]; then
bool ' Workarounds for pass 1 sb1 bugs' CONFIG_SB1_PASS_1_WORKAROUNDS
@@ -137,6 +136,20 @@ fi
define_bool CONFIG_CPU_HAS_LLSC y
define_bool CONFIG_CPU_HAS_LLDSCD y
+if [ "$CONFIG_CPU_R4X00" = "y" -o "$CONFIG_CPU_SB1" = "y" ]; then
+ define_bool CONFIG_CPU_CACHE_COHERENCY $CONFIG_SMP
+else
+ define_bool CONFIG_CPU_CACHE_COHERENCY n
+fi
+
+if [ "$CONFIG_VTAG_ICACHE" != "y" ]; then
+ define_bool CONFIG_VTAG_ICACHE n
+fi
+if [ "$CONFIG_CPU_HAS_PREFETCH" != "y" ]; then
+ define_bool CONFIG_CPU_HAS_PREFETCH n
+fi
+endmenu
+
mainmenu_option next_comment
comment 'General setup'
diff -up --recursive --new-file
linux-mips-2.4.19-rc1-20020705.macro/include/asm-mips/pgtable-bits.h
linux-mips-2.4.19-rc1-20020705/include/asm-mips/pgtable-bits.h
--- linux-mips-2.4.19-rc1-20020705.macro/include/asm-mips/pgtable-bits.h
2002-04-15 07:50:23.000000000 +0000
+++ linux-mips-2.4.19-rc1-20020705/include/asm-mips/pgtable-bits.h
2002-07-05 14:52:59.000000000 +0000
@@ -74,9 +74,9 @@
#define _CACHE_CACHABLE_WA (1<<9) /* R4600 only */
#define _CACHE_UNCACHED (2<<9) /* R4[0246]00 */
#define _CACHE_CACHABLE_NONCOHERENT (3<<9) /* R4[0246]00 */
-#define _CACHE_CACHABLE_CE (4<<9) /* R4[04]00 only */
-#define _CACHE_CACHABLE_COW (5<<9) /* R4[04]00 only */
-#define _CACHE_CACHABLE_CUW (6<<9) /* R4[04]00 only */
+#define _CACHE_CACHABLE_CE (4<<9) /* R4[04]00MC only */
+#define _CACHE_CACHABLE_COW (5<<9) /* R4[04]00MC only */
+#define _CACHE_CACHABLE_CUW (6<<9) /* R4[04]00MC only */
#define _CACHE_UNCACHED_ACCELERATED (7<<9) /* R10000 only */
#endif
@@ -87,12 +87,20 @@
#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_MODIFIED |
_CACHE_MASK)
-#ifdef CONFIG_MIPS_UNCACHED
+
+#if defined(CONFIG_MIPS_UNCACHED)
+
#define PAGE_CACHABLE_DEFAULT _CACHE_UNCACHED
-#elif CONFIG_CPU_SB1
+
+#elif defined(CONFIG_CPU_CACHE_COHERENCY)
+
#define PAGE_CACHABLE_DEFAULT _CACHE_CACHABLE_COW
+
#else
+
#define PAGE_CACHABLE_DEFAULT _CACHE_CACHABLE_NONCOHERENT
+
#endif
+
#endif /* _ASM_CACHINGMODES_H */
diff -up --recursive --new-file
linux-mips-2.4.19-rc1-20020705.macro/include/asm-mips64/pgtable.h
linux-mips-2.4.19-rc1-20020705/include/asm-mips64/pgtable.h
--- linux-mips-2.4.19-rc1-20020705.macro/include/asm-mips64/pgtable.h
2002-07-03 02:58:29.000000000 +0000
+++ linux-mips-2.4.19-rc1-20020705/include/asm-mips64/pgtable.h 2002-07-05
14:52:59.000000000 +0000
@@ -191,9 +191,9 @@ extern void (*_flush_icache_page)(struct
#define _CACHE_CACHABLE_WA (1<<9) /* R4600 only */
#define _CACHE_UNCACHED (2<<9) /* R4[0246]00 */
#define _CACHE_CACHABLE_NONCOHERENT (3<<9) /* R4[0246]00 */
-#define _CACHE_CACHABLE_CE (4<<9) /* R4[04]00 only */
-#define _CACHE_CACHABLE_COW (5<<9) /* R4[04]00 only */
-#define _CACHE_CACHABLE_CUW (6<<9) /* R4[04]00 only */
+#define _CACHE_CACHABLE_CE (4<<9) /* R4[04]00MC only */
+#define _CACHE_CACHABLE_COW (5<<9) /* R4[04]00MC only */
+#define _CACHE_CACHABLE_CUW (6<<9) /* R4[04]00MC only */
#define _CACHE_UNCACHED_ACCELERATED (7<<9) /* R10000 only */
#define _CACHE_MASK (7<<9)
@@ -202,15 +202,21 @@ extern void (*_flush_icache_page)(struct
#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_MODIFIED |
_CACHE_MASK)
-#ifdef CONFIG_MIPS_UNCACHED
-#define PAGE_CACHABLE_DEFAULT _CACHE_UNCACHED
-#else /* ! UNCACHED */
-#ifdef CONFIG_SGI_IP22
-#define PAGE_CACHABLE_DEFAULT _CACHE_CACHABLE_NONCOHERENT
-#else /* ! IP22 */
-#define PAGE_CACHABLE_DEFAULT _CACHE_CACHABLE_COW
-#endif /* IP22 */
-#endif /* UNCACHED */
+
+#if defined(CONFIG_MIPS_UNCACHED)
+
+#define PAGE_CACHABLE_DEFAULT _CACHE_UNCACHED
+
+#elif defined(CONFIG_CPU_CACHE_COHERENCY)
+
+#define PAGE_CACHABLE_DEFAULT _CACHE_CACHABLE_COW
+
+#else
+
+#define PAGE_CACHABLE_DEFAULT _CACHE_CACHABLE_NONCOHERENT
+
+#endif
+
#define PAGE_NONE __pgprot(_PAGE_PRESENT | PAGE_CACHABLE_DEFAULT)
#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
|