proc-feroceon.S 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * linux/arch/arm/mm/proc-feroceon.S: MMU functions for Feroceon
  4. *
  5. * Heavily based on proc-arm926.S
  6. * Maintainer: Assaf Hoffman <[email protected]>
  7. */
  8. #include <linux/linkage.h>
  9. #include <linux/init.h>
  10. #include <linux/pgtable.h>
  11. #include <asm/assembler.h>
  12. #include <asm/hwcap.h>
  13. #include <asm/pgtable-hwdef.h>
  14. #include <asm/page.h>
  15. #include <asm/ptrace.h>
  16. #include "proc-macros.S"
  17. /*
  18. * This is the maximum size of an area which will be invalidated
  19. * using the single invalidate entry instructions. Anything larger
  20. * than this, and we go for the whole cache.
  21. *
  22. * This value should be chosen such that we choose the cheapest
  23. * alternative.
  24. */
  25. #define CACHE_DLIMIT 16384
  26. /*
  27. * the cache line size of the I and D cache
  28. */
  29. #define CACHE_DLINESIZE 32
  30. .bss
  31. .align 3
  32. __cache_params_loc:
  33. .space 8
  34. .text
  35. __cache_params:
  36. .word __cache_params_loc
  37. /*
  38. * cpu_feroceon_proc_init()
  39. */
  40. ENTRY(cpu_feroceon_proc_init)
  41. mrc p15, 0, r0, c0, c0, 1 @ read cache type register
  42. ldr r1, __cache_params
  43. mov r2, #(16 << 5)
  44. tst r0, #(1 << 16) @ get way
  45. mov r0, r0, lsr #18 @ get cache size order
  46. movne r3, #((4 - 1) << 30) @ 4-way
  47. and r0, r0, #0xf
  48. moveq r3, #0 @ 1-way
  49. mov r2, r2, lsl r0 @ actual cache size
  50. movne r2, r2, lsr #2 @ turned into # of sets
  51. sub r2, r2, #(1 << 5)
  52. stmia r1, {r2, r3}
  53. ret lr
  54. /*
  55. * cpu_feroceon_proc_fin()
  56. */
  57. ENTRY(cpu_feroceon_proc_fin)
  58. #if defined(CONFIG_CACHE_FEROCEON_L2) && \
  59. !defined(CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH)
  60. mov r0, #0
  61. mcr p15, 1, r0, c15, c9, 0 @ clean L2
  62. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  63. #endif
  64. mrc p15, 0, r0, c1, c0, 0 @ ctrl register
  65. bic r0, r0, #0x1000 @ ...i............
  66. bic r0, r0, #0x000e @ ............wca.
  67. mcr p15, 0, r0, c1, c0, 0 @ disable caches
  68. ret lr
  69. /*
  70. * cpu_feroceon_reset(loc)
  71. *
  72. * Perform a soft reset of the system. Put the CPU into the
  73. * same state as it would be if it had been reset, and branch
  74. * to what would be the reset vector.
  75. *
  76. * loc: location to jump to for soft reset
  77. */
  78. .align 5
  79. .pushsection .idmap.text, "ax"
  80. ENTRY(cpu_feroceon_reset)
  81. mov ip, #0
  82. mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
  83. mcr p15, 0, ip, c7, c10, 4 @ drain WB
  84. #ifdef CONFIG_MMU
  85. mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs
  86. #endif
  87. mrc p15, 0, ip, c1, c0, 0 @ ctrl register
  88. bic ip, ip, #0x000f @ ............wcam
  89. bic ip, ip, #0x1100 @ ...i...s........
  90. mcr p15, 0, ip, c1, c0, 0 @ ctrl register
  91. ret r0
  92. ENDPROC(cpu_feroceon_reset)
  93. .popsection
  94. /*
  95. * cpu_feroceon_do_idle()
  96. *
  97. * Called with IRQs disabled
  98. */
  99. .align 5
  100. ENTRY(cpu_feroceon_do_idle)
  101. mov r0, #0
  102. mcr p15, 0, r0, c7, c10, 4 @ Drain write buffer
  103. mcr p15, 0, r0, c7, c0, 4 @ Wait for interrupt
  104. ret lr
  105. /*
  106. * flush_icache_all()
  107. *
  108. * Unconditionally clean and invalidate the entire icache.
  109. */
  110. ENTRY(feroceon_flush_icache_all)
  111. mov r0, #0
  112. mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
  113. ret lr
  114. ENDPROC(feroceon_flush_icache_all)
  115. /*
  116. * flush_user_cache_all()
  117. *
  118. * Clean and invalidate all cache entries in a particular
  119. * address space.
  120. */
  121. .align 5
  122. ENTRY(feroceon_flush_user_cache_all)
  123. /* FALLTHROUGH */
  124. /*
  125. * flush_kern_cache_all()
  126. *
  127. * Clean and invalidate the entire cache.
  128. */
  129. ENTRY(feroceon_flush_kern_cache_all)
  130. mov r2, #VM_EXEC
  131. __flush_whole_cache:
  132. ldr r1, __cache_params
  133. ldmia r1, {r1, r3}
  134. 1: orr ip, r1, r3
  135. 2: mcr p15, 0, ip, c7, c14, 2 @ clean + invalidate D set/way
  136. subs ip, ip, #(1 << 30) @ next way
  137. bcs 2b
  138. subs r1, r1, #(1 << 5) @ next set
  139. bcs 1b
  140. tst r2, #VM_EXEC
  141. mov ip, #0
  142. mcrne p15, 0, ip, c7, c5, 0 @ invalidate I cache
  143. mcrne p15, 0, ip, c7, c10, 4 @ drain WB
  144. ret lr
  145. /*
  146. * flush_user_cache_range(start, end, flags)
  147. *
  148. * Clean and invalidate a range of cache entries in the
  149. * specified address range.
  150. *
  151. * - start - start address (inclusive)
  152. * - end - end address (exclusive)
  153. * - flags - vm_flags describing address space
  154. */
  155. .align 5
  156. ENTRY(feroceon_flush_user_cache_range)
  157. sub r3, r1, r0 @ calculate total size
  158. cmp r3, #CACHE_DLIMIT
  159. bgt __flush_whole_cache
  160. 1: tst r2, #VM_EXEC
  161. mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry
  162. mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry
  163. add r0, r0, #CACHE_DLINESIZE
  164. mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry
  165. mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry
  166. add r0, r0, #CACHE_DLINESIZE
  167. cmp r0, r1
  168. blo 1b
  169. tst r2, #VM_EXEC
  170. mov ip, #0
  171. mcrne p15, 0, ip, c7, c10, 4 @ drain WB
  172. ret lr
  173. /*
  174. * coherent_kern_range(start, end)
  175. *
  176. * Ensure coherency between the Icache and the Dcache in the
  177. * region described by start, end. If you have non-snooping
  178. * Harvard caches, you need to implement this function.
  179. *
  180. * - start - virtual start address
  181. * - end - virtual end address
  182. */
  183. .align 5
  184. ENTRY(feroceon_coherent_kern_range)
  185. /* FALLTHROUGH */
  186. /*
  187. * coherent_user_range(start, end)
  188. *
  189. * Ensure coherency between the Icache and the Dcache in the
  190. * region described by start, end. If you have non-snooping
  191. * Harvard caches, you need to implement this function.
  192. *
  193. * - start - virtual start address
  194. * - end - virtual end address
  195. */
  196. ENTRY(feroceon_coherent_user_range)
  197. bic r0, r0, #CACHE_DLINESIZE - 1
  198. 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
  199. mcr p15, 0, r0, c7, c5, 1 @ invalidate I entry
  200. add r0, r0, #CACHE_DLINESIZE
  201. cmp r0, r1
  202. blo 1b
  203. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  204. mov r0, #0
  205. ret lr
  206. /*
  207. * flush_kern_dcache_area(void *addr, size_t size)
  208. *
  209. * Ensure no D cache aliasing occurs, either with itself or
  210. * the I cache
  211. *
  212. * - addr - kernel address
  213. * - size - region size
  214. */
  215. .align 5
  216. ENTRY(feroceon_flush_kern_dcache_area)
  217. add r1, r0, r1
  218. 1: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry
  219. add r0, r0, #CACHE_DLINESIZE
  220. cmp r0, r1
  221. blo 1b
  222. mov r0, #0
  223. mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
  224. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  225. ret lr
  226. .align 5
  227. ENTRY(feroceon_range_flush_kern_dcache_area)
  228. mrs r2, cpsr
  229. add r1, r0, #PAGE_SZ - CACHE_DLINESIZE @ top addr is inclusive
  230. orr r3, r2, #PSR_I_BIT
  231. msr cpsr_c, r3 @ disable interrupts
  232. mcr p15, 5, r0, c15, c15, 0 @ D clean/inv range start
  233. mcr p15, 5, r1, c15, c15, 1 @ D clean/inv range top
  234. msr cpsr_c, r2 @ restore interrupts
  235. mov r0, #0
  236. mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
  237. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  238. ret lr
  239. /*
  240. * dma_inv_range(start, end)
  241. *
  242. * Invalidate (discard) the specified virtual address range.
  243. * May not write back any entries. If 'start' or 'end'
  244. * are not cache line aligned, those lines must be written
  245. * back.
  246. *
  247. * - start - virtual start address
  248. * - end - virtual end address
  249. *
  250. * (same as v4wb)
  251. */
  252. .align 5
  253. feroceon_dma_inv_range:
  254. tst r0, #CACHE_DLINESIZE - 1
  255. bic r0, r0, #CACHE_DLINESIZE - 1
  256. mcrne p15, 0, r0, c7, c10, 1 @ clean D entry
  257. tst r1, #CACHE_DLINESIZE - 1
  258. mcrne p15, 0, r1, c7, c10, 1 @ clean D entry
  259. 1: mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry
  260. add r0, r0, #CACHE_DLINESIZE
  261. cmp r0, r1
  262. blo 1b
  263. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  264. ret lr
  265. .align 5
  266. feroceon_range_dma_inv_range:
  267. mrs r2, cpsr
  268. tst r0, #CACHE_DLINESIZE - 1
  269. mcrne p15, 0, r0, c7, c10, 1 @ clean D entry
  270. tst r1, #CACHE_DLINESIZE - 1
  271. mcrne p15, 0, r1, c7, c10, 1 @ clean D entry
  272. cmp r1, r0
  273. subne r1, r1, #1 @ top address is inclusive
  274. orr r3, r2, #PSR_I_BIT
  275. msr cpsr_c, r3 @ disable interrupts
  276. mcr p15, 5, r0, c15, c14, 0 @ D inv range start
  277. mcr p15, 5, r1, c15, c14, 1 @ D inv range top
  278. msr cpsr_c, r2 @ restore interrupts
  279. ret lr
  280. /*
  281. * dma_clean_range(start, end)
  282. *
  283. * Clean the specified virtual address range.
  284. *
  285. * - start - virtual start address
  286. * - end - virtual end address
  287. *
  288. * (same as v4wb)
  289. */
  290. .align 5
  291. feroceon_dma_clean_range:
  292. bic r0, r0, #CACHE_DLINESIZE - 1
  293. 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
  294. add r0, r0, #CACHE_DLINESIZE
  295. cmp r0, r1
  296. blo 1b
  297. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  298. ret lr
  299. .align 5
  300. feroceon_range_dma_clean_range:
  301. mrs r2, cpsr
  302. cmp r1, r0
  303. subne r1, r1, #1 @ top address is inclusive
  304. orr r3, r2, #PSR_I_BIT
  305. msr cpsr_c, r3 @ disable interrupts
  306. mcr p15, 5, r0, c15, c13, 0 @ D clean range start
  307. mcr p15, 5, r1, c15, c13, 1 @ D clean range top
  308. msr cpsr_c, r2 @ restore interrupts
  309. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  310. ret lr
  311. /*
  312. * dma_flush_range(start, end)
  313. *
  314. * Clean and invalidate the specified virtual address range.
  315. *
  316. * - start - virtual start address
  317. * - end - virtual end address
  318. */
  319. .align 5
  320. ENTRY(feroceon_dma_flush_range)
  321. bic r0, r0, #CACHE_DLINESIZE - 1
  322. 1: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry
  323. add r0, r0, #CACHE_DLINESIZE
  324. cmp r0, r1
  325. blo 1b
  326. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  327. ret lr
  328. .align 5
  329. ENTRY(feroceon_range_dma_flush_range)
  330. mrs r2, cpsr
  331. cmp r1, r0
  332. subne r1, r1, #1 @ top address is inclusive
  333. orr r3, r2, #PSR_I_BIT
  334. msr cpsr_c, r3 @ disable interrupts
  335. mcr p15, 5, r0, c15, c15, 0 @ D clean/inv range start
  336. mcr p15, 5, r1, c15, c15, 1 @ D clean/inv range top
  337. msr cpsr_c, r2 @ restore interrupts
  338. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  339. ret lr
  340. /*
  341. * dma_map_area(start, size, dir)
  342. * - start - kernel virtual start address
  343. * - size - size of region
  344. * - dir - DMA direction
  345. */
  346. ENTRY(feroceon_dma_map_area)
  347. add r1, r1, r0
  348. cmp r2, #DMA_TO_DEVICE
  349. beq feroceon_dma_clean_range
  350. bcs feroceon_dma_inv_range
  351. b feroceon_dma_flush_range
  352. ENDPROC(feroceon_dma_map_area)
  353. /*
  354. * dma_map_area(start, size, dir)
  355. * - start - kernel virtual start address
  356. * - size - size of region
  357. * - dir - DMA direction
  358. */
  359. ENTRY(feroceon_range_dma_map_area)
  360. add r1, r1, r0
  361. cmp r2, #DMA_TO_DEVICE
  362. beq feroceon_range_dma_clean_range
  363. bcs feroceon_range_dma_inv_range
  364. b feroceon_range_dma_flush_range
  365. ENDPROC(feroceon_range_dma_map_area)
  366. /*
  367. * dma_unmap_area(start, size, dir)
  368. * - start - kernel virtual start address
  369. * - size - size of region
  370. * - dir - DMA direction
  371. */
  372. ENTRY(feroceon_dma_unmap_area)
  373. ret lr
  374. ENDPROC(feroceon_dma_unmap_area)
  375. .globl feroceon_flush_kern_cache_louis
  376. .equ feroceon_flush_kern_cache_louis, feroceon_flush_kern_cache_all
  377. @ define struct cpu_cache_fns (see <asm/cacheflush.h> and proc-macros.S)
  378. define_cache_functions feroceon
  379. .macro range_alias basename
  380. .globl feroceon_range_\basename
  381. .type feroceon_range_\basename , %function
  382. .equ feroceon_range_\basename , feroceon_\basename
  383. .endm
  384. /*
  385. * Most of the cache functions are unchanged for this case.
  386. * Export suitable alias symbols for the unchanged functions:
  387. */
  388. range_alias flush_icache_all
  389. range_alias flush_user_cache_all
  390. range_alias flush_kern_cache_all
  391. range_alias flush_kern_cache_louis
  392. range_alias flush_user_cache_range
  393. range_alias coherent_kern_range
  394. range_alias coherent_user_range
  395. range_alias dma_unmap_area
  396. define_cache_functions feroceon_range
  397. .align 5
  398. ENTRY(cpu_feroceon_dcache_clean_area)
  399. #if defined(CONFIG_CACHE_FEROCEON_L2) && \
  400. !defined(CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH)
  401. mov r2, r0
  402. mov r3, r1
  403. #endif
  404. 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
  405. add r0, r0, #CACHE_DLINESIZE
  406. subs r1, r1, #CACHE_DLINESIZE
  407. bhi 1b
  408. #if defined(CONFIG_CACHE_FEROCEON_L2) && \
  409. !defined(CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH)
  410. 1: mcr p15, 1, r2, c15, c9, 1 @ clean L2 entry
  411. add r2, r2, #CACHE_DLINESIZE
  412. subs r3, r3, #CACHE_DLINESIZE
  413. bhi 1b
  414. #endif
  415. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  416. ret lr
  417. /* =============================== PageTable ============================== */
  418. /*
  419. * cpu_feroceon_switch_mm(pgd)
  420. *
  421. * Set the translation base pointer to be as described by pgd.
  422. *
  423. * pgd: new page tables
  424. */
  425. .align 5
  426. ENTRY(cpu_feroceon_switch_mm)
  427. #ifdef CONFIG_MMU
  428. /*
  429. * Note: we wish to call __flush_whole_cache but we need to preserve
  430. * lr to do so. The only way without touching main memory is to
  431. * use r2 which is normally used to test the VM_EXEC flag, and
  432. * compensate locally for the skipped ops if it is not set.
  433. */
  434. mov r2, lr @ abuse r2 to preserve lr
  435. bl __flush_whole_cache
  436. @ if r2 contains the VM_EXEC bit then the next 2 ops are done already
  437. tst r2, #VM_EXEC
  438. mcreq p15, 0, ip, c7, c5, 0 @ invalidate I cache
  439. mcreq p15, 0, ip, c7, c10, 4 @ drain WB
  440. mcr p15, 0, r0, c2, c0, 0 @ load page table pointer
  441. mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs
  442. ret r2
  443. #else
  444. ret lr
  445. #endif
  446. /*
  447. * cpu_feroceon_set_pte_ext(ptep, pte, ext)
  448. *
  449. * Set a PTE and flush it out
  450. */
  451. .align 5
  452. ENTRY(cpu_feroceon_set_pte_ext)
  453. #ifdef CONFIG_MMU
  454. armv3_set_pte_ext wc_disable=0
  455. mov r0, r0
  456. mcr p15, 0, r0, c7, c10, 1 @ clean D entry
  457. #if defined(CONFIG_CACHE_FEROCEON_L2) && \
  458. !defined(CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH)
  459. mcr p15, 1, r0, c15, c9, 1 @ clean L2 entry
  460. #endif
  461. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  462. #endif
  463. ret lr
  464. /* Suspend/resume support: taken from arch/arm/mm/proc-arm926.S */
  465. .globl cpu_feroceon_suspend_size
  466. .equ cpu_feroceon_suspend_size, 4 * 3
  467. #ifdef CONFIG_ARM_CPU_SUSPEND
  468. ENTRY(cpu_feroceon_do_suspend)
  469. stmfd sp!, {r4 - r6, lr}
  470. mrc p15, 0, r4, c13, c0, 0 @ PID
  471. mrc p15, 0, r5, c3, c0, 0 @ Domain ID
  472. mrc p15, 0, r6, c1, c0, 0 @ Control register
  473. stmia r0, {r4 - r6}
  474. ldmfd sp!, {r4 - r6, pc}
  475. ENDPROC(cpu_feroceon_do_suspend)
  476. ENTRY(cpu_feroceon_do_resume)
  477. mov ip, #0
  478. mcr p15, 0, ip, c8, c7, 0 @ invalidate I+D TLBs
  479. mcr p15, 0, ip, c7, c7, 0 @ invalidate I+D caches
  480. ldmia r0, {r4 - r6}
  481. mcr p15, 0, r4, c13, c0, 0 @ PID
  482. mcr p15, 0, r5, c3, c0, 0 @ Domain ID
  483. mcr p15, 0, r1, c2, c0, 0 @ TTB address
  484. mov r0, r6 @ control register
  485. b cpu_resume_mmu
  486. ENDPROC(cpu_feroceon_do_resume)
  487. #endif
  488. .type __feroceon_setup, #function
  489. __feroceon_setup:
  490. mov r0, #0
  491. mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4
  492. mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4
  493. #ifdef CONFIG_MMU
  494. mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4
  495. #endif
  496. adr r5, feroceon_crval
  497. ldmia r5, {r5, r6}
  498. mrc p15, 0, r0, c1, c0 @ get control register v4
  499. bic r0, r0, r5
  500. orr r0, r0, r6
  501. ret lr
  502. .size __feroceon_setup, . - __feroceon_setup
  503. /*
  504. * B
  505. * R P
  506. * .RVI UFRS BLDP WCAM
  507. * .011 .001 ..11 0101
  508. *
  509. */
  510. .type feroceon_crval, #object
  511. feroceon_crval:
  512. crval clear=0x0000773f, mmuset=0x00003135, ucset=0x00001134
  513. __INITDATA
  514. @ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
  515. define_processor_functions feroceon, dabort=v5t_early_abort, pabort=legacy_pabort
  516. .section ".rodata"
  517. string cpu_arch_name, "armv5te"
  518. string cpu_elf_name, "v5"
  519. string cpu_feroceon_name, "Feroceon"
  520. string cpu_88fr531_name, "Feroceon 88FR531-vd"
  521. string cpu_88fr571_name, "Feroceon 88FR571-vd"
  522. string cpu_88fr131_name, "Feroceon 88FR131"
  523. .align
  524. .section ".proc.info.init", "a"
  525. .macro feroceon_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cache:req
  526. .type __\name\()_proc_info,#object
  527. __\name\()_proc_info:
  528. .long \cpu_val
  529. .long \cpu_mask
  530. .long PMD_TYPE_SECT | \
  531. PMD_SECT_BUFFERABLE | \
  532. PMD_SECT_CACHEABLE | \
  533. PMD_BIT4 | \
  534. PMD_SECT_AP_WRITE | \
  535. PMD_SECT_AP_READ
  536. .long PMD_TYPE_SECT | \
  537. PMD_BIT4 | \
  538. PMD_SECT_AP_WRITE | \
  539. PMD_SECT_AP_READ
  540. initfn __feroceon_setup, __\name\()_proc_info
  541. .long cpu_arch_name
  542. .long cpu_elf_name
  543. .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
  544. .long \cpu_name
  545. .long feroceon_processor_functions
  546. .long v4wbi_tlb_fns
  547. .long feroceon_user_fns
  548. .long \cache
  549. .size __\name\()_proc_info, . - __\name\()_proc_info
  550. .endm
  551. #ifdef CONFIG_CPU_FEROCEON_OLD_ID
  552. feroceon_proc_info feroceon_old_id, 0x41009260, 0xff00fff0, \
  553. cpu_name=cpu_feroceon_name, cache=feroceon_cache_fns
  554. #endif
  555. feroceon_proc_info 88fr531, 0x56055310, 0xfffffff0, cpu_88fr531_name, \
  556. cache=feroceon_cache_fns
  557. feroceon_proc_info 88fr571, 0x56155710, 0xfffffff0, cpu_88fr571_name, \
  558. cache=feroceon_range_cache_fns
  559. feroceon_proc_info 88fr131, 0x56251310, 0xfffffff0, cpu_88fr131_name, \
  560. cache=feroceon_range_cache_fns