Blame view

arch/arm/mm/proc-sa1100.S 6.83 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
  /*
   *  linux/arch/arm/mm/proc-sa1100.S
   *
   *  Copyright (C) 1997-2002 Russell King
d090dddab   Hyok S. Choi   [ARM] nommu: Init...
5
   *  hacked for non-paged-MM by Hyok S. Choi, 2003.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   *
   *  MMU functions for SA110
   *
   *  These are the low level assembler for performing cache and TLB
   *  functions on the StrongARM-1100 and StrongARM-1110.
   *
   *  Note that SA1100 and SA1110 share everything but their name and CPU ID.
   *
   *  12-jun-2000, Erik Mouw (J.A.K.Mouw@its.tudelft.nl):
   *    Flush the read buffer at context switches
   */
  #include <linux/linkage.h>
  #include <linux/init.h>
  #include <asm/assembler.h>
e6ae744dd   Sam Ravnborg   kbuild: arm - use...
24
  #include <asm/asm-offsets.h>
5ec9407dd   Russell King   [ARM] Don't inclu...
25
  #include <asm/hwcap.h>
a09e64fbc   Russell King   [ARM] Move includ...
26
  #include <mach/hardware.h>
74945c861   Russell King   [ARM] nommu: Move...
27
  #include <asm/pgtable-hwdef.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
  #include <asm/pgtable.h>
bb8d5a55a   Thomas Gleixner   [PATCH] ARM: Fixu...
29
  #include "proc-macros.S"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
32
33
  /*
   * the cache line size of the I and D cache
   */
  #define DCACHELINESIZE	32
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34

b69874e4f   Russell King   ARM: pm: arrange ...
35
  	.section .text
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
37
38
39
40
41
42
43
44
  
  /*
   * cpu_sa1100_proc_init()
   */
  ENTRY(cpu_sa1100_proc_init)
  	mov	r0, #0
  	mcr	p15, 0, r0, c15, c1, 2		@ Enable clock switching
  	mcr	p15, 0, r0, c9, c0, 5		@ Allow read-buffer operations from userland
  	mov	pc, lr
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
47
48
49
50
51
52
  /*
   * cpu_sa1100_proc_fin()
   *
   * Prepare the CPU for reset:
   *  - Disable interrupts
   *  - Clean and turn off caches.
   */
  ENTRY(cpu_sa1100_proc_fin)
95f3df6bc   Russell King   [ARM] Fix SA110/S...
53
  	mcr	p15, 0, ip, c15, c2, 2		@ Disable clock switching
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
57
  	mrc	p15, 0, r0, c1, c0, 0		@ ctrl register
  	bic	r0, r0, #0x1000			@ ...i............
  	bic	r0, r0, #0x000e			@ ............wca.
  	mcr	p15, 0, r0, c1, c0, 0		@ disable caches
9ca03a21e   Russell King   ARM: Factor out c...
58
  	mov	pc, lr
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
61
62
63
64
65
66
67
68
69
  
  /*
   * cpu_sa1100_reset(loc)
   *
   * Perform a soft reset of the system.  Put the CPU into the
   * same state as it would be if it had been reset, and branch
   * to what would be the reset vector.
   *
   * loc: location to jump to for soft reset
   */
  	.align	5
1a4baafa7   Will Deacon   ARM: proc-*.S: pl...
70
  	.pushsection	.idmap.text, "ax"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
72
73
74
  ENTRY(cpu_sa1100_reset)
  	mov	ip, #0
  	mcr	p15, 0, ip, c7, c7, 0		@ invalidate I,D caches
  	mcr	p15, 0, ip, c7, c10, 4		@ drain WB
d090dddab   Hyok S. Choi   [ARM] nommu: Init...
75
  #ifdef CONFIG_MMU
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
  	mcr	p15, 0, ip, c8, c7, 0		@ invalidate I & D TLBs
d090dddab   Hyok S. Choi   [ARM] nommu: Init...
77
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
79
80
81
82
  	mrc	p15, 0, ip, c1, c0, 0		@ ctrl register
  	bic	ip, ip, #0x000f			@ ............wcam
  	bic	ip, ip, #0x1100			@ ...i...s........
  	mcr	p15, 0, ip, c1, c0, 0		@ ctrl register
  	mov	pc, r0
