diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-07 16:32:21 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-07 16:32:21 -0500 |
commit | 89de09a9ba9ce293228b1f1aa3c68b5af33a70ce (patch) | |
tree | a322cc361f13dade2aa84ace8c9278d86e459640 /arch/arm/mm/proc-v6.S | |
parent | dad2ad82c5f058367df79de022bd12d36afcd065 (diff) | |
parent | f6db449ca312d33045907337b68de1f647cf0730 (diff) |
Merge master.kernel.org:/home/rmk/linux-2.6-arm
Diffstat (limited to 'arch/arm/mm/proc-v6.S')
-rw-r--r-- | arch/arm/mm/proc-v6.S | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index 9bb5fff406fb..92f3ca31b7b9 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/linkage.h> | 12 | #include <linux/linkage.h> |
13 | #include <asm/assembler.h> | 13 | #include <asm/assembler.h> |
14 | #include <asm/asm-offsets.h> | 14 | #include <asm/asm-offsets.h> |
15 | #include <asm/hardware/arm_scu.h> | ||
15 | #include <asm/procinfo.h> | 16 | #include <asm/procinfo.h> |
16 | #include <asm/pgtable.h> | 17 | #include <asm/pgtable.h> |
17 | 18 | ||
@@ -112,6 +113,9 @@ ENTRY(cpu_v6_dcache_clean_area) | |||
112 | ENTRY(cpu_v6_switch_mm) | 113 | ENTRY(cpu_v6_switch_mm) |
113 | mov r2, #0 | 114 | mov r2, #0 |
114 | ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id | 115 | ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id |
116 | #ifdef CONFIG_SMP | ||
117 | orr r0, r0, #2 @ set shared pgtable | ||
118 | #endif | ||
115 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB | 119 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB |
116 | mcr p15, 0, r2, c7, c10, 4 @ drain write buffer | 120 | mcr p15, 0, r2, c7, c10, 4 @ drain write buffer |
117 | mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 | 121 | mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 |
@@ -140,7 +144,7 @@ ENTRY(cpu_v6_switch_mm) | |||
140 | ENTRY(cpu_v6_set_pte) | 144 | ENTRY(cpu_v6_set_pte) |
141 | str r1, [r0], #-2048 @ linux version | 145 | str r1, [r0], #-2048 @ linux version |
142 | 146 | ||
143 | bic r2, r1, #0x000007f0 | 147 | bic r2, r1, #0x000003f0 |
144 | bic r2, r2, #0x00000003 | 148 | bic r2, r2, #0x00000003 |
145 | orr r2, r2, #PTE_EXT_AP0 | 2 | 149 | orr r2, r2, #PTE_EXT_AP0 | 2 |
146 | 150 | ||
@@ -191,6 +195,23 @@ cpu_v6_name: | |||
191 | * - cache type register is implemented | 195 | * - cache type register is implemented |
192 | */ | 196 | */ |
193 | __v6_setup: | 197 | __v6_setup: |
198 | #ifdef CONFIG_SMP | ||
199 | /* Set up the SCU on core 0 only */ | ||
200 | mrc p15, 0, r0, c0, c0, 5 @ CPU core number | ||
201 | ands r0, r0, #15 | ||
202 | moveq r0, #0x10000000 @ SCU_BASE | ||
203 | orreq r0, r0, #0x00100000 | ||
204 | ldreq r5, [r0, #SCU_CTRL] | ||
205 | orreq r5, r5, #1 | ||
206 | streq r5, [r0, #SCU_CTRL] | ||
207 | |||
208 | #ifndef CONFIG_CPU_DCACHE_DISABLE | ||
209 | mrc p15, 0, r0, c1, c0, 1 @ Enable SMP/nAMP mode | ||
210 | orr r0, r0, #0x20 | ||
211 | mcr p15, 0, r0, c1, c0, 1 | ||
212 | #endif | ||
213 | #endif | ||
214 | |||
194 | mov r0, #0 | 215 | mov r0, #0 |
195 | mcr p15, 0, r0, c7, c14, 0 @ clean+invalidate D cache | 216 | mcr p15, 0, r0, c7, c14, 0 @ clean+invalidate D cache |
196 | mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache | 217 | mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache |
@@ -198,6 +219,9 @@ __v6_setup: | |||
198 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer | 219 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer |
199 | mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs | 220 | mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs |
200 | mcr p15, 0, r0, c2, c0, 2 @ TTB control register | 221 | mcr p15, 0, r0, c2, c0, 2 @ TTB control register |
222 | #ifdef CONFIG_SMP | ||
223 | orr r4, r4, #2 @ set shared pgtable | ||
224 | #endif | ||
201 | mcr p15, 0, r4, c2, c0, 1 @ load TTB1 | 225 | mcr p15, 0, r4, c2, c0, 1 @ load TTB1 |
202 | #ifdef CONFIG_VFP | 226 | #ifdef CONFIG_VFP |
203 | mrc p15, 0, r0, c1, c0, 2 | 227 | mrc p15, 0, r0, c1, c0, 2 |