root/arch/arm/mm/proc-xscale.S

/* [<][>][^][v][top][bottom][index][help] */
   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 <asm/assembler.h>
  23 #include <asm/hwcap.h>
  24 #include <asm/pgtable.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", #alloc
 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

/* [<][>][^][v][top][bottom][index][help] */