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