proc-feroceon.S 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  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. #include <linux/linkage.h>
  22. #include <linux/init.h>
  23. #include <asm/assembler.h>
  24. #include <asm/hwcap.h>
  25. #include <asm/pgtable-hwdef.h>
  26. #include <asm/pgtable.h>
  27. #include <asm/page.h>
  28. #include <asm/ptrace.h>
  29. #include "proc-macros.S"
  30. /*
  31. * This is the maximum size of an area which will be invalidated
  32. * using the single invalidate entry instructions. Anything larger
  33. * than this, and we go for the whole cache.
  34. *
  35. * This value should be chosen such that we choose the cheapest
  36. * alternative.
  37. */
  38. #define CACHE_DLIMIT 16384
  39. /*
  40. * the cache line size of the I and D cache
  41. */
  42. #define CACHE_DLINESIZE 32
  43. .bss
  44. .align 3
  45. __cache_params_loc:
  46. .space 8
  47. .text
  48. __cache_params:
  49. .word __cache_params_loc
  50. /*
  51. * cpu_feroceon_proc_init()
  52. */
  53. ENTRY(cpu_feroceon_proc_init)
  54. mrc p15, 0, r0, c0, c0, 1 @ read cache type register
  55. ldr r1, __cache_params
  56. mov r2, #(16 << 5)
  57. tst r0, #(1 << 16) @ get way
  58. mov r0, r0, lsr #18 @ get cache size order
  59. movne r3, #((4 - 1) << 30) @ 4-way
  60. and r0, r0, #0xf
  61. moveq r3, #0 @ 1-way
  62. mov r2, r2, lsl r0 @ actual cache size
  63. movne r2, r2, lsr #2 @ turned into # of sets
  64. sub r2, r2, #(1 << 5)
  65. stmia r1, {r2, r3}
  66. mov pc, lr
  67. /*
  68. * cpu_feroceon_proc_fin()
  69. */
  70. ENTRY(cpu_feroceon_proc_fin)
  71. #if defined(CONFIG_CACHE_FEROCEON_L2) && \
  72. !defined(CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH)
  73. mov r0, #0
  74. mcr p15, 1, r0, c15, c9, 0 @ clean L2
  75. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  76. #endif
  77. mrc p15, 0, r0, c1, c0, 0 @ ctrl register
  78. bic r0, r0, #0x1000 @ ...i............
  79. bic r0, r0, #0x000e @ ............wca.
  80. mcr p15, 0, r0, c1, c0, 0 @ disable caches
  81. mov pc, lr
  82. /*
  83. * cpu_feroceon_reset(loc)
  84. *
  85. * Perform a soft reset of the system. Put the CPU into the
  86. * same state as it would be if it had been reset, and branch
  87. * to what would be the reset vector.
  88. *
  89. * loc: location to jump to for soft reset
  90. */
  91. .align 5
  92. ENTRY(cpu_feroceon_reset)
  93. mov ip, #0
  94. mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
  95. mcr p15, 0, ip, c7, c10, 4 @ drain WB
  96. #ifdef CONFIG_MMU
  97. mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs
  98. #endif
  99. mrc p15, 0, ip, c1, c0, 0 @ ctrl register
  100. bic ip, ip, #0x000f @ ............wcam
  101. bic ip, ip, #0x1100 @ ...i...s........
  102. mcr p15, 0, ip, c1, c0, 0 @ ctrl register
  103. mov pc, r0
  104. /*
  105. * cpu_feroceon_do_idle()
  106. *
  107. * Called with IRQs disabled
  108. */
  109. .align 5
  110. ENTRY(cpu_feroceon_do_idle)
  111. mov r0, #0
  112. mcr p15, 0, r0, c7, c10, 4 @ Drain write buffer
  113. mcr p15, 0, r0, c7, c0, 4 @ Wait for interrupt
  114. mov pc, lr
  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. mov pc, 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. mov pc, 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 pc, lr
  205. /*
  206. * flush_kern_dcache_area(void *addr, size_t size)
  207. *
  208. * Ensure no D cache aliasing occurs, either with itself or
  209. * the I cache
  210. *
  211. * - addr - kernel address
  212. * - size - region size
  213. */
  214. .align 5
  215. ENTRY(feroceon_flush_kern_dcache_area)
  216. add r1, r0, r1
  217. 1: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry
  218. add r0, r0, #CACHE_DLINESIZE
  219. cmp r0, r1
  220. blo 1b
  221. mov r0, #0
  222. mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
  223. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  224. mov pc, lr
  225. .align 5
  226. ENTRY(feroceon_range_flush_kern_dcache_area)
  227. mrs r2, cpsr
  228. add r1, r0, #PAGE_SZ - CACHE_DLINESIZE @ top addr is inclusive
  229. orr r3, r2, #PSR_I_BIT
  230. msr cpsr_c, r3 @ disable interrupts
  231. mcr p15, 5, r0, c15, c15, 0 @ D clean/inv range start
  232. mcr p15, 5, r1, c15, c15, 1 @ D clean/inv range top
  233. msr cpsr_c, r2 @ restore interrupts
  234. mov r0, #0
  235. mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
  236. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  237. mov pc, lr
  238. /*
  239. * dma_inv_range(start, end)
  240. *
  241. * Invalidate (discard) the specified virtual address range.
  242. * May not write back any entries. If 'start' or 'end'
  243. * are not cache line aligned, those lines must be written
  244. * back.
  245. *
  246. * - start - virtual start address
  247. * - end - virtual end address
  248. *
  249. * (same as v4wb)
  250. */
  251. .align 5
  252. feroceon_dma_inv_range:
  253. tst r0, #CACHE_DLINESIZE - 1
  254. bic r0, r0, #CACHE_DLINESIZE - 1
  255. mcrne p15, 0, r0, c7, c10, 1 @ clean D entry
  256. tst r1, #CACHE_DLINESIZE - 1
  257. mcrne p15, 0, r1, c7, c10, 1 @ clean D entry
  258. 1: mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry
  259. add r0, r0, #CACHE_DLINESIZE
  260. cmp r0, r1
  261. blo 1b
  262. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  263. mov pc, lr
  264. .align 5
  265. feroceon_range_dma_inv_range:
  266. mrs r2, cpsr
  267. tst r0, #CACHE_DLINESIZE - 1
  268. mcrne p15, 0, r0, c7, c10, 1 @ clean D entry
  269. tst r1, #CACHE_DLINESIZE - 1
  270. mcrne p15, 0, r1, c7, c10, 1 @ clean D entry
  271. cmp r1, r0
  272. subne r1, r1, #1 @ top address is inclusive
  273. orr r3, r2, #PSR_I_BIT
  274. msr cpsr_c, r3 @ disable interrupts
  275. mcr p15, 5, r0, c15, c14, 0 @ D inv range start
  276. mcr p15, 5, r1, c15, c14, 1 @ D inv range top
  277. msr cpsr_c, r2 @ restore interrupts
  278. mov pc, lr
  279. /*
  280. * dma_clean_range(start, end)
  281. *
  282. * Clean the specified virtual address range.
  283. *
  284. * - start - virtual start address
  285. * - end - virtual end address
  286. *
  287. * (same as v4wb)
  288. */
  289. .align 5
  290. feroceon_dma_clean_range:
  291. bic r0, r0, #CACHE_DLINESIZE - 1
  292. 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
  293. add r0, r0, #CACHE_DLINESIZE
  294. cmp r0, r1
  295. blo 1b
  296. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  297. mov pc, lr
  298. .align 5
  299. feroceon_range_dma_clean_range:
  300. mrs r2, cpsr
  301. cmp r1, r0
  302. subne r1, r1, #1 @ top address is inclusive
  303. orr r3, r2, #PSR_I_BIT
  304. msr cpsr_c, r3 @ disable interrupts
  305. mcr p15, 5, r0, c15, c13, 0 @ D clean range start
  306. mcr p15, 5, r1, c15, c13, 1 @ D clean range top
  307. msr cpsr_c, r2 @ restore interrupts
  308. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  309. mov pc, lr
  310. /*
  311. * dma_flush_range(start, end)
  312. *
  313. * Clean and invalidate the specified virtual address range.
  314. *
  315. * - start - virtual start address
  316. * - end - virtual end address
  317. */
  318. .align 5
  319. ENTRY(feroceon_dma_flush_range)
  320. bic r0, r0, #CACHE_DLINESIZE - 1
  321. 1: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry
  322. add r0, r0, #CACHE_DLINESIZE
  323. cmp r0, r1
  324. blo 1b
  325. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  326. mov pc, lr
  327. .align 5
  328. ENTRY(feroceon_range_dma_flush_range)
  329. mrs r2, cpsr
  330. cmp r1, r0
  331. subne r1, r1, #1 @ top address is inclusive
  332. orr r3, r2, #PSR_I_BIT
  333. msr cpsr_c, r3 @ disable interrupts
  334. mcr p15, 5, r0, c15, c15, 0 @ D clean/inv range start
  335. mcr p15, 5, r1, c15, c15, 1 @ D clean/inv range top
  336. msr cpsr_c, r2 @ restore interrupts
  337. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  338. mov pc, lr
  339. /*
  340. * dma_map_area(start, size, dir)
  341. * - start - kernel virtual start address
  342. * - size - size of region
  343. * - dir - DMA direction
  344. */
  345. ENTRY(feroceon_dma_map_area)
  346. add r1, r1, r0
  347. cmp r2, #DMA_TO_DEVICE
  348. beq feroceon_dma_clean_range
  349. bcs feroceon_dma_inv_range
  350. b feroceon_dma_flush_range
  351. ENDPROC(feroceon_dma_map_area)
  352. /*
  353. * dma_map_area(start, size, dir)
  354. * - start - kernel virtual start address
  355. * - size - size of region
  356. * - dir - DMA direction
  357. */
  358. ENTRY(feroceon_range_dma_map_area)
  359. add r1, r1, r0
  360. cmp r2, #DMA_TO_DEVICE
  361. beq feroceon_range_dma_clean_range
  362. bcs feroceon_range_dma_inv_range
  363. b feroceon_range_dma_flush_range
  364. ENDPROC(feroceon_range_dma_map_area)
  365. /*
  366. * dma_unmap_area(start, size, dir)
  367. * - start - kernel virtual start address
  368. * - size - size of region
  369. * - dir - DMA direction
  370. */
  371. ENTRY(feroceon_dma_unmap_area)
  372. mov pc, lr
  373. ENDPROC(feroceon_dma_unmap_area)
  374. ENTRY(feroceon_cache_fns)
  375. .long feroceon_flush_kern_cache_all
  376. .long feroceon_flush_user_cache_all
  377. .long feroceon_flush_user_cache_range
  378. .long feroceon_coherent_kern_range
  379. .long feroceon_coherent_user_range
  380. .long feroceon_flush_kern_dcache_area
  381. .long feroceon_dma_map_area
  382. .long feroceon_dma_unmap_area
  383. .long feroceon_dma_flush_range
  384. ENTRY(feroceon_range_cache_fns)
  385. .long feroceon_flush_kern_cache_all
  386. .long feroceon_flush_user_cache_all
  387. .long feroceon_flush_user_cache_range
  388. .long feroceon_coherent_kern_range
  389. .long feroceon_coherent_user_range
  390. .long feroceon_range_flush_kern_dcache_area
  391. .long feroceon_range_dma_map_area
  392. .long feroceon_dma_unmap_area
  393. .long feroceon_range_dma_flush_range
  394. .align 5
  395. ENTRY(cpu_feroceon_dcache_clean_area)
  396. #if defined(CONFIG_CACHE_FEROCEON_L2) && \
  397. !defined(CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH)
  398. mov r2, r0
  399. mov r3, r1
  400. #endif
  401. 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
  402. add r0, r0, #CACHE_DLINESIZE
  403. subs r1, r1, #CACHE_DLINESIZE
  404. bhi 1b
  405. #if defined(CONFIG_CACHE_FEROCEON_L2) && \
  406. !defined(CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH)
  407. 1: mcr p15, 1, r2, c15, c9, 1 @ clean L2 entry
  408. add r2, r2, #CACHE_DLINESIZE
  409. subs r3, r3, #CACHE_DLINESIZE
  410. bhi 1b
  411. #endif
  412. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  413. mov pc, lr
  414. /* =============================== PageTable ============================== */
  415. /*
  416. * cpu_feroceon_switch_mm(pgd)
  417. *
  418. * Set the translation base pointer to be as described by pgd.
  419. *
  420. * pgd: new page tables
  421. */
  422. .align 5
  423. ENTRY(cpu_feroceon_switch_mm)
  424. #ifdef CONFIG_MMU
  425. /*
  426. * Note: we wish to call __flush_whole_cache but we need to preserve
  427. * lr to do so. The only way without touching main memory is to
  428. * use r2 which is normally used to test the VM_EXEC flag, and
  429. * compensate locally for the skipped ops if it is not set.
  430. */
  431. mov r2, lr @ abuse r2 to preserve lr
  432. bl __flush_whole_cache
  433. @ if r2 contains the VM_EXEC bit then the next 2 ops are done already
  434. tst r2, #VM_EXEC
  435. mcreq p15, 0, ip, c7, c5, 0 @ invalidate I cache
  436. mcreq p15, 0, ip, c7, c10, 4 @ drain WB
  437. mcr p15, 0, r0, c2, c0, 0 @ load page table pointer
  438. mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs
  439. mov pc, r2
  440. #else
  441. mov pc, lr
  442. #endif
  443. /*
  444. * cpu_feroceon_set_pte_ext(ptep, pte, ext)
  445. *
  446. * Set a PTE and flush it out
  447. */
  448. .align 5
  449. ENTRY(cpu_feroceon_set_pte_ext)
  450. #ifdef CONFIG_MMU
  451. armv3_set_pte_ext wc_disable=0
  452. mov r0, r0
  453. mcr p15, 0, r0, c7, c10, 1 @ clean D entry
  454. #if defined(CONFIG_CACHE_FEROCEON_L2) && \
  455. !defined(CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH)
  456. mcr p15, 1, r0, c15, c9, 1 @ clean L2 entry
  457. #endif
  458. mcr p15, 0, r0, c7, c10, 4 @ drain WB
  459. #endif
  460. mov pc, lr
  461. __INIT
  462. .type __feroceon_setup, #function
  463. __feroceon_setup:
  464. mov r0, #0
  465. mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4
  466. mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4
  467. #ifdef CONFIG_MMU
  468. mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4
  469. #endif
  470. adr r5, feroceon_crval
  471. ldmia r5, {r5, r6}
  472. mrc p15, 0, r0, c1, c0 @ get control register v4
  473. bic r0, r0, r5
  474. orr r0, r0, r6
  475. mov pc, lr
  476. .size __feroceon_setup, . - __feroceon_setup
  477. /*
  478. * B
  479. * R P
  480. * .RVI UFRS BLDP WCAM
  481. * .011 .001 ..11 0101
  482. *
  483. */
  484. .type feroceon_crval, #object
  485. feroceon_crval:
  486. crval clear=0x0000773f, mmuset=0x00003135, ucset=0x00001134
  487. __INITDATA
  488. /*
  489. * Purpose : Function pointers used to access above functions - all calls
  490. * come through these
  491. */
  492. .type feroceon_processor_functions, #object
  493. feroceon_processor_functions:
  494. .word v5t_early_abort
  495. .word legacy_pabort
  496. .word cpu_feroceon_proc_init
  497. .word cpu_feroceon_proc_fin
  498. .word cpu_feroceon_reset
  499. .word cpu_feroceon_do_idle
  500. .word cpu_feroceon_dcache_clean_area
  501. .word cpu_feroceon_switch_mm
  502. .word cpu_feroceon_set_pte_ext
  503. .size feroceon_processor_functions, . - feroceon_processor_functions
  504. .section ".rodata"
  505. .type cpu_arch_name, #object
  506. cpu_arch_name:
  507. .asciz "armv5te"
  508. .size cpu_arch_name, . - cpu_arch_name
  509. .type cpu_elf_name, #object
  510. cpu_elf_name:
  511. .asciz "v5"
  512. .size cpu_elf_name, . - cpu_elf_name
  513. .type cpu_feroceon_name, #object
  514. cpu_feroceon_name:
  515. .asciz "Feroceon"
  516. .size cpu_feroceon_name, . - cpu_feroceon_name
  517. .type cpu_88fr531_name, #object
  518. cpu_88fr531_name:
  519. .asciz "Feroceon 88FR531-vd"
  520. .size cpu_88fr531_name, . - cpu_88fr531_name
  521. .type cpu_88fr571_name, #object
  522. cpu_88fr571_name:
  523. .asciz "Feroceon 88FR571-vd"
  524. .size cpu_88fr571_name, . - cpu_88fr571_name
  525. .type cpu_88fr131_name, #object
  526. cpu_88fr131_name:
  527. .asciz "Feroceon 88FR131"
  528. .size cpu_88fr131_name, . - cpu_88fr131_name
  529. .align
  530. .section ".proc.info.init", #alloc, #execinstr
  531. #ifdef CONFIG_CPU_FEROCEON_OLD_ID
  532. .type __feroceon_old_id_proc_info,#object
  533. __feroceon_old_id_proc_info:
  534. .long 0x41009260
  535. .long 0xff00fff0
  536. .long PMD_TYPE_SECT | \
  537. PMD_SECT_BUFFERABLE | \
  538. PMD_SECT_CACHEABLE | \
  539. PMD_BIT4 | \
  540. PMD_SECT_AP_WRITE | \
  541. PMD_SECT_AP_READ
  542. .long PMD_TYPE_SECT | \
  543. PMD_BIT4 | \
  544. PMD_SECT_AP_WRITE | \
  545. PMD_SECT_AP_READ
  546. b __feroceon_setup
  547. .long cpu_arch_name
  548. .long cpu_elf_name
  549. .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
  550. .long cpu_feroceon_name
  551. .long feroceon_processor_functions
  552. .long v4wbi_tlb_fns
  553. .long feroceon_user_fns
  554. .long feroceon_cache_fns
  555. .size __feroceon_old_id_proc_info, . - __feroceon_old_id_proc_info
  556. #endif
  557. .type __88fr531_proc_info,#object
  558. __88fr531_proc_info:
  559. .long 0x56055310
  560. .long 0xfffffff0
  561. .long PMD_TYPE_SECT | \
  562. PMD_SECT_BUFFERABLE | \
  563. PMD_SECT_CACHEABLE | \
  564. PMD_BIT4 | \
  565. PMD_SECT_AP_WRITE | \
  566. PMD_SECT_AP_READ
  567. .long PMD_TYPE_SECT | \
  568. PMD_BIT4 | \
  569. PMD_SECT_AP_WRITE | \
  570. PMD_SECT_AP_READ
  571. b __feroceon_setup
  572. .long cpu_arch_name
  573. .long cpu_elf_name
  574. .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
  575. .long cpu_88fr531_name
  576. .long feroceon_processor_functions
  577. .long v4wbi_tlb_fns
  578. .long feroceon_user_fns
  579. .long feroceon_cache_fns
  580. .size __88fr531_proc_info, . - __88fr531_proc_info
  581. .type __88fr571_proc_info,#object
  582. __88fr571_proc_info:
  583. .long 0x56155710
  584. .long 0xfffffff0
  585. .long PMD_TYPE_SECT | \
  586. PMD_SECT_BUFFERABLE | \
  587. PMD_SECT_CACHEABLE | \
  588. PMD_BIT4 | \
  589. PMD_SECT_AP_WRITE | \
  590. PMD_SECT_AP_READ
  591. .long PMD_TYPE_SECT | \
  592. PMD_BIT4 | \
  593. PMD_SECT_AP_WRITE | \
  594. PMD_SECT_AP_READ
  595. b __feroceon_setup
  596. .long cpu_arch_name
  597. .long cpu_elf_name
  598. .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
  599. .long cpu_88fr571_name
  600. .long feroceon_processor_functions
  601. .long v4wbi_tlb_fns
  602. .long feroceon_user_fns
  603. .long feroceon_range_cache_fns
  604. .size __88fr571_proc_info, . - __88fr571_proc_info
  605. .type __88fr131_proc_info,#object
  606. __88fr131_proc_info:
  607. .long 0x56251310
  608. .long 0xfffffff0
  609. .long PMD_TYPE_SECT | \
  610. PMD_SECT_BUFFERABLE | \
  611. PMD_SECT_CACHEABLE | \
  612. PMD_BIT4 | \
  613. PMD_SECT_AP_WRITE | \
  614. PMD_SECT_AP_READ
  615. .long PMD_TYPE_SECT | \
  616. PMD_BIT4 | \
  617. PMD_SECT_AP_WRITE | \
  618. PMD_SECT_AP_READ
  619. b __feroceon_setup
  620. .long cpu_arch_name
  621. .long cpu_elf_name
  622. .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
  623. .long cpu_88fr131_name
  624. .long feroceon_processor_functions
  625. .long v4wbi_tlb_fns
  626. .long feroceon_user_fns
  627. .long feroceon_range_cache_fns
  628. .size __88fr131_proc_info, . - __88fr131_proc_info