xref: /openbmc/linux/arch/arm/mm/proc-feroceon.S (revision a9c9147e)
1/*
2 *  linux/arch/arm/mm/proc-feroceon.S: MMU functions for Feroceon
3 *
4 *  Heavily based on proc-arm926.S
5 *  Maintainer: Assaf Hoffman <hoffman@marvell.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 */
21
22#include <linux/linkage.h>
23#include <linux/init.h>
24#include <asm/assembler.h>
25#include <asm/hwcap.h>
26#include <asm/pgtable-hwdef.h>
27#include <asm/pgtable.h>
28#include <asm/page.h>
29#include <asm/ptrace.h>
30#include "proc-macros.S"
31
32/*
33 * This is the maximum size of an area which will be invalidated
34 * using the single invalidate entry instructions.  Anything larger
35 * than this, and we go for the whole cache.
36 *
37 * This value should be chosen such that we choose the cheapest
38 * alternative.
39 */
40#define CACHE_DLIMIT	16384
41
42/*
43 * the cache line size of the I and D cache
44 */
45#define CACHE_DLINESIZE	32
46
47	.bss
48	.align 3
49__cache_params_loc:
50	.space	8
51
52	.text
53__cache_params:
54	.word	__cache_params_loc
55
56/*
57 * cpu_feroceon_proc_init()
58 */
59ENTRY(cpu_feroceon_proc_init)
60	mrc	p15, 0, r0, c0, c0, 1		@ read cache type register
61	ldr	r1, __cache_params
62	mov	r2, #(16 << 5)
63	tst	r0, #(1 << 16)			@ get way
64	mov	r0, r0, lsr #18			@ get cache size order
65	movne	r3, #((4 - 1) << 30)		@ 4-way
66	and	r0, r0, #0xf
67	moveq	r3, #0				@ 1-way
68	mov	r2, r2, lsl r0			@ actual cache size
69	movne	r2, r2, lsr #2			@ turned into # of sets
70	sub	r2, r2, #(1 << 5)
71	stmia	r1, {r2, r3}
72	mov	pc, lr
73
74/*
75 * cpu_feroceon_proc_fin()
76 */
77ENTRY(cpu_feroceon_proc_fin)
78	stmfd	sp!, {lr}
79	mov	ip, #PSR_F_BIT | PSR_I_BIT | SVC_MODE
80	msr	cpsr_c, ip
81	bl	feroceon_flush_kern_cache_all
82
83#if defined(CONFIG_CACHE_FEROCEON_L2) && \
84	!defined(CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH)
85	mov	r0, #0
86	mcr	p15, 1, r0, c15, c9, 0		@ clean L2
87	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
88#endif
89
90	mrc	p15, 0, r0, c1, c0, 0		@ ctrl register
91	bic	r0, r0, #0x1000			@ ...i............
92	bic	r0, r0, #0x000e			@ ............wca.
93	mcr	p15, 0, r0, c1, c0, 0		@ disable caches
94	ldmfd	sp!, {pc}
95
96/*
97 * cpu_feroceon_reset(loc)
98 *
99 * Perform a soft reset of the system.  Put the CPU into the
100 * same state as it would be if it had been reset, and branch
101 * to what would be the reset vector.
102 *
103 * loc: location to jump to for soft reset
104 */
105	.align	5
106ENTRY(cpu_feroceon_reset)
107	mov	ip, #0
108	mcr	p15, 0, ip, c7, c7, 0		@ invalidate I,D caches
109	mcr	p15, 0, ip, c7, c10, 4		@ drain WB
110#ifdef CONFIG_MMU
111	mcr	p15, 0, ip, c8, c7, 0		@ invalidate I & D TLBs
112#endif
113	mrc	p15, 0, ip, c1, c0, 0		@ ctrl register
114	bic	ip, ip, #0x000f			@ ............wcam
115	bic	ip, ip, #0x1100			@ ...i...s........
116	mcr	p15, 0, ip, c1, c0, 0		@ ctrl register
117	mov	pc, r0
118
119/*
120 * cpu_feroceon_do_idle()
121 *
122 * Called with IRQs disabled
123 */
124	.align	5
125ENTRY(cpu_feroceon_do_idle)
126	mov	r0, #0
127	mcr	p15, 0, r0, c7, c10, 4		@ Drain write buffer
128	mcr	p15, 0, r0, c7, c0, 4		@ Wait for interrupt
129	mov	pc, lr
130
131/*
132 *	flush_user_cache_all()
133 *
134 *	Clean and invalidate all cache entries in a particular
135 *	address space.
136 */
137	.align	5
138ENTRY(feroceon_flush_user_cache_all)
139	/* FALLTHROUGH */
140
141/*
142 *	flush_kern_cache_all()
143 *
144 *	Clean and invalidate the entire cache.
145 */
146ENTRY(feroceon_flush_kern_cache_all)
147	mov	r2, #VM_EXEC
148
149__flush_whole_cache:
150	ldr	r1, __cache_params
151	ldmia	r1, {r1, r3}
1521:	orr	ip, r1, r3
1532:	mcr	p15, 0, ip, c7, c14, 2		@ clean + invalidate D set/way
154	subs	ip, ip, #(1 << 30)		@ next way
155	bcs	2b
156	subs	r1, r1, #(1 << 5)		@ next set
157	bcs	1b
158
159	tst	r2, #VM_EXEC
160	mov	ip, #0
161	mcrne	p15, 0, ip, c7, c5, 0		@ invalidate I cache
162	mcrne	p15, 0, ip, c7, c10, 4		@ drain WB
163	mov	pc, lr
164
165/*
166 *	flush_user_cache_range(start, end, flags)
167 *
168 *	Clean and invalidate a range of cache entries in the
169 *	specified address range.
170 *
171 *	- start	- start address (inclusive)
172 *	- end	- end address (exclusive)
173 *	- flags	- vm_flags describing address space
174 */
175	.align	5
176ENTRY(feroceon_flush_user_cache_range)
177	sub	r3, r1, r0			@ calculate total size
178	cmp	r3, #CACHE_DLIMIT
179	bgt	__flush_whole_cache
1801:	tst	r2, #VM_EXEC
181	mcr	p15, 0, r0, c7, c14, 1		@ clean and invalidate D entry
182	mcrne	p15, 0, r0, c7, c5, 1		@ invalidate I entry
183	add	r0, r0, #CACHE_DLINESIZE
184	mcr	p15, 0, r0, c7, c14, 1		@ clean and invalidate D entry
185	mcrne	p15, 0, r0, c7, c5, 1		@ invalidate I entry
186	add	r0, r0, #CACHE_DLINESIZE
187	cmp	r0, r1
188	blo	1b
189	tst	r2, #VM_EXEC
190	mov	ip, #0
191	mcrne	p15, 0, ip, c7, c10, 4		@ drain WB
192	mov	pc, lr
193
194/*
195 *	coherent_kern_range(start, end)
196 *
197 *	Ensure coherency between the Icache and the Dcache in the
198 *	region described by start, end.  If you have non-snooping
199 *	Harvard caches, you need to implement this function.
200 *
201 *	- start	- virtual start address
202 *	- end	- virtual end address
203 */
204	.align	5
205ENTRY(feroceon_coherent_kern_range)
206	/* FALLTHROUGH */
207
208/*
209 *	coherent_user_range(start, end)
210 *
211 *	Ensure coherency between the Icache and the Dcache in the
212 *	region described by start, end.  If you have non-snooping
213 *	Harvard caches, you need to implement this function.
214 *
215 *	- start	- virtual start address
216 *	- end	- virtual end address
217 */
218ENTRY(feroceon_coherent_user_range)
219	bic	r0, r0, #CACHE_DLINESIZE - 1
2201:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
221	mcr	p15, 0, r0, c7, c5, 1		@ invalidate I entry
222	add	r0, r0, #CACHE_DLINESIZE
223	cmp	r0, r1
224	blo	1b
225	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
226	mov	pc, lr
227
228/*
229 *	flush_kern_dcache_area(void *addr, size_t size)
230 *
231 *	Ensure no D cache aliasing occurs, either with itself or
232 *	the I cache
233 *
234 *	- addr	- kernel address
235 *	- size	- region size
236 */
237	.align	5
238ENTRY(feroceon_flush_kern_dcache_area)
239	add	r1, r0, r1
2401:	mcr	p15, 0, r0, c7, c14, 1		@ clean+invalidate D entry
241	add	r0, r0, #CACHE_DLINESIZE
242	cmp	r0, r1
243	blo	1b
244	mov	r0, #0
245	mcr	p15, 0, r0, c7, c5, 0		@ invalidate I cache
246	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
247	mov	pc, lr
248
249	.align	5
250ENTRY(feroceon_range_flush_kern_dcache_area)
251	mrs	r2, cpsr
252	add	r1, r0, #PAGE_SZ - CACHE_DLINESIZE	@ top addr is inclusive
253	orr	r3, r2, #PSR_I_BIT
254	msr	cpsr_c, r3			@ disable interrupts
255	mcr	p15, 5, r0, c15, c15, 0		@ D clean/inv range start
256	mcr	p15, 5, r1, c15, c15, 1		@ D clean/inv range top
257	msr	cpsr_c, r2			@ restore interrupts
258	mov	r0, #0
259	mcr	p15, 0, r0, c7, c5, 0		@ invalidate I cache
260	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
261	mov	pc, lr
262
263/*
264 *	dma_inv_range(start, end)
265 *
266 *	Invalidate (discard) the specified virtual address range.
267 *	May not write back any entries.  If 'start' or 'end'
268 *	are not cache line aligned, those lines must be written
269 *	back.
270 *
271 *	- start	- virtual start address
272 *	- end	- virtual end address
273 *
274 * (same as v4wb)
275 */
276	.align	5
277ENTRY(feroceon_dma_inv_range)
278	tst	r0, #CACHE_DLINESIZE - 1
279	bic	r0, r0, #CACHE_DLINESIZE - 1
280	mcrne	p15, 0, r0, c7, c10, 1		@ clean D entry
281	tst	r1, #CACHE_DLINESIZE - 1
282	mcrne	p15, 0, r1, c7, c10, 1		@ clean D entry
2831:	mcr	p15, 0, r0, c7, c6, 1		@ invalidate D entry
284	add	r0, r0, #CACHE_DLINESIZE
285	cmp	r0, r1
286	blo	1b
287	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
288	mov	pc, lr
289
290	.align	5
291ENTRY(feroceon_range_dma_inv_range)
292	mrs	r2, cpsr
293	tst	r0, #CACHE_DLINESIZE - 1
294	mcrne	p15, 0, r0, c7, c10, 1		@ clean D entry
295	tst	r1, #CACHE_DLINESIZE - 1
296	mcrne	p15, 0, r1, c7, c10, 1		@ clean D entry
297	cmp	r1, r0
298	subne	r1, r1, #1			@ top address is inclusive
299	orr	r3, r2, #PSR_I_BIT
300	msr	cpsr_c, r3			@ disable interrupts
301	mcr	p15, 5, r0, c15, c14, 0		@ D inv range start
302	mcr	p15, 5, r1, c15, c14, 1		@ D inv range top
303	msr	cpsr_c, r2			@ restore interrupts
304	mov	pc, lr
305
306/*
307 *	dma_clean_range(start, end)
308 *
309 *	Clean the specified virtual address range.
310 *
311 *	- start	- virtual start address
312 *	- end	- virtual end address
313 *
314 * (same as v4wb)
315 */
316	.align	5
317ENTRY(feroceon_dma_clean_range)
318	bic	r0, r0, #CACHE_DLINESIZE - 1
3191:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
320	add	r0, r0, #CACHE_DLINESIZE
321	cmp	r0, r1
322	blo	1b
323	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
324	mov	pc, lr
325
326	.align	5
327ENTRY(feroceon_range_dma_clean_range)
328	mrs	r2, cpsr
329	cmp	r1, r0
330	subne	r1, r1, #1			@ top address is inclusive
331	orr	r3, r2, #PSR_I_BIT
332	msr	cpsr_c, r3			@ disable interrupts
333	mcr	p15, 5, r0, c15, c13, 0		@ D clean range start
334	mcr	p15, 5, r1, c15, c13, 1		@ D clean range top
335	msr	cpsr_c, r2			@ restore interrupts
336	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
337	mov	pc, lr
338
339/*
340 *	dma_flush_range(start, end)
341 *
342 *	Clean and invalidate the specified virtual address range.
343 *
344 *	- start	- virtual start address
345 *	- end	- virtual end address
346 */
347	.align	5
348ENTRY(feroceon_dma_flush_range)
349	bic	r0, r0, #CACHE_DLINESIZE - 1
3501:	mcr	p15, 0, r0, c7, c14, 1		@ clean+invalidate D entry
351	add	r0, r0, #CACHE_DLINESIZE
352	cmp	r0, r1
353	blo	1b
354	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
355	mov	pc, lr
356
357	.align	5
358ENTRY(feroceon_range_dma_flush_range)
359	mrs	r2, cpsr
360	cmp	r1, r0
361	subne	r1, r1, #1			@ top address is inclusive
362	orr	r3, r2, #PSR_I_BIT
363	msr	cpsr_c, r3			@ disable interrupts
364	mcr	p15, 5, r0, c15, c15, 0		@ D clean/inv range start
365	mcr	p15, 5, r1, c15, c15, 1		@ D clean/inv range top
366	msr	cpsr_c, r2			@ restore interrupts
367	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
368	mov	pc, lr
369
370/*
371 *	dma_map_area(start, size, dir)
372 *	- start	- kernel virtual start address
373 *	- size	- size of region
374 *	- dir	- DMA direction
375 */
376ENTRY(feroceon_dma_map_area)
377	add	r1, r1, r0
378	cmp	r2, #DMA_TO_DEVICE
379	beq	feroceon_dma_clean_range
380	bcs	feroceon_dma_inv_range
381	b	feroceon_dma_flush_range
382ENDPROC(feroceon_dma_map_area)
383
384/*
385 *	dma_map_area(start, size, dir)
386 *	- start	- kernel virtual start address
387 *	- size	- size of region
388 *	- dir	- DMA direction
389 */
390ENTRY(feroceon_range_dma_map_area)
391	add	r1, r1, r0
392	cmp	r2, #DMA_TO_DEVICE
393	beq	feroceon_range_dma_clean_range
394	bcs	feroceon_range_dma_inv_range
395	b	feroceon_range_dma_flush_range
396ENDPROC(feroceon_range_dma_map_area)
397
398/*
399 *	dma_unmap_area(start, size, dir)
400 *	- start	- kernel virtual start address
401 *	- size	- size of region
402 *	- dir	- DMA direction
403 */
404ENTRY(feroceon_dma_unmap_area)
405	mov	pc, lr
406ENDPROC(feroceon_dma_unmap_area)
407
408ENTRY(feroceon_cache_fns)
409	.long	feroceon_flush_kern_cache_all
410	.long	feroceon_flush_user_cache_all
411	.long	feroceon_flush_user_cache_range
412	.long	feroceon_coherent_kern_range
413	.long	feroceon_coherent_user_range
414	.long	feroceon_flush_kern_dcache_area
415	.long	feroceon_dma_map_area
416	.long	feroceon_dma_unmap_area
417	.long	feroceon_dma_inv_range
418	.long	feroceon_dma_clean_range
419	.long	feroceon_dma_flush_range
420
421ENTRY(feroceon_range_cache_fns)
422	.long	feroceon_flush_kern_cache_all
423	.long	feroceon_flush_user_cache_all
424	.long	feroceon_flush_user_cache_range
425	.long	feroceon_coherent_kern_range
426	.long	feroceon_coherent_user_range
427	.long	feroceon_range_flush_kern_dcache_area
428	.long	feroceon_range_dma_map_area
429	.long	feroceon_dma_unmap_area
430	.long	feroceon_range_dma_inv_range
431	.long	feroceon_range_dma_clean_range
432	.long	feroceon_range_dma_flush_range
433
434	.align	5
435ENTRY(cpu_feroceon_dcache_clean_area)
436#if defined(CONFIG_CACHE_FEROCEON_L2) && \
437	!defined(CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH)
438	mov	r2, r0
439	mov	r3, r1
440#endif
4411:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
442	add	r0, r0, #CACHE_DLINESIZE
443	subs	r1, r1, #CACHE_DLINESIZE
444	bhi	1b
445#if defined(CONFIG_CACHE_FEROCEON_L2) && \
446	!defined(CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH)
4471:	mcr	p15, 1, r2, c15, c9, 1		@ clean L2 entry
448	add	r2, r2, #CACHE_DLINESIZE
449	subs	r3, r3, #CACHE_DLINESIZE
450	bhi	1b
451#endif
452	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
453	mov	pc, lr
454
455/* =============================== PageTable ============================== */
456
457/*
458 * cpu_feroceon_switch_mm(pgd)
459 *
460 * Set the translation base pointer to be as described by pgd.
461 *
462 * pgd: new page tables
463 */
464	.align	5
465ENTRY(cpu_feroceon_switch_mm)
466#ifdef CONFIG_MMU
467	/*
468	 * Note: we wish to call __flush_whole_cache but we need to preserve
469	 * lr to do so.  The only way without touching main memory is to
470	 * use r2 which is normally used to test the VM_EXEC flag, and
471	 * compensate locally for the skipped ops if it is not set.
472	 */
473	mov	r2, lr				@ abuse r2 to preserve lr
474	bl	__flush_whole_cache
475	@ if r2 contains the VM_EXEC bit then the next 2 ops are done already
476	tst	r2, #VM_EXEC
477	mcreq	p15, 0, ip, c7, c5, 0		@ invalidate I cache
478	mcreq	p15, 0, ip, c7, c10, 4		@ drain WB
479
480	mcr	p15, 0, r0, c2, c0, 0		@ load page table pointer
481	mcr	p15, 0, ip, c8, c7, 0		@ invalidate I & D TLBs
482	mov	pc, r2
483#else
484	mov	pc, lr
485#endif
486
487/*
488 * cpu_feroceon_set_pte_ext(ptep, pte, ext)
489 *
490 * Set a PTE and flush it out
491 */
492	.align	5
493ENTRY(cpu_feroceon_set_pte_ext)
494#ifdef CONFIG_MMU
495	armv3_set_pte_ext wc_disable=0
496	mov	r0, r0
497	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
498#if defined(CONFIG_CACHE_FEROCEON_L2) && \
499	!defined(CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH)
500	mcr	p15, 1, r0, c15, c9, 1		@ clean L2 entry
501#endif
502	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
503#endif
504	mov	pc, lr
505
506	__INIT
507
508	.type	__feroceon_setup, #function
509__feroceon_setup:
510	mov	r0, #0
511	mcr	p15, 0, r0, c7, c7		@ invalidate I,D caches on v4
512	mcr	p15, 0, r0, c7, c10, 4		@ drain write buffer on v4
513#ifdef CONFIG_MMU
514	mcr	p15, 0, r0, c8, c7		@ invalidate I,D TLBs on v4
515#endif
516
517	adr	r5, feroceon_crval
518	ldmia	r5, {r5, r6}
519	mrc	p15, 0, r0, c1, c0		@ get control register v4
520	bic	r0, r0, r5
521	orr	r0, r0, r6
522	mov	pc, lr
523	.size	__feroceon_setup, . - __feroceon_setup
524
525	/*
526	 *      B
527	 *  R   P
528	 * .RVI UFRS BLDP WCAM
529	 * .011 .001 ..11 0101
530	 *
531	 */
532	.type	feroceon_crval, #object
533feroceon_crval:
534	crval	clear=0x0000773f, mmuset=0x00003135, ucset=0x00001134
535
536	__INITDATA
537
538/*
539 * Purpose : Function pointers used to access above functions - all calls
540 *	     come through these
541 */
542	.type	feroceon_processor_functions, #object
543feroceon_processor_functions:
544	.word	v5t_early_abort
545	.word	legacy_pabort
546	.word	cpu_feroceon_proc_init
547	.word	cpu_feroceon_proc_fin
548	.word	cpu_feroceon_reset
549	.word	cpu_feroceon_do_idle
550	.word	cpu_feroceon_dcache_clean_area
551	.word	cpu_feroceon_switch_mm
552	.word	cpu_feroceon_set_pte_ext
553	.size	feroceon_processor_functions, . - feroceon_processor_functions
554
555	.section ".rodata"
556
557	.type	cpu_arch_name, #object
558cpu_arch_name:
559	.asciz	"armv5te"
560	.size	cpu_arch_name, . - cpu_arch_name
561
562	.type	cpu_elf_name, #object
563cpu_elf_name:
564	.asciz	"v5"
565	.size	cpu_elf_name, . - cpu_elf_name
566
567	.type	cpu_feroceon_name, #object
568cpu_feroceon_name:
569	.asciz	"Feroceon"
570	.size	cpu_feroceon_name, . - cpu_feroceon_name
571
572	.type	cpu_88fr531_name, #object
573cpu_88fr531_name:
574	.asciz	"Feroceon 88FR531-vd"
575	.size	cpu_88fr531_name, . - cpu_88fr531_name
576
577	.type	cpu_88fr571_name, #object
578cpu_88fr571_name:
579	.asciz	"Feroceon 88FR571-vd"
580	.size	cpu_88fr571_name, . - cpu_88fr571_name
581
582	.type	cpu_88fr131_name, #object
583cpu_88fr131_name:
584	.asciz	"Feroceon 88FR131"
585	.size	cpu_88fr131_name, . - cpu_88fr131_name
586
587	.align
588
589	.section ".proc.info.init", #alloc, #execinstr
590
591#ifdef CONFIG_CPU_FEROCEON_OLD_ID
592	.type	__feroceon_old_id_proc_info,#object
593__feroceon_old_id_proc_info:
594	.long	0x41009260
595	.long	0xff00fff0
596	.long	PMD_TYPE_SECT | \
597		PMD_SECT_BUFFERABLE | \
598		PMD_SECT_CACHEABLE | \
599		PMD_BIT4 | \
600		PMD_SECT_AP_WRITE | \
601		PMD_SECT_AP_READ
602	.long	PMD_TYPE_SECT | \
603		PMD_BIT4 | \
604		PMD_SECT_AP_WRITE | \
605		PMD_SECT_AP_READ
606	b	__feroceon_setup
607	.long	cpu_arch_name
608	.long	cpu_elf_name
609	.long	HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
610	.long	cpu_feroceon_name
611	.long	feroceon_processor_functions
612	.long	v4wbi_tlb_fns
613	.long	feroceon_user_fns
614	.long	feroceon_cache_fns
615	.size	__feroceon_old_id_proc_info, . - __feroceon_old_id_proc_info
616#endif
617
618	.type	__88fr531_proc_info,#object
619__88fr531_proc_info:
620	.long	0x56055310
621	.long	0xfffffff0
622	.long	PMD_TYPE_SECT | \
623		PMD_SECT_BUFFERABLE | \
624		PMD_SECT_CACHEABLE | \
625		PMD_BIT4 | \
626		PMD_SECT_AP_WRITE | \
627		PMD_SECT_AP_READ
628	.long	PMD_TYPE_SECT | \
629		PMD_BIT4 | \
630		PMD_SECT_AP_WRITE | \
631		PMD_SECT_AP_READ
632	b	__feroceon_setup
633	.long	cpu_arch_name
634	.long	cpu_elf_name
635	.long	HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
636	.long	cpu_88fr531_name
637	.long	feroceon_processor_functions
638	.long	v4wbi_tlb_fns
639	.long	feroceon_user_fns
640	.long	feroceon_cache_fns
641	.size	__88fr531_proc_info, . - __88fr531_proc_info
642
643	.type	__88fr571_proc_info,#object
644__88fr571_proc_info:
645	.long	0x56155710
646	.long	0xfffffff0
647	.long	PMD_TYPE_SECT | \
648		PMD_SECT_BUFFERABLE | \
649		PMD_SECT_CACHEABLE | \
650		PMD_BIT4 | \
651		PMD_SECT_AP_WRITE | \
652		PMD_SECT_AP_READ
653	.long	PMD_TYPE_SECT | \
654		PMD_BIT4 | \
655		PMD_SECT_AP_WRITE | \
656		PMD_SECT_AP_READ
657	b	__feroceon_setup
658	.long	cpu_arch_name
659	.long	cpu_elf_name
660	.long	HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
661	.long	cpu_88fr571_name
662	.long	feroceon_processor_functions
663	.long	v4wbi_tlb_fns
664	.long	feroceon_user_fns
665	.long	feroceon_range_cache_fns
666	.size	__88fr571_proc_info, . - __88fr571_proc_info
667
668	.type	__88fr131_proc_info,#object
669__88fr131_proc_info:
670	.long	0x56251310
671	.long	0xfffffff0
672	.long	PMD_TYPE_SECT | \
673		PMD_SECT_BUFFERABLE | \
674		PMD_SECT_CACHEABLE | \
675		PMD_BIT4 | \
676		PMD_SECT_AP_WRITE | \
677		PMD_SECT_AP_READ
678	.long	PMD_TYPE_SECT | \
679		PMD_BIT4 | \
680		PMD_SECT_AP_WRITE | \
681		PMD_SECT_AP_READ
682	b	__feroceon_setup
683	.long	cpu_arch_name
684	.long	cpu_elf_name
685	.long	HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
686	.long	cpu_88fr131_name
687	.long	feroceon_processor_functions
688	.long	v4wbi_tlb_fns
689	.long	feroceon_user_fns
690	.long	feroceon_range_cache_fns
691	.size	__88fr131_proc_info, . - __88fr131_proc_info
692