summaryrefslogtreecommitdiffstats
path: root/openwrt/target/linux/linux-2.4/patches/006-bcm47xx_workarounds.patch
blob: 6e52e9c725d2e971c2e65139d8f9ce0af7ef5397 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
diff -urN linux.old/arch/mips/mm/tlbex-mips32.S linux.dev/arch/mips/mm/tlbex-mips32.S
--- linux.old/arch/mips/mm/tlbex-mips32.S	2005-05-28 17:42:03.000000000 +0200
+++ linux.dev/arch/mips/mm/tlbex-mips32.S	2005-05-28 21:48:55.000000000 +0200
@@ -90,6 +90,9 @@
 	.set	noat
 	LEAF(except_vec0_r4000)
 	.set	mips3
+#ifdef CONFIG_BCM4704
+	nop
+#endif
 #ifdef CONFIG_SMP
 	mfc0	k1, CP0_CONTEXT
 	la	k0, pgd_current
diff -urN linux.old/arch/mips/mm/pg-r4k.c linux.dev/arch/mips/mm/pg-r4k.c
--- linux.old/arch/mips/mm/pg-r4k.c	2005-01-19 15:09:29.000000000 +0100
+++ linux.dev/arch/mips/mm/pg-r4k.c	2005-05-28 21:57:52.000000000 +0200
@@ -180,6 +180,7 @@
 
 static inline void build_cdex_s(void)
 {
+#if !defined(CONFIG_BCM4704) && !defined(CONFIG_BCM4710)
 	union mips_instruction mi;
 
 	if ((store_offset & (cpu_scache_line_size() - 1)))
@@ -192,10 +193,12 @@
 	mi.c_format.simmediate = store_offset;
 
 	emit_instruction(mi);
+#endif
 }
 
 static inline void build_cdex_p(void)
 {
+#if !defined(CONFIG_BCM4704) && !defined(CONFIG_BCM4710)
 	union mips_instruction mi;
 
 	if (store_offset & (cpu_dcache_line_size() - 1))
@@ -218,6 +221,7 @@
 	mi.c_format.simmediate = store_offset;
 
 	emit_instruction(mi);
+#endif
 }
 
 static void __build_store_reg(int reg)
diff -urN linux.old/include/asm-mips/stackframe.h linux.dev/include/asm-mips/stackframe.h
--- linux.old/include/asm-mips/stackframe.h	2002-11-29 00:53:15.000000000 +0100
+++ linux.dev/include/asm-mips/stackframe.h	2005-05-28 21:53:03.000000000 +0200
@@ -172,6 +172,46 @@
 		 rfe;					 \
 		.set	pop
 
+#elif defined(CONFIG_BCM4710) || defined(CONFIG_BCM4704)
+
+#define RESTORE_SOME                                     \
+		.set    push;                            \
+		.set    reorder;                         \
+		mfc0    t0, CP0_STATUS;                  \
+		.set    pop;                             \
+		ori     t0, 0x1f;                        \
+		xori    t0, 0x1f;                        \
+		mtc0    t0, CP0_STATUS;                  \
+		li      v1, 0xff00;                      \
+		and     t0, v1;                          \
+		lw      v0, PT_STATUS(sp);               \
+		nor     v1, $0, v1;                      \
+		and     v0, v1;                          \
+		or      v0, t0;                          \
+		ori     v1, v0, ST0_IE;                  \
+		xori    v1, v1, ST0_IE;                  \
+		mtc0    v1, CP0_STATUS;                  \
+		mtc0    v0, CP0_STATUS;                  \
+		lw      v1, PT_EPC(sp);                  \
+		mtc0    v1, CP0_EPC;                     \
+		lw      $31, PT_R31(sp);                 \
+		lw      $28, PT_R28(sp);                 \
+		lw      $25, PT_R25(sp);                 \
+		lw      $7,  PT_R7(sp);                  \
+		lw      $6,  PT_R6(sp);                  \
+		lw      $5,  PT_R5(sp);                  \
+		lw      $4,  PT_R4(sp);                  \
+		lw      $3,  PT_R3(sp);                  \
+		lw      $2,  PT_R2(sp)
+
+#define RESTORE_SP_AND_RET                               \
+		lw      sp,  PT_R29(sp);                 \
+		nop;                                     \
+		nop;                                     \
+		.set    mips3;                           \
+		eret;                                    \
+		.set    mips0
+
 #else
 
 #define RESTORE_SOME                                     \
diff -urN linux.old/arch/mips/mm/tlbex-r4k.S linux.dev/arch/mips/mm/tlbex-r4k.S
--- linux.old/arch/mips/mm/tlbex-r4k.S	2005-05-28 17:42:03.000000000 +0200
+++ linux.dev/arch/mips/mm/tlbex-r4k.S	2005-05-29 15:04:43.000000000 +0200
@@ -168,6 +168,9 @@
 	.set	noat
 	LEAF(except_vec0_r4000)
 	.set	mips3
+#ifdef CONFIG_BCM4704
+	nop
+#endif
 	GET_PGD(k0, k1)				# get pgd pointer
 	mfc0	k0, CP0_BADVADDR		# Get faulting address
 	srl	k0, k0, _PGDIR_SHIFT		# get pgd only bits