Merge tag 'drm-intel-gt-next-2020-11-12-1' of git://anongit.freedesktop.org/drm/drm...
[linux-2.6-microblaze.git] / arch / arm / mm / proc-xscale.S
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  *  linux/arch/arm/mm/proc-xscale.S
4  *
5  *  Author:     Nicolas Pitre
6  *  Created:    November 2000
7  *  Copyright:  (C) 2000, 2001 MontaVista Software Inc.
8  *
9  * MMU functions for the Intel XScale CPUs
10  *
11  * 2001 Aug 21:
12  *      some contributions by Brett Gaines <brett.w.gaines@intel.com>
13  *      Copyright 2001 by Intel Corp.
14  *
15  * 2001 Sep 08:
16  *      Completely revisited, many important fixes
17  *      Nicolas Pitre <nico@fluxnic.net>
18  */
19
20 #include <linux/linkage.h>
21 #include <linux/init.h>
22 #include <linux/pgtable.h>
23 #include <asm/assembler.h>
24 #include <asm/hwcap.h>
25 #include <asm/pgtable-hwdef.h>
26 #include <asm/page.h>
27 #include <asm/ptrace.h>
28 #include "proc-macros.S"
29
30 /*
31  * This is the maximum size of an area which will be flushed.  If the area
32  * is larger than this, then we flush the whole cache
33  */
34 #define MAX_AREA_SIZE   32768
35
36 /*
37  * the cache line size of the I and D cache
38  */
39 #define CACHELINESIZE   32
40
41 /*
42  * the size of the data cache
43  */
44 #define CACHESIZE       32768
45
46 /*
47  * Virtual address used to allocate the cache when flushed
48  *
49  * This must be an address range which is _never_ used.  It should
50  * apparently have a mapping in the corresponding page table for
51  * compatibility with future CPUs that _could_ require it.  For instance we
52  * don't care.
53  *
54  * This must be aligned on a 2*CACHESIZE boundary.  The code selects one of
55  * the 2 areas in alternance each time the clean_d_cache macro is used.
56  * Without this the XScale core exhibits cache eviction problems and no one
57  * knows why.
58  *
59  * Reminder: the vector table is located at 0xffff0000-0xffff0fff.
60  */
61 #define CLEAN_ADDR      0xfffe0000
62
63 /*
64  * This macro is used to wait for a CP15 write and is needed
65  * when we have to ensure that the last operation to the co-pro
66  * was completed before continuing with operation.
67  */
68         .macro  cpwait, rd
69         mrc     p15, 0, \rd, c2, c0, 0          @ arbitrary read of cp15
70         mov     \rd, \rd                        @ wait for completion
71         sub     pc, pc, #4                      @ flush instruction pipeline
72         .endm
73
74         .macro  cpwait_ret, lr, rd
75         mrc     p15, 0, \rd, c2, c0, 0          @ arbitrary read of cp15
76         sub     pc, \lr, \rd, LSR #32           @ wait for completion and
77                                                 @ flush instruction pipeline
78         .endm
79
80 /*
81  * This macro cleans the entire dcache using line allocate.
82  * The main loop has been unrolled to reduce loop overhead.
83  * rd and rs are two scratch registers.
84  */
85         .macro  clean_d_cache, rd, rs
86         ldr     \rs, =clean_addr
87         ldr     \rd, [\rs]
88         eor     \rd, \rd, #CACHESIZE
89         str     \rd, [\rs]
90         add     \rs, \rd, #CACHESIZE
91 1:      mcr     p15, 0, \rd, c7, c2, 5          @ allocate D cache line
92         add     \rd, \rd, #CACHELINESIZE
93         mcr     p15, 0, \rd, c7, c2, 5          @ allocate D cache line
94         add     \rd, \rd, #CACHELINESIZE
95         mcr     p15, 0, \rd, c7, c2, 5          @ allocate D cache line
96         add     \rd, \rd, #CACHELINESIZE
97         mcr     p15, 0, \rd, c7, c2, 5          @ allocate D cache line
98         add     \rd, \rd, #CACHELINESIZE
99         teq     \rd, \rs
100         bne     1b
101         .endm
102
103         .data
104         .align  2
105 clean_addr:     .word   CLEAN_ADDR
106
107         .text
108
109 /*
110  * cpu_xscale_proc_init()
111  *
112  * Nothing too exciting at the moment
113  */
114 ENTRY(cpu_xscale_proc_init)
115         @ enable write buffer coalescing. Some bootloader disable it
116         mrc     p15, 0, r1, c1, c0, 1
117         bic     r1, r1, #1
118         mcr     p15, 0, r1, c1, c0, 1
119         ret     lr
120
121 /*
122  * cpu_xscale_proc_fin()
123  */
124 ENTRY(cpu_xscale_proc_fin)
125         mrc     p15, 0, r0, c1, c0, 0           @ ctrl register
126         bic     r0, r0, #0x1800                 @ ...IZ...........
127         bic     r0, r0, #0x0006                 @ .............CA.
128         mcr     p15, 0, r0, c1, c0, 0           @ disable caches
129         ret     lr
130
131 /*
132  * cpu_xscale_reset(loc)
133  *
134  * Perform a soft reset of the system.  Put the CPU into the
135  * same state as it would be if it had been reset, and branch
136  * to what would be the reset vector.
137  *
138  * loc: location to jump to for soft reset
139  *
140  * Beware PXA270 erratum E7.
141  */
142         .align  5
143         .pushsection    .idmap.text, "ax"
144 ENTRY(cpu_xscale_reset)
145         mov     r1, #PSR_F_BIT|PSR_I_BIT|SVC_MODE
146         msr     cpsr_c, r1                      @ reset CPSR
147         mcr     p15, 0, r1, c10, c4, 1          @ unlock I-TLB
148         mcr     p15, 0, r1, c8, c5, 0           @ invalidate I-TLB
149         mrc     p15, 0, r1, c1, c0, 0           @ ctrl register
150         bic     r1, r1, #0x0086                 @ ........B....CA.
151         bic     r1, r1, #0x3900                 @ ..VIZ..S........
152         sub     pc, pc, #4                      @ flush pipeline
153         @ *** cache line aligned ***
154         mcr     p15, 0, r1, c1, c0, 0           @ ctrl register
155         bic     r1, r1, #0x0001                 @ ...............M
156         mcr     p15, 0, ip, c7, c7, 0           @ invalidate I,D caches & BTB
157         mcr     p15, 0, r1, c1, c0, 0           @ ctrl register
158         @ CAUTION: MMU turned off from this point. We count on the pipeline
159         @ already containing those two last instructions to survive.
160         mcr     p15, 0, ip, c8, c7, 0           @ invalidate I & D TLBs
161         ret     r0
162 ENDPROC(cpu_xscale_reset)
163         .popsection
164
165 /*
166  * cpu_xscale_do_idle()
167  *
168  * Cause the processor to idle
169  *
170  * For now we do nothing but go to idle mode for every case
171  *
172  * XScale supports clock switching, but using idle mode support
173  * allows external hardware to react to system state changes.
174  */
175         .align  5
176
177 ENTRY(cpu_xscale_do_idle)
178         mov     r0, #1
179         mcr     p14, 0, r0, c7, c0, 0           @ Go to IDLE
180         ret     lr
181
182 /* ================================= CACHE ================================ */
183
184 /*
185  *      flush_icache_all()
186  *
187  *      Unconditionally clean and invalidate the entire icache.
188  */
189 ENTRY(xscale_flush_icache_all)
190         mov     r0, #0
191         mcr     p15, 0, r0, c7, c5, 0           @ invalidate I cache
192         ret     lr
193 ENDPROC(xscale_flush_icache_all)
194
195 /*
196  *      flush_user_cache_all()
197  *
198  *      Invalidate all cache entries in a particular address
199  *      space.
200  */
201 ENTRY(xscale_flush_user_cache_all)
202         /* FALLTHROUGH */
203
204 /*
205  *      flush_kern_cache_all()
206  *
207  *      Clean and invalidate the entire cache.
208  */
209 ENTRY(xscale_flush_kern_cache_all)
210         mov     r2, #VM_EXEC
211         mov     ip, #0
212 __flush_whole_cache:
213         clean_d_cache r0, r1
214         tst     r2, #VM_EXEC
215         mcrne   p15, 0, ip, c7, c5, 0           @ Invalidate I cache & BTB
216         mcrne   p15, 0, ip, c7, c10, 4          @ Drain Write (& Fill) Buffer
217         ret     lr
218
219 /*
220  *      flush_user_cache_range(start, end, vm_flags)
221  *
222  *      Invalidate a range of cache entries in the specified
223  *      address space.
224  *
225  *      - start - start address (may not be aligned)
226  *      - end   - end address (exclusive, may not be aligned)
227  *      - vma   - vma_area_struct describing address space
228  */
229         .align  5
230 ENTRY(xscale_flush_user_cache_range)
231         mov     ip, #0
232         sub     r3, r1, r0                      @ calculate total size
233         cmp     r3, #MAX_AREA_SIZE
234         bhs     __flush_whole_cache
235
236 1:      tst     r2, #VM_EXEC
237         mcrne   p15, 0, r0, c7, c5, 1           @ Invalidate I cache line
238         mcr     p15, 0, r0, c7, c10, 1          @ Clean D cache line
239         mcr     p15, 0, r0, c7, c6, 1           @ Invalidate D cache line
240         add     r0, r0, #CACHELINESIZE
241         cmp     r0, r1
242         blo     1b
243         tst     r2, #VM_EXEC
244         mcrne   p15, 0, ip, c7, c5, 6           @ Invalidate BTB
245         mcrne   p15, 0, ip, c7, c10, 4          @ Drain Write (& Fill) Buffer
246         ret     lr
247
248 /*
249  *      coherent_kern_range(start, end)
250  *
251  *      Ensure coherency between the Icache and the Dcache in the
252  *      region described by start.  If you have non-snooping
253  *      Harvard caches, you need to implement this function.
254  *
255  *      - start  - virtual start address
256  *      - end    - virtual end address
257  *
258  *      Note: single I-cache line invalidation isn't used here since
259  *      it also trashes the mini I-cache used by JTAG debuggers.
260  */
261 ENTRY(xscale_coherent_kern_range)
262         bic     r0, r0, #CACHELINESIZE - 1
263 1:      mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
264         add     r0, r0, #CACHELINESIZE
265         cmp     r0, r1
266         blo     1b
267         mov     r0, #0
268         mcr     p15, 0, r0, c7, c5, 0           @ Invalidate I cache & BTB
269         mcr     p15, 0, r0, c7, c10, 4          @ Drain Write (& Fill) Buffer
270         ret     lr
271
272 /*
273  *      coherent_user_range(start, end)
274  *
275  *      Ensure coherency between the Icache and the Dcache in the
276  *      region described by start.  If you have non-snooping
277  *      Harvard caches, you need to implement this function.
278  *
279  *      - start  - virtual start address
280  *      - end    - virtual end address
281  */
282 ENTRY(xscale_coherent_user_range)
283         bic     r0, r0, #CACHELINESIZE - 1
284 1:      mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
285         mcr     p15, 0, r0, c7, c5, 1           @ Invalidate I cache entry
286         add     r0, r0, #CACHELINESIZE
287         cmp     r0, r1
288         blo     1b
289         mov     r0, #0
290         mcr     p15, 0, r0, c7, c5, 6           @ Invalidate BTB
291         mcr     p15, 0, r0, c7, c10, 4          @ Drain Write (& Fill) Buffer
292         ret     lr
293
294 /*
295  *      flush_kern_dcache_area(void *addr, size_t size)
296  *
297  *      Ensure no D cache aliasing occurs, either with itself or
298  *      the I cache
299  *
300  *      - addr  - kernel address
301  *      - size  - region size
302  */
303 ENTRY(xscale_flush_kern_dcache_area)
304         add     r1, r0, r1
305 1:      mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
306         mcr     p15, 0, r0, c7, c6, 1           @ invalidate D entry
307         add     r0, r0, #CACHELINESIZE
308         cmp     r0, r1
309         blo     1b
310         mov     r0, #0
311         mcr     p15, 0, r0, c7, c5, 0           @ Invalidate I cache & BTB
312         mcr     p15, 0, r0, c7, c10, 4          @ Drain Write (& Fill) Buffer
313         ret     lr
314
315 /*
316  *      dma_inv_range(start, end)
317  *
318  *      Invalidate (discard) the specified virtual address range.
319  *      May not write back any entries.  If 'start' or 'end'
320  *      are not cache line aligned, those lines must be written
321  *      back.
322  *
323  *      - start  - virtual start address
324  *      - end    - virtual end address
325  */
326 xscale_dma_inv_range:
327         tst     r0, #CACHELINESIZE - 1
328         bic     r0, r0, #CACHELINESIZE - 1
329         mcrne   p15, 0, r0, c7, c10, 1          @ clean D entry
330         tst     r1, #CACHELINESIZE - 1
331         mcrne   p15, 0, r1, c7, c10, 1          @ clean D entry
332 1:      mcr     p15, 0, r0, c7, c6, 1           @ invalidate D entry
333         add     r0, r0, #CACHELINESIZE
334         cmp     r0, r1
335         blo     1b
336         mcr     p15, 0, r0, c7, c10, 4          @ Drain Write (& Fill) Buffer
337         ret     lr
338
339 /*
340  *      dma_clean_range(start, end)
341  *
342  *      Clean the specified virtual address range.
343  *
344  *      - start  - virtual start address
345  *      - end    - virtual end address
346  */
347 xscale_dma_clean_range:
348         bic     r0, r0, #CACHELINESIZE - 1
349 1:      mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
350         add     r0, r0, #CACHELINESIZE
351         cmp     r0, r1
352         blo     1b
353         mcr     p15, 0, r0, c7, c10, 4          @ Drain Write (& Fill) Buffer
354         ret     lr
355
356 /*
357  *      dma_flush_range(start, end)
358  *
359  *      Clean and invalidate the specified virtual address range.
360  *
361  *      - start  - virtual start address
362  *      - end    - virtual end address
363  */
364 ENTRY(xscale_dma_flush_range)
365         bic     r0, r0, #CACHELINESIZE - 1
366 1:      mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
367         mcr     p15, 0, r0, c7, c6, 1           @ invalidate D entry
368         add     r0, r0, #CACHELINESIZE
369         cmp     r0, r1
370         blo     1b
371         mcr     p15, 0, r0, c7, c10, 4          @ Drain Write (& Fill) Buffer
372         ret     lr
373
374 /*
375  *      dma_map_area(start, size, dir)
376  *      - start - kernel virtual start address
377  *      - size  - size of region
378  *      - dir   - DMA direction
379  */
380 ENTRY(xscale_dma_map_area)
381         add     r1, r1, r0
382         cmp     r2, #DMA_TO_DEVICE
383         beq     xscale_dma_clean_range
384         bcs     xscale_dma_inv_range
385         b       xscale_dma_flush_range
386 ENDPROC(xscale_dma_map_area)
387
388 /*
389  *      dma_map_area(start, size, dir)
390  *      - start - kernel virtual start address
391  *      - size  - size of region
392  *      - dir   - DMA direction
393  */
394 ENTRY(xscale_80200_A0_A1_dma_map_area)
395         add     r1, r1, r0
396         teq     r2, #DMA_TO_DEVICE
397         beq     xscale_dma_clean_range
398         b       xscale_dma_flush_range
399 ENDPROC(xscale_80200_A0_A1_dma_map_area)
400
401 /*
402  *      dma_unmap_area(start, size, dir)
403  *      - start - kernel virtual start address
404  *      - size  - size of region
405  *      - dir   - DMA direction
406  */
407 ENTRY(xscale_dma_unmap_area)
408         ret     lr
409 ENDPROC(xscale_dma_unmap_area)
410
411         .globl  xscale_flush_kern_cache_louis
412         .equ    xscale_flush_kern_cache_louis, xscale_flush_kern_cache_all
413
414         @ define struct cpu_cache_fns (see <asm/cacheflush.h> and proc-macros.S)
415         define_cache_functions xscale
416
417 /*
418  * On stepping A0/A1 of the 80200, invalidating D-cache by line doesn't
419  * clear the dirty bits, which means that if we invalidate a dirty line,
420  * the dirty data can still be written back to external memory later on.
421  *
422  * The recommended workaround is to always do a clean D-cache line before
423  * doing an invalidate D-cache line, so on the affected processors,
424  * dma_inv_range() is implemented as dma_flush_range().
425  *
426  * See erratum #25 of "Intel 80200 Processor Specification Update",
427  * revision January 22, 2003, available at:
428  *     http://www.intel.com/design/iio/specupdt/273415.htm
429  */
430 .macro a0_alias basename
431         .globl xscale_80200_A0_A1_\basename
432         .type xscale_80200_A0_A1_\basename , %function
433         .equ xscale_80200_A0_A1_\basename , xscale_\basename
434 .endm
435
436 /*
437  * Most of the cache functions are unchanged for these processor revisions.
438  * Export suitable alias symbols for the unchanged functions:
439  */
440         a0_alias flush_icache_all
441         a0_alias flush_user_cache_all
442         a0_alias flush_kern_cache_all
443         a0_alias flush_kern_cache_louis
444         a0_alias flush_user_cache_range
445         a0_alias coherent_kern_range
446         a0_alias coherent_user_range
447         a0_alias flush_kern_dcache_area
448         a0_alias dma_flush_range
449         a0_alias dma_unmap_area
450
451         @ define struct cpu_cache_fns (see <asm/cacheflush.h> and proc-macros.S)
452         define_cache_functions xscale_80200_A0_A1
453
454 ENTRY(cpu_xscale_dcache_clean_area)
455 1:      mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
456         add     r0, r0, #CACHELINESIZE
457         subs    r1, r1, #CACHELINESIZE
458         bhi     1b
459         ret     lr
460
461 /* =============================== PageTable ============================== */
462
463 /*
464  * cpu_xscale_switch_mm(pgd)
465  *
466  * Set the translation base pointer to be as described by pgd.
467  *
468  * pgd: new page tables
469  */
470         .align  5
471 ENTRY(cpu_xscale_switch_mm)
472         clean_d_cache r1, r2
473         mcr     p15, 0, ip, c7, c5, 0           @ Invalidate I cache & BTB
474         mcr     p15, 0, ip, c7, c10, 4          @ Drain Write (& Fill) Buffer
475         mcr     p15, 0, r0, c2, c0, 0           @ load page table pointer
476         mcr     p15, 0, ip, c8, c7, 0           @ invalidate I & D TLBs
477         cpwait_ret lr, ip
478
479 /*
480  * cpu_xscale_set_pte_ext(ptep, pte, ext)
481  *
482  * Set a PTE and flush it out
483  *
484  * Errata 40: must set memory to write-through for user read-only pages.
485  */
486 cpu_xscale_mt_table:
487         .long   0x00                                            @ L_PTE_MT_UNCACHED
488         .long   PTE_BUFFERABLE                                  @ L_PTE_MT_BUFFERABLE
489         .long   PTE_CACHEABLE                                   @ L_PTE_MT_WRITETHROUGH
490         .long   PTE_CACHEABLE | PTE_BUFFERABLE                  @ L_PTE_MT_WRITEBACK
491         .long   PTE_EXT_TEX(1) | PTE_BUFFERABLE                 @ L_PTE_MT_DEV_SHARED
492         .long   0x00                                            @ unused
493         .long   PTE_EXT_TEX(1) | PTE_CACHEABLE                  @ L_PTE_MT_MINICACHE
494         .long   PTE_EXT_TEX(1) | PTE_CACHEABLE | PTE_BUFFERABLE @ L_PTE_MT_WRITEALLOC
495         .long   0x00                                            @ unused
496         .long   PTE_BUFFERABLE                                  @ L_PTE_MT_DEV_WC
497         .long   0x00                                            @ unused
498         .long   PTE_CACHEABLE | PTE_BUFFERABLE                  @ L_PTE_MT_DEV_CACHED
499         .long   0x00                                            @ L_PTE_MT_DEV_NONSHARED
500         .long   0x00                                            @ unused
501         .long   0x00                                            @ unused
502         .long   0x00                                            @ unused
503
504         .align  5
505 ENTRY(cpu_xscale_set_pte_ext)
506         xscale_set_pte_ext_prologue
507
508         @
509         @ Erratum 40: must set memory to write-through for user read-only pages
510         @
511         and     ip, r1, #(L_PTE_MT_MASK | L_PTE_USER | L_PTE_RDONLY) & ~(4 << 2)
512         teq     ip, #L_PTE_MT_WRITEBACK | L_PTE_USER | L_PTE_RDONLY
513
514         moveq   r1, #L_PTE_MT_WRITETHROUGH
515         and     r1, r1, #L_PTE_MT_MASK
516         adr     ip, cpu_xscale_mt_table
517         ldr     ip, [ip, r1]
518         bic     r2, r2, #0x0c
519         orr     r2, r2, ip
520
521         xscale_set_pte_ext_epilogue
522         ret     lr
523
524         .ltorg
525         .align
526
527 .globl  cpu_xscale_suspend_size
528 .equ    cpu_xscale_suspend_size, 4 * 6
529 #ifdef CONFIG_ARM_CPU_SUSPEND
530 ENTRY(cpu_xscale_do_suspend)
531         stmfd   sp!, {r4 - r9, lr}
532         mrc     p14, 0, r4, c6, c0, 0   @ clock configuration, for turbo mode
533         mrc     p15, 0, r5, c15, c1, 0  @ CP access reg
534         mrc     p15, 0, r6, c13, c0, 0  @ PID
535         mrc     p15, 0, r7, c3, c0, 0   @ domain ID
536         mrc     p15, 0, r8, c1, c0, 1   @ auxiliary control reg
537         mrc     p15, 0, r9, c1, c0, 0   @ control reg
538         bic     r4, r4, #2              @ clear frequency change bit
539         stmia   r0, {r4 - r9}           @ store cp regs
540         ldmfd   sp!, {r4 - r9, pc}
541 ENDPROC(cpu_xscale_do_suspend)
542
543 ENTRY(cpu_xscale_do_resume)
544         ldmia   r0, {r4 - r9}           @ load cp regs
545         mov     ip, #0
546         mcr     p15, 0, ip, c8, c7, 0   @ invalidate I & D TLBs
547         mcr     p15, 0, ip, c7, c7, 0   @ invalidate I & D caches, BTB
548         mcr     p14, 0, r4, c6, c0, 0   @ clock configuration, turbo mode.
549         mcr     p15, 0, r5, c15, c1, 0  @ CP access reg
550         mcr     p15, 0, r6, c13, c0, 0  @ PID
551         mcr     p15, 0, r7, c3, c0, 0   @ domain ID
552         mcr     p15, 0, r1, c2, c0, 0   @ translation table base addr
553         mcr     p15, 0, r8, c1, c0, 1   @ auxiliary control reg
554         mov     r0, r9                  @ control register
555         b       cpu_resume_mmu
556 ENDPROC(cpu_xscale_do_resume)
557 #endif
558
559         .type   __xscale_setup, #function
560 __xscale_setup:
561         mcr     p15, 0, ip, c7, c7, 0           @ invalidate I, D caches & BTB
562         mcr     p15, 0, ip, c7, c10, 4          @ Drain Write (& Fill) Buffer
563         mcr     p15, 0, ip, c8, c7, 0           @ invalidate I, D TLBs
564         mov     r0, #1 << 6                     @ cp6 for IOP3xx and Bulverde
565         orr     r0, r0, #1 << 13                @ Its undefined whether this
566         mcr     p15, 0, r0, c15, c1, 0          @ affects USR or SVC modes
567
568         adr     r5, xscale_crval
569         ldmia   r5, {r5, r6}
570         mrc     p15, 0, r0, c1, c0, 0           @ get control register
571         bic     r0, r0, r5
572         orr     r0, r0, r6
573         ret     lr
574         .size   __xscale_setup, . - __xscale_setup
575
576         /*
577          *  R
578          * .RVI ZFRS BLDP WCAM
579          * ..11 1.01 .... .101
580          * 
581          */
582         .type   xscale_crval, #object
583 xscale_crval:
584         crval   clear=0x00003b07, mmuset=0x00003905, ucset=0x00001900
585
586         __INITDATA
587
588         @ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
589         define_processor_functions xscale, dabort=v5t_early_abort, pabort=legacy_pabort, suspend=1
590
591         .section ".rodata"
592
593         string  cpu_arch_name, "armv5te"
594         string  cpu_elf_name, "v5"
595
596         string  cpu_80200_A0_A1_name, "XScale-80200 A0/A1"
597         string  cpu_80200_name, "XScale-80200"
598         string  cpu_80219_name, "XScale-80219"
599         string  cpu_8032x_name, "XScale-IOP8032x Family"
600         string  cpu_8033x_name, "XScale-IOP8033x Family"
601         string  cpu_pxa250_name, "XScale-PXA250"
602         string  cpu_pxa210_name, "XScale-PXA210"
603         string  cpu_ixp42x_name, "XScale-IXP42x Family"
604         string  cpu_ixp43x_name, "XScale-IXP43x Family"
605         string  cpu_ixp46x_name, "XScale-IXP46x Family"
606         string  cpu_ixp2400_name, "XScale-IXP2400"
607         string  cpu_ixp2800_name, "XScale-IXP2800"
608         string  cpu_pxa255_name, "XScale-PXA255"
609         string  cpu_pxa270_name, "XScale-PXA270"
610
611         .align
612
613         .section ".proc.info.init", "a"
614
615 .macro xscale_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cache
616         .type   __\name\()_proc_info,#object
617 __\name\()_proc_info:
618         .long   \cpu_val
619         .long   \cpu_mask
620         .long   PMD_TYPE_SECT | \
621                 PMD_SECT_BUFFERABLE | \
622                 PMD_SECT_CACHEABLE | \
623                 PMD_SECT_AP_WRITE | \
624                 PMD_SECT_AP_READ
625         .long   PMD_TYPE_SECT | \
626                 PMD_SECT_AP_WRITE | \
627                 PMD_SECT_AP_READ
628         initfn  __xscale_setup, __\name\()_proc_info
629         .long   cpu_arch_name
630         .long   cpu_elf_name
631         .long   HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
632         .long   \cpu_name
633         .long   xscale_processor_functions
634         .long   v4wbi_tlb_fns
635         .long   xscale_mc_user_fns
636         .ifb \cache
637                 .long   xscale_cache_fns
638         .else
639                 .long   \cache
640         .endif
641         .size   __\name\()_proc_info, . - __\name\()_proc_info
642 .endm
643
644         xscale_proc_info 80200_A0_A1, 0x69052000, 0xfffffffe, cpu_80200_name, \
645                 cache=xscale_80200_A0_A1_cache_fns
646         xscale_proc_info 80200, 0x69052000, 0xfffffff0, cpu_80200_name
647         xscale_proc_info 80219, 0x69052e20, 0xffffffe0, cpu_80219_name
648         xscale_proc_info 8032x, 0x69052420, 0xfffff7e0, cpu_8032x_name
649         xscale_proc_info 8033x, 0x69054010, 0xfffffd30, cpu_8033x_name
650         xscale_proc_info pxa250, 0x69052100, 0xfffff7f0, cpu_pxa250_name
651         xscale_proc_info pxa210, 0x69052120, 0xfffff3f0, cpu_pxa210_name
652         xscale_proc_info ixp2400, 0x69054190, 0xfffffff0, cpu_ixp2400_name
653         xscale_proc_info ixp2800, 0x690541a0, 0xfffffff0, cpu_ixp2800_name
654         xscale_proc_info ixp42x, 0x690541c0, 0xffffffc0, cpu_ixp42x_name
655         xscale_proc_info ixp43x, 0x69054040, 0xfffffff0, cpu_ixp43x_name
656         xscale_proc_info ixp46x, 0x69054200, 0xffffff00, cpu_ixp46x_name
657         xscale_proc_info pxa255, 0x69052d00, 0xfffffff0, cpu_pxa255_name
658         xscale_proc_info pxa270, 0x69054110, 0xfffffff0, cpu_pxa270_name