1a4baafa7   Will Deacon   ARM: proc-*.S: pl...
83
84
  ENDPROC(cpu_sa1100_reset)
  	.popsection
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
  
  /*
   * cpu_sa1100_do_idle(type)
   *
   * Cause the processor to idle
   *
   * type: call type:
   *   0 = slow idle
   *   1 = fast idle
   *   2 = switch to slow processor clock
   *   3 = switch to fast processor clock
   */
  	.align	5
  ENTRY(cpu_sa1100_do_idle)
  	mov	r0, r0				@ 4 nop padding
  	mov	r0, r0
  	mov	r0, r0
  	mov	r0, r0				@ 4 nop padding
  	mov	r0, r0
  	mov	r0, r0
  	mov	r0, #0
  	ldr	r1, =UNCACHEABLE_ADDR		@ ptr to uncacheable address
  	@ --- aligned to a cache line
  	mcr	p15, 0, r0, c15, c2, 2		@ disable clock switching
  	ldr	r1, [r1, #0]			@ force switch to MCLK
  	mcr	p15, 0, r0, c15, c8, 2		@ wait for interrupt
  	mov	r0, r0				@ safety
  	mcr	p15, 0, r0, c15, c1, 2		@ enable clock switching
  	mov	pc, lr
  
  /* ================================= CACHE ================================ */
  
  /*
   * cpu_sa1100_dcache_clean_area(addr,sz)
   *
   * Clean the specified entry of any caches such that the MMU
   * translation fetches will obtain correct data.
   *
   * addr: cache-unaligned virtual address
   */
  	.align	5
  ENTRY(cpu_sa1100_dcache_clean_area)
  1:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
  	add	r0, r0, #DCACHELINESIZE
  	subs	r1, r1, #DCACHELINESIZE
  	bhi	1b
  	mov	pc, lr
  
  /* =============================== PageTable ============================== */
  
  /*
   * cpu_sa1100_switch_mm(pgd)
   *
   * Set the translation base pointer to be as described by pgd.
   *
   * pgd: new page tables
   */
  	.align	5
  ENTRY(cpu_sa1100_switch_mm)
d090dddab   Hyok S. Choi   [ARM] nommu: Init...
144
  #ifdef CONFIG_MMU
95f3df6bc   Russell King   [ARM] Fix SA110/S...
145
146
  	str	lr, [sp, #-4]!
  	bl	v4wb_flush_kern_cache_all	@ clears IP
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147
  	mcr	p15, 0, ip, c9, c0, 0		@ invalidate RB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148
149
  	mcr	p15, 0, r0, c2, c0, 0		@ load page table pointer
  	mcr	p15, 0, ip, c8, c7, 0		@ invalidate I & D TLBs
95f3df6bc   Russell King   [ARM] Fix SA110/S...
150
  	ldr	pc, [sp], #4
d090dddab   Hyok S. Choi   [ARM] nommu: Init...
151
152
153
  #else
  	mov	pc, lr
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154
155
  
  /*
ad1ae2fe7   Russell King   [ARM] Unuse anoth...
156
   * cpu_sa1100_set_pte_ext(ptep, pte, ext)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
158
159
160
   *
   * Set a PTE and flush it out
   */
  	.align	5
ad1ae2fe7   Russell King   [ARM] Unuse anoth...
161
  ENTRY(cpu_sa1100_set_pte_ext)
d090dddab   Hyok S. Choi   [ARM] nommu: Init...
162
  #ifdef CONFIG_MMU
da0916539   Russell King   [ARM] Convert set...
163
  	armv3_set_pte_ext wc_disable=0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
165
166
  	mov	r0, r0
  	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
  	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
d090dddab   Hyok S. Choi   [ARM] nommu: Init...
167
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
168
  	mov	pc, lr
f6b0fa02e   Russell King   ARM: pm: add gene...
169
  .globl	cpu_sa1100_suspend_size
de8e71ca4   Russell King   ARM: pm: only use...
170
  .equ	cpu_sa1100_suspend_size, 4 * 3
29ea23ff9   Russell King   ARM: Make consoli...
171
  #ifdef CONFIG_PM_SLEEP
f6b0fa02e   Russell King   ARM: pm: add gene...
172
  ENTRY(cpu_sa1100_do_suspend)
de8e71ca4   Russell King   ARM: pm: only use...
173
  	stmfd	sp!, {r4 - r6, lr}
f6b0fa02e   Russell King   ARM: pm: add gene...
174
  	mrc	p15, 0, r4, c3, c0, 0		@ domain ID
de8e71ca4   Russell King   ARM: pm: only use...
175
176
177
178
  	mrc	p15, 0, r5, c13, c0, 0		@ PID
  	mrc	p15, 0, r6, c1, c0, 0		@ control reg
  	stmia	r0, {r4 - r6}			@ store cp regs
  	ldmfd	sp!, {r4 - r6, pc}
f6b0fa02e   Russell King   ARM: pm: add gene...
179
180
181
  ENDPROC(cpu_sa1100_do_suspend)
  
  ENTRY(cpu_sa1100_do_resume)
de8e71ca4   Russell King   ARM: pm: only use...
182
  	ldmia	r0, {r4 - r6}			@ load cp regs
6f354e5f4   Russell King   ARM: pm: CPU spec...
183
184
185
186
187
  	mov	ip, #0
  	mcr	p15, 0, ip, c8, c7, 0		@ flush I+D TLBs
  	mcr	p15, 0, ip, c7, c7, 0		@ flush I&D cache
  	mcr	p15, 0, ip, c9, c0, 0		@ invalidate RB
  	mcr	p15, 0, ip, c9, c0, 5		@ allow user space to use RB
f6b0fa02e   Russell King   ARM: pm: add gene...
188
189
  
  	mcr	p15, 0, r4, c3, c0, 0		@ domain ID
de8e71ca4   Russell King   ARM: pm: only use...
190
191
192
  	mcr	p15, 0, r1, c2, c0, 0		@ translation table base addr
  	mcr	p15, 0, r5, c13, c0, 0		@ PID
  	mov	r0, r6				@ control register
f6b0fa02e   Russell King   ARM: pm: add gene...
193
194
  	b	cpu_resume_mmu
  ENDPROC(cpu_sa1100_do_resume)
f6b0fa02e   Russell King   ARM: pm: add gene...
195
  #endif
5085f3ff4   Russell King   ARM: hotplug cpu:...
196
  	__CPUINIT
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
197
198
199
200
201
202
  
  	.type	__sa1100_setup, #function
  __sa1100_setup:
  	mov	r0, #0
  	mcr	p15, 0, r0, c7, c7		@ invalidate I,D caches on v4
  	mcr	p15, 0, r0, c7, c10, 4		@ drain write buffer on v4
d090dddab   Hyok S. Choi   [ARM] nommu: Init...
203
  #ifdef CONFIG_MMU
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
204
  	mcr	p15, 0, r0, c8, c7		@ invalidate I,D TLBs on v4
d090dddab   Hyok S. Choi   [ARM] nommu: Init...
205
  #endif
22b190861   Russell King   [ARM] nommu: prov...
206
207
  	adr	r5, sa1100_crval
  	ldmia	r5, {r5, r6}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
  	mrc	p15, 0, r0, c1, c0		@ get control register v4
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209
  	bic	r0, r0, r5
22b190861   Russell King   [ARM] nommu: prov...
210
  	orr	r0, r0, r6
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
211
212
213
214
215
216
217
218
219
  	mov	pc, lr
  	.size	__sa1100_setup, . - __sa1100_setup
  
  	/*
  	 *  R
  	 * .RVI ZFRS BLDP WCAM
  	 * ..11 0001 ..11 1101
  	 * 
  	 */
22b190861   Russell King   [ARM] nommu: prov...
220
221
222
  	.type	sa1100_crval, #object
  sa1100_crval:
  	crval	clear=0x00003f3f, mmuset=0x0000313d, ucset=0x00001130
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223
224
225
226
  
  	__INITDATA
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
227
228
   * SA1100 and SA1110 share the same function calls
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
229

f58d59f6c   Dave Martin   ARM: mm: proc-sa1...
230
231
  	@ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
  	define_processor_functions sa1100, dabort=v4_early_abort, pabort=legacy_pabort, suspend=1
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
232

f58d59f6c   Dave Martin   ARM: mm: proc-sa1...
233
  	.section ".rodata"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
234

f58d59f6c   Dave Martin   ARM: mm: proc-sa1...
235
236
237
238
  	string	cpu_arch_name, "armv4"
  	string	cpu_elf_name, "v4"
  	string	cpu_sa1100_name, "StrongARM-1100"
  	string	cpu_sa1110_name, "StrongARM-1110"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
239
240
  
  	.align
02b7dd124   Ben Dooks   [ARM] 2926/1: .pr...
241
  	.section ".proc.info.init", #alloc, #execinstr
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242

f58d59f6c   Dave Martin   ARM: mm: proc-sa1...
243
244
245
246
247
248
249
  .macro sa1100_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req
  	.type	__
  ame\()_proc_info,#object
  __
  ame\()_proc_info:
  	.long	\cpu_val
  	.long	\cpu_mask
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250
251
252
253
254
  	.long   PMD_TYPE_SECT | \
  		PMD_SECT_BUFFERABLE | \
  		PMD_SECT_CACHEABLE | \
  		PMD_SECT_AP_WRITE | \
  		PMD_SECT_AP_READ
8799ee9f4   Russell King   [ARM] Set bit 4 o...
255
256
257
  	.long   PMD_TYPE_SECT | \
  		PMD_SECT_AP_WRITE | \
  		PMD_SECT_AP_READ
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
258
259
260
261
  	b	__sa1100_setup
  	.long	cpu_arch_name
  	.long	cpu_elf_name
  	.long	HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT | HWCAP_FAST_MULT
f58d59f6c   Dave Martin   ARM: mm: proc-sa1...
262
  	.long	\cpu_name
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
263
264
265
266
  	.long	sa1100_processor_functions
  	.long	v4wb_tlb_fns
  	.long	v4_mc_user_fns
  	.long	v4wb_cache_fns
f58d59f6c   Dave Martin   ARM: mm: proc-sa1...
267
268
269
270
  	.size	__
  ame\()_proc_info, . - __
  ame\()_proc_info
  .endm
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
271

f58d59f6c   Dave Martin   ARM: mm: proc-sa1...
272
273
  	sa1100_proc_info sa1100, 0x4401a110, 0xfffffff0, cpu_sa1100_name
  	sa1100_proc_info sa1110, 0x6901b110, 0xfffffff0, cpu_sa1110_name