c-r4k.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:36k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * r4xx0.c: R4000 processor variant specific MMU/Cache routines.
  7.  *
  8.  * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
  9.  * Copyright (C) 1997, 1998, 1999, 2000 Ralf Baechle ralf@gnu.org
  10.  *
  11.  * To do:
  12.  *
  13.  *  - this code is a overbloated pig
  14.  *  - many of the bug workarounds are not efficient at all, but at
  15.  *    least they are functional ...
  16.  */
  17. #include <linux/config.h>
  18. #include <linux/init.h>
  19. #include <linux/kernel.h>
  20. #include <linux/sched.h>
  21. #include <linux/mm.h>
  22. #include <asm/bootinfo.h>
  23. #include <asm/cpu.h>
  24. #include <asm/bcache.h>
  25. #include <asm/io.h>
  26. #include <asm/page.h>
  27. #include <asm/pgtable.h>
  28. #include <asm/system.h>
  29. #include <asm/mmu_context.h>
  30. #include <asm/war.h>
  31. /* Primary cache parameters. */
  32. static int icache_size, dcache_size; /* Size in bytes */
  33. static int ic_lsize, dc_lsize;       /* LineSize in bytes */
  34. /* Secondary cache (if present) parameters. */
  35. static unsigned int scache_size, sc_lsize; /* Again, in bytes */
  36. #include <asm/cacheops.h>
  37. #include <asm/r4kcache.h>
  38. #undef DEBUG_CACHE
  39. /*
  40.  * Dummy cache handling routines for machines without boardcaches
  41.  */
  42. static void no_sc_noop(void) {}
  43. static struct bcache_ops no_sc_ops = {
  44. (void *)no_sc_noop, (void *)no_sc_noop,
  45. (void *)no_sc_noop, (void *)no_sc_noop
  46. };
  47. struct bcache_ops *bcops = &no_sc_ops;
  48. /*
  49.  * On processors with QED R4600 style two set assosicative cache
  50.  * this is the bit which selects the way in the cache for the
  51.  * indexed cachops.
  52.  */
  53. #define icache_waybit (icache_size >> 1)
  54. #define dcache_waybit (dcache_size >> 1)
  55. /*
  56.  * If you think for one second that this stuff coming up is a lot
  57.  * of bulky code eating too many kernel cache lines.  Think _again_.
  58.  *
  59.  * Consider:
  60.  * 1) Taken branches have a 3 cycle penalty on R4k
  61.  * 2) The branch itself is a real dead cycle on even R4600/R5000.
  62.  * 3) Only one of the following variants of each type is even used by
  63.  *    the kernel based upon the cache parameters we detect at boot time.
  64.  *
  65.  * QED.
  66.  */
  67. static inline void r4k_flush_cache_all_s16d16i16(void)
  68. {
  69. blast_dcache16(); blast_icache16(); blast_scache16();
  70. }
  71. static inline void r4k_flush_cache_all_s32d16i16(void)
  72. {
  73. blast_dcache16(); blast_icache16(); blast_scache32();
  74. }
  75. static inline void r4k_flush_cache_all_s64d16i16(void)
  76. {
  77. blast_dcache16(); blast_icache16(); blast_scache64();
  78. }
  79. static inline void r4k_flush_cache_all_s128d16i16(void)
  80. {
  81. blast_dcache16(); blast_icache16(); blast_scache128();
  82. }
  83. static inline void r4k_flush_cache_all_s32d32i32(void)
  84. {
  85. blast_dcache32(); blast_icache32(); blast_scache32();
  86. }
  87. static inline void r4k_flush_cache_all_s64d32i32(void)
  88. {
  89. blast_dcache32(); blast_icache32(); blast_scache64();
  90. }
  91. static inline void r4k_flush_cache_all_s128d32i32(void)
  92. {
  93. blast_dcache32(); blast_icache32(); blast_scache128();
  94. }
  95. static inline void r4k_flush_cache_all_d16i16(void)
  96. {
  97. blast_dcache16(); blast_icache16();
  98. }
  99. static inline void r4k_flush_cache_all_d32i32(void)
  100. {
  101. blast_dcache32(); blast_icache32();
  102. }
  103. static void
  104. r4k_flush_cache_range_s16d16i16(struct mm_struct *mm,
  105.                                 unsigned long start,
  106.                                 unsigned long end)
  107. {
  108. struct vm_area_struct *vma;
  109. if (mm->context == 0)
  110. return;
  111. start &= PAGE_MASK;
  112. #ifdef DEBUG_CACHE
  113. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  114. #endif
  115. vma = find_vma(mm, start);
  116. if (vma) {
  117. if (mm->context != current->active_mm->context) {
  118. r4k_flush_cache_all_s16d16i16();
  119. } else {
  120. pgd_t *pgd;
  121. pmd_t *pmd;
  122. pte_t *pte;
  123. while (start < end) {
  124. pgd = pgd_offset(mm, start);
  125. pmd = pmd_offset(pgd, start);
  126. pte = pte_offset(pmd, start);
  127. if(pte_val(*pte) & _PAGE_VALID)
  128. blast_scache16_page(start);
  129. start += PAGE_SIZE;
  130. }
  131. }
  132. }
  133. }
  134. static void
  135. r4k_flush_cache_range_s32d16i16(struct mm_struct *mm,
  136.                                 unsigned long start,
  137.                                 unsigned long end)
  138. {
  139. struct vm_area_struct *vma;
  140. if (mm->context == 0)
  141. return;
  142. start &= PAGE_MASK;
  143. #ifdef DEBUG_CACHE
  144. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  145. #endif
  146. vma = find_vma(mm, start);
  147. if (vma) {
  148. if (mm->context != current->active_mm->context) {
  149. r4k_flush_cache_all_s32d16i16();
  150. } else {
  151. pgd_t *pgd;
  152. pmd_t *pmd;
  153. pte_t *pte;
  154. while(start < end) {
  155. pgd = pgd_offset(mm, start);
  156. pmd = pmd_offset(pgd, start);
  157. pte = pte_offset(pmd, start);
  158. if(pte_val(*pte) & _PAGE_VALID)
  159. blast_scache32_page(start);
  160. start += PAGE_SIZE;
  161. }
  162. }
  163. }
  164. }
  165. static void r4k_flush_cache_range_s64d16i16(struct mm_struct *mm,
  166.     unsigned long start,
  167.     unsigned long end)
  168. {
  169. struct vm_area_struct *vma;
  170. if (mm->context == 0)
  171. return;
  172. start &= PAGE_MASK;
  173. #ifdef DEBUG_CACHE
  174. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  175. #endif
  176. vma = find_vma(mm, start);
  177. if(vma) {
  178. if (mm->context != current->active_mm->context) {
  179. r4k_flush_cache_all_s64d16i16();
  180. } else {
  181. pgd_t *pgd;
  182. pmd_t *pmd;
  183. pte_t *pte;
  184. while(start < end) {
  185. pgd = pgd_offset(mm, start);
  186. pmd = pmd_offset(pgd, start);
  187. pte = pte_offset(pmd, start);
  188. if(pte_val(*pte) & _PAGE_VALID)
  189. blast_scache64_page(start);
  190. start += PAGE_SIZE;
  191. }
  192. }
  193. }
  194. }
  195. static void r4k_flush_cache_range_s128d16i16(struct mm_struct *mm,
  196.      unsigned long start,
  197.      unsigned long end)
  198. {
  199. struct vm_area_struct *vma;
  200. if (mm->context == 0)
  201. return;
  202. start &= PAGE_MASK;
  203. #ifdef DEBUG_CACHE
  204. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  205. #endif
  206. vma = find_vma(mm, start);
  207. if (vma) {
  208. if (mm->context != current->active_mm->context) {
  209. r4k_flush_cache_all_s128d16i16();
  210. } else {
  211. pgd_t *pgd;
  212. pmd_t *pmd;
  213. pte_t *pte;
  214. while(start < end) {
  215. pgd = pgd_offset(mm, start);
  216. pmd = pmd_offset(pgd, start);
  217. pte = pte_offset(pmd, start);
  218. if(pte_val(*pte) & _PAGE_VALID)
  219. blast_scache128_page(start);
  220. start += PAGE_SIZE;
  221. }
  222. }
  223. }
  224. }
  225. static void r4k_flush_cache_range_s32d32i32(struct mm_struct *mm,
  226.     unsigned long start,
  227.     unsigned long end)
  228. {
  229. struct vm_area_struct *vma;
  230. if (mm->context == 0)
  231. return;
  232. start &= PAGE_MASK;
  233. #ifdef DEBUG_CACHE
  234. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  235. #endif
  236. vma = find_vma(mm, start);
  237. if (vma) {
  238. if (mm->context != current->active_mm->context) {
  239. r4k_flush_cache_all_s32d32i32();
  240. } else {
  241. pgd_t *pgd;
  242. pmd_t *pmd;
  243. pte_t *pte;
  244. while(start < end) {
  245. pgd = pgd_offset(mm, start);
  246. pmd = pmd_offset(pgd, start);
  247. pte = pte_offset(pmd, start);
  248. if(pte_val(*pte) & _PAGE_VALID)
  249. blast_scache32_page(start);
  250. start += PAGE_SIZE;
  251. }
  252. }
  253. }
  254. }
  255. static void r4k_flush_cache_range_s64d32i32(struct mm_struct *mm,
  256.     unsigned long start,
  257.     unsigned long end)
  258. {
  259. struct vm_area_struct *vma;
  260. if (mm->context == 0)
  261. return;
  262. start &= PAGE_MASK;
  263. #ifdef DEBUG_CACHE
  264. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  265. #endif
  266. vma = find_vma(mm, start);
  267. if (vma) {
  268. if (mm->context != current->active_mm->context) {
  269. r4k_flush_cache_all_s64d32i32();
  270. } else {
  271. pgd_t *pgd;
  272. pmd_t *pmd;
  273. pte_t *pte;
  274. while(start < end) {
  275. pgd = pgd_offset(mm, start);
  276. pmd = pmd_offset(pgd, start);
  277. pte = pte_offset(pmd, start);
  278. if(pte_val(*pte) & _PAGE_VALID)
  279. blast_scache64_page(start);
  280. start += PAGE_SIZE;
  281. }
  282. }
  283. }
  284. }
  285. static void r4k_flush_cache_range_s128d32i32(struct mm_struct *mm,
  286.      unsigned long start,
  287.      unsigned long end)
  288. {
  289. struct vm_area_struct *vma;
  290. if (mm->context == 0)
  291. return;
  292. start &= PAGE_MASK;
  293. #ifdef DEBUG_CACHE
  294. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  295. #endif
  296. vma = find_vma(mm, start);
  297. if (vma) {
  298. if (mm->context != current->active_mm->context) {
  299. r4k_flush_cache_all_s128d32i32();
  300. } else {
  301. pgd_t *pgd;
  302. pmd_t *pmd;
  303. pte_t *pte;
  304. while(start < end) {
  305. pgd = pgd_offset(mm, start);
  306. pmd = pmd_offset(pgd, start);
  307. pte = pte_offset(pmd, start);
  308. if(pte_val(*pte) & _PAGE_VALID)
  309. blast_scache128_page(start);
  310. start += PAGE_SIZE;
  311. }
  312. }
  313. }
  314. }
  315. static void r4k_flush_cache_range_d16i16(struct mm_struct *mm,
  316.  unsigned long start,
  317.  unsigned long end)
  318. {
  319. if (mm->context != 0) {
  320. #ifdef DEBUG_CACHE
  321. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  322. #endif
  323. blast_dcache16(); blast_icache16();
  324. }
  325. }
  326. static void r4k_flush_cache_range_d32i32(struct mm_struct *mm,
  327.  unsigned long start,
  328.  unsigned long end)
  329. {
  330. if (mm->context != 0) {
  331. #ifdef DEBUG_CACHE
  332. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  333. #endif
  334. blast_dcache32(); blast_icache32();
  335. }
  336. }
  337. /*
  338.  * On architectures like the Sparc, we could get rid of lines in
  339.  * the cache created only by a certain context, but on the MIPS
  340.  * (and actually certain Sparc's) we cannot.
  341.  */
  342. static void r4k_flush_cache_mm_s16d16i16(struct mm_struct *mm)
  343. {
  344. if (mm->context != 0) {
  345. #ifdef DEBUG_CACHE
  346. printk("cmm[%d]", (int)mm->context);
  347. #endif
  348. r4k_flush_cache_all_s16d16i16();
  349. }
  350. }
  351. static void r4k_flush_cache_mm_s32d16i16(struct mm_struct *mm)
  352. {
  353. if (mm->context != 0) {
  354. #ifdef DEBUG_CACHE
  355. printk("cmm[%d]", (int)mm->context);
  356. #endif
  357. r4k_flush_cache_all_s32d16i16();
  358. }
  359. }
  360. static void r4k_flush_cache_mm_s64d16i16(struct mm_struct *mm)
  361. {
  362. if (mm->context != 0) {
  363. #ifdef DEBUG_CACHE
  364. printk("cmm[%d]", (int)mm->context);
  365. #endif
  366. r4k_flush_cache_all_s64d16i16();
  367. }
  368. }
  369. static void r4k_flush_cache_mm_s128d16i16(struct mm_struct *mm)
  370. {
  371. if (mm->context != 0) {
  372. #ifdef DEBUG_CACHE
  373. printk("cmm[%d]", (int)mm->context);
  374. #endif
  375. r4k_flush_cache_all_s128d16i16();
  376. }
  377. }
  378. static void r4k_flush_cache_mm_s32d32i32(struct mm_struct *mm)
  379. {
  380. if (mm->context != 0) {
  381. #ifdef DEBUG_CACHE
  382. printk("cmm[%d]", (int)mm->context);
  383. #endif
  384. r4k_flush_cache_all_s32d32i32();
  385. }
  386. }
  387. static void r4k_flush_cache_mm_s64d32i32(struct mm_struct *mm)
  388. {
  389. if (mm->context != 0) {
  390. #ifdef DEBUG_CACHE
  391. printk("cmm[%d]", (int)mm->context);
  392. #endif
  393. r4k_flush_cache_all_s64d32i32();
  394. }
  395. }
  396. static void r4k_flush_cache_mm_s128d32i32(struct mm_struct *mm)
  397. {
  398. if (mm->context != 0) {
  399. #ifdef DEBUG_CACHE
  400. printk("cmm[%d]", (int)mm->context);
  401. #endif
  402. r4k_flush_cache_all_s128d32i32();
  403. }
  404. }
  405. static void r4k_flush_cache_mm_d16i16(struct mm_struct *mm)
  406. {
  407. if (mm->context != 0) {
  408. #ifdef DEBUG_CACHE
  409. printk("cmm[%d]", (int)mm->context);
  410. #endif
  411. r4k_flush_cache_all_d16i16();
  412. }
  413. }
  414. static void r4k_flush_cache_mm_d32i32(struct mm_struct *mm)
  415. {
  416. if (mm->context != 0) {
  417. #ifdef DEBUG_CACHE
  418. printk("cmm[%d]", (int)mm->context);
  419. #endif
  420. r4k_flush_cache_all_d32i32();
  421. }
  422. }
  423. static void r4k_flush_cache_page_s16d16i16(struct vm_area_struct *vma,
  424.    unsigned long page)
  425. {
  426. struct mm_struct *mm = vma->vm_mm;
  427. pgd_t *pgdp;
  428. pmd_t *pmdp;
  429. pte_t *ptep;
  430. /*
  431.  * If ownes no valid ASID yet, cannot possibly have gotten
  432.  * this page into the cache.
  433.  */
  434. if (mm->context == 0)
  435. return;
  436. #ifdef DEBUG_CACHE
  437. printk("cpage[%d,%08lx]", (int)mm->context, page);
  438. #endif
  439. page &= PAGE_MASK;
  440. pgdp = pgd_offset(mm, page);
  441. pmdp = pmd_offset(pgdp, page);
  442. ptep = pte_offset(pmdp, page);
  443. /*
  444.  * If the page isn't marked valid, the page cannot possibly be
  445.  * in the cache.
  446.  */
  447. if (!(pte_val(*ptep) & _PAGE_VALID))
  448. goto out;
  449. /*
  450.  * Doing flushes for another ASID than the current one is
  451.  * too difficult since stupid R4k caches do a TLB translation
  452.  * for every cache flush operation.  So we do indexed flushes
  453.  * in that case, which doesn't overly flush the cache too much.
  454.  */
  455. if (mm->context != current->active_mm->context) {
  456. /*
  457.  * Do indexed flush, too much work to get the (possible)
  458.  * tlb refills to work correctly.
  459.  */
  460. page = (KSEG0 + (page & (scache_size - 1)));
  461. blast_dcache16_page_indexed(page);
  462. blast_scache16_page_indexed(page);
  463. } else
  464. blast_scache16_page(page);
  465. out:
  466. }
  467. static void r4k_flush_cache_page_s32d16i16(struct vm_area_struct *vma,
  468.    unsigned long page)
  469. {
  470. struct mm_struct *mm = vma->vm_mm;
  471. pgd_t *pgdp;
  472. pmd_t *pmdp;
  473. pte_t *ptep;
  474. /*
  475.  * If ownes no valid ASID yet, cannot possibly have gotten
  476.  * this page into the cache.
  477.  */
  478. if (mm->context == 0)
  479. return;
  480. #ifdef DEBUG_CACHE
  481. printk("cpage[%d,%08lx]", (int)mm->context, page);
  482. #endif
  483. page &= PAGE_MASK;
  484. pgdp = pgd_offset(mm, page);
  485. pmdp = pmd_offset(pgdp, page);
  486. ptep = pte_offset(pmdp, page);
  487. /* If the page isn't marked valid, the page cannot possibly be
  488.  * in the cache.
  489.  */
  490. if (!(pte_val(*ptep) & _PAGE_VALID))
  491. goto out;
  492. /*
  493.  * Doing flushes for another ASID than the current one is
  494.  * too difficult since stupid R4k caches do a TLB translation
  495.  * for every cache flush operation.  So we do indexed flushes
  496.  * in that case, which doesn't overly flush the cache too much.
  497.  */
  498. if (mm->context != current->active_mm->context) {
  499. /*
  500.  * Do indexed flush, too much work to get the (possible)
  501.  * tlb refills to work correctly.
  502.  */
  503. page = (KSEG0 + (page & (scache_size - 1)));
  504. blast_dcache16_page_indexed(page);
  505. blast_scache32_page_indexed(page);
  506. } else
  507. blast_scache32_page(page);
  508. out:
  509. }
  510. static void r4k_flush_cache_page_s64d16i16(struct vm_area_struct *vma,
  511.    unsigned long page)
  512. {
  513. struct mm_struct *mm = vma->vm_mm;
  514. pgd_t *pgdp;
  515. pmd_t *pmdp;
  516. pte_t *ptep;
  517. /*
  518.  * If ownes no valid ASID yet, cannot possibly have gotten
  519.  * this page into the cache.
  520.  */
  521. if (mm->context == 0)
  522. return;
  523. #ifdef DEBUG_CACHE
  524. printk("cpage[%d,%08lx]", (int)mm->context, page);
  525. #endif
  526. page &= PAGE_MASK;
  527. pgdp = pgd_offset(mm, page);
  528. pmdp = pmd_offset(pgdp, page);
  529. ptep = pte_offset(pmdp, page);
  530. /* If the page isn't marked valid, the page cannot possibly be
  531.  * in the cache.
  532.  */
  533. if (!(pte_val(*ptep) & _PAGE_VALID))
  534. goto out;
  535. /*
  536.  * Doing flushes for another ASID than the current one is
  537.  * too difficult since stupid R4k caches do a TLB translation
  538.  * for every cache flush operation.  So we do indexed flushes
  539.  * in that case, which doesn't overly flush the cache too much.
  540.  */
  541. if (mm->context != current->active_mm->context) {
  542. /*
  543.  * Do indexed flush, too much work to get the (possible)
  544.  * tlb refills to work correctly.
  545.  */
  546. page = (KSEG0 + (page & (scache_size - 1)));
  547. blast_dcache16_page_indexed(page);
  548. blast_scache64_page_indexed(page);
  549. } else
  550. blast_scache64_page(page);
  551. out:
  552. }
  553. static void r4k_flush_cache_page_s128d16i16(struct vm_area_struct *vma,
  554.     unsigned long page)
  555. {
  556. struct mm_struct *mm = vma->vm_mm;
  557. pgd_t *pgdp;
  558. pmd_t *pmdp;
  559. pte_t *ptep;
  560. /*
  561.  * If ownes no valid ASID yet, cannot possibly have gotten
  562.  * this page into the cache.
  563.  */
  564. if (mm->context == 0)
  565. return;
  566. #ifdef DEBUG_CACHE
  567. printk("cpage[%d,%08lx]", (int)mm->context, page);
  568. #endif
  569. page &= PAGE_MASK;
  570. pgdp = pgd_offset(mm, page);
  571. pmdp = pmd_offset(pgdp, page);
  572. ptep = pte_offset(pmdp, page);
  573. /*
  574.  * If the page isn't marked valid, the page cannot possibly be
  575.  * in the cache.
  576.  */
  577. if (!(pte_val(*ptep) & _PAGE_VALID))
  578. goto out;
  579. /*
  580.  * Doing flushes for another ASID than the current one is
  581.  * too difficult since stupid R4k caches do a TLB translation
  582.  * for every cache flush operation.  So we do indexed flushes
  583.  * in that case, which doesn't overly flush the cache too much.
  584.  */
  585. if (mm->context != current->active_mm->context) {
  586. /*
  587.  * Do indexed flush, too much work to get the (possible)
  588.  * tlb refills to work correctly.
  589.  */
  590. page = (KSEG0 + (page & (scache_size - 1)));
  591. blast_dcache16_page_indexed(page);
  592. blast_scache128_page_indexed(page);
  593. } else
  594. blast_scache128_page(page);
  595. out:
  596. }
  597. static void r4k_flush_cache_page_s32d32i32(struct vm_area_struct *vma,
  598.    unsigned long page)
  599. {
  600. struct mm_struct *mm = vma->vm_mm;
  601. pgd_t *pgdp;
  602. pmd_t *pmdp;
  603. pte_t *ptep;
  604. /*
  605.  * If ownes no valid ASID yet, cannot possibly have gotten
  606.  * this page into the cache.
  607.  */
  608. if (mm->context == 0)
  609. return;
  610. #ifdef DEBUG_CACHE
  611. printk("cpage[%d,%08lx]", (int)mm->context, page);
  612. #endif
  613. page &= PAGE_MASK;
  614. pgdp = pgd_offset(mm, page);
  615. pmdp = pmd_offset(pgdp, page);
  616. ptep = pte_offset(pmdp, page);
  617. /*
  618.  * If the page isn't marked valid, the page cannot possibly be
  619.  * in the cache.
  620.  */
  621. if (!(pte_val(*ptep) & _PAGE_VALID))
  622. goto out;
  623. /*
  624.  * Doing flushes for another ASID than the current one is
  625.  * too difficult since stupid R4k caches do a TLB translation
  626.  * for every cache flush operation.  So we do indexed flushes
  627.  * in that case, which doesn't overly flush the cache too much.
  628.  */
  629. if (mm->context != current->active_mm->context) {
  630. /*
  631.  * Do indexed flush, too much work to get the (possible)
  632.  * tlb refills to work correctly.
  633.  */
  634. page = (KSEG0 + (page & (scache_size - 1)));
  635. blast_dcache32_page_indexed(page);
  636. blast_scache32_page_indexed(page);
  637. } else
  638. blast_scache32_page(page);
  639. out:
  640. }
  641. static void r4k_flush_cache_page_s64d32i32(struct vm_area_struct *vma,
  642.    unsigned long page)
  643. {
  644. struct mm_struct *mm = vma->vm_mm;
  645. pgd_t *pgdp;
  646. pmd_t *pmdp;
  647. pte_t *ptep;
  648. /*
  649.  * If ownes no valid ASID yet, cannot possibly have gotten
  650.  * this page into the cache.
  651.  */
  652. if (mm->context == 0)
  653. return;
  654. #ifdef DEBUG_CACHE
  655. printk("cpage[%d,%08lx]", (int)mm->context, page);
  656. #endif
  657. page &= PAGE_MASK;
  658. pgdp = pgd_offset(mm, page);
  659. pmdp = pmd_offset(pgdp, page);
  660. ptep = pte_offset(pmdp, page);
  661. /*
  662.  * If the page isn't marked valid, the page cannot possibly be
  663.  * in the cache.
  664.  */
  665. if (!(pte_val(*ptep) & _PAGE_VALID))
  666. goto out;
  667. /*
  668.  * Doing flushes for another ASID than the current one is
  669.  * too difficult since stupid R4k caches do a TLB translation
  670.  * for every cache flush operation.  So we do indexed flushes
  671.  * in that case, which doesn't overly flush the cache too much.
  672.  */
  673. if (mm->context != current->active_mm->context) {
  674. /*
  675.  * Do indexed flush, too much work to get the (possible)
  676.  * tlb refills to work correctly.
  677.  */
  678. page = (KSEG0 + (page & (scache_size - 1)));
  679. blast_dcache32_page_indexed(page);
  680. blast_scache64_page_indexed(page);
  681. } else
  682. blast_scache64_page(page);
  683. out:
  684. }
  685. static void r4k_flush_cache_page_s128d32i32(struct vm_area_struct *vma,
  686.     unsigned long page)
  687. {
  688. struct mm_struct *mm = vma->vm_mm;
  689. pgd_t *pgdp;
  690. pmd_t *pmdp;
  691. pte_t *ptep;
  692. /*
  693.  * If ownes no valid ASID yet, cannot possibly have gotten
  694.  * this page into the cache.
  695.  */
  696. if (mm->context == 0)
  697. return;
  698. #ifdef DEBUG_CACHE
  699. printk("cpage[%d,%08lx]", (int)mm->context, page);
  700. #endif
  701. page &= PAGE_MASK;
  702. pgdp = pgd_offset(mm, page);
  703. pmdp = pmd_offset(pgdp, page);
  704. ptep = pte_offset(pmdp, page);
  705. /*
  706.  * If the page isn't marked valid, the page cannot possibly be
  707.  * in the cache.
  708.  */
  709. if (!(pte_val(*ptep) & _PAGE_VALID))
  710. goto out;
  711. /*
  712.  * Doing flushes for another ASID than the current one is
  713.  * too difficult since stupid R4k caches do a TLB translation
  714.  * for every cache flush operation.  So we do indexed flushes
  715.  * in that case, which doesn't overly flush the cache too much.
  716.  */
  717. if (mm->context != current->active_mm->context) {
  718. /* Do indexed flush, too much work to get the (possible)
  719.  * tlb refills to work correctly.
  720.  */
  721. page = (KSEG0 + (page & (scache_size - 1)));
  722. blast_dcache32_page_indexed(page);
  723. blast_scache128_page_indexed(page);
  724. } else
  725. blast_scache128_page(page);
  726. out:
  727. }
  728. static void r4k_flush_cache_page_d16i16(struct vm_area_struct *vma,
  729. unsigned long page)
  730. {
  731. struct mm_struct *mm = vma->vm_mm;
  732. pgd_t *pgdp;
  733. pmd_t *pmdp;
  734. pte_t *ptep;
  735. /*
  736.  * If ownes no valid ASID yet, cannot possibly have gotten
  737.  * this page into the cache.
  738.  */
  739. if (mm->context == 0)
  740. return;
  741. #ifdef DEBUG_CACHE
  742. printk("cpage[%d,%08lx]", (int)mm->context, page);
  743. #endif
  744. page &= PAGE_MASK;
  745. pgdp = pgd_offset(mm, page);
  746. pmdp = pmd_offset(pgdp, page);
  747. ptep = pte_offset(pmdp, page);
  748. /*
  749.  * If the page isn't marked valid, the page cannot possibly be
  750.  * in the cache.
  751.  */
  752. if (!(pte_val(*ptep) & _PAGE_VALID))
  753. goto out;
  754. /*
  755.  * Doing flushes for another ASID than the current one is
  756.  * too difficult since stupid R4k caches do a TLB translation
  757.  * for every cache flush operation.  So we do indexed flushes
  758.  * in that case, which doesn't overly flush the cache too much.
  759.  */
  760. if (mm == current->active_mm) {
  761. blast_dcache16_page(page);
  762. } else {
  763. /* Do indexed flush, too much work to get the (possible)
  764.  * tlb refills to work correctly.
  765.  */
  766. page = (KSEG0 + (page & (dcache_size - 1)));
  767. blast_dcache16_page_indexed(page);
  768. }
  769. out:
  770. }
  771. static void r4k_flush_cache_page_d32i32(struct vm_area_struct *vma,
  772. unsigned long page)
  773. {
  774. struct mm_struct *mm = vma->vm_mm;
  775. pgd_t *pgdp;
  776. pmd_t *pmdp;
  777. pte_t *ptep;
  778. /*
  779.  * If ownes no valid ASID yet, cannot possibly have gotten
  780.  * this page into the cache.
  781.  */
  782. if (mm->context == 0)
  783. return;
  784. #ifdef DEBUG_CACHE
  785. printk("cpage[%d,%08lx]", (int)mm->context, page);
  786. #endif
  787. page &= PAGE_MASK;
  788. pgdp = pgd_offset(mm, page);
  789. pmdp = pmd_offset(pgdp, page);
  790. ptep = pte_offset(pmdp, page);
  791. /*
  792.  * If the page isn't marked valid, the page cannot possibly be
  793.  * in the cache.
  794.  */
  795. if (!(pte_val(*ptep) & _PAGE_PRESENT))
  796. goto out;
  797. /*
  798.  * Doing flushes for another ASID than the current one is
  799.  * too difficult since stupid R4k caches do a TLB translation
  800.  * for every cache flush operation.  So we do indexed flushes
  801.  * in that case, which doesn't overly flush the cache too much.
  802.  */
  803. if ((mm == current->active_mm) && (pte_val(*ptep) & _PAGE_VALID)) {
  804. blast_dcache32_page(page);
  805. } else {
  806. /*
  807.  * Do indexed flush, too much work to get the (possible)
  808.  * tlb refills to work correctly.
  809.  */
  810. page = (KSEG0 + (page & (dcache_size - 1)));
  811. blast_dcache32_page_indexed(page);
  812. }
  813. out:
  814. }
  815. static void r4k_flush_cache_page_d32i32_r4600(struct vm_area_struct *vma,
  816.       unsigned long page)
  817. {
  818. struct mm_struct *mm = vma->vm_mm;
  819. pgd_t *pgdp;
  820. pmd_t *pmdp;
  821. pte_t *ptep;
  822. /*
  823.  * If ownes no valid ASID yet, cannot possibly have gotten
  824.  * this page into the cache.
  825.  */
  826. if (mm->context == 0)
  827. return;
  828. #ifdef DEBUG_CACHE
  829. printk("cpage[%d,%08lx]", (int)mm->context, page);
  830. #endif
  831. page &= PAGE_MASK;
  832. pgdp = pgd_offset(mm, page);
  833. pmdp = pmd_offset(pgdp, page);
  834. ptep = pte_offset(pmdp, page);
  835. /*
  836.  * If the page isn't marked valid, the page cannot possibly be
  837.  * in the cache.
  838.  */
  839. if (!(pte_val(*ptep) & _PAGE_PRESENT))
  840. goto out;
  841. /*
  842.  * Doing flushes for another ASID than the current one is
  843.  * too difficult since stupid R4k caches do a TLB translation
  844.  * for every cache flush operation.  So we do indexed flushes
  845.  * in that case, which doesn't overly flush the cache too much.
  846.  */
  847. if ((mm == current->active_mm) && (pte_val(*ptep) & _PAGE_VALID)) {
  848. blast_dcache32_page(page);
  849. } else {
  850. /* Do indexed flush, too much work to get the (possible)
  851.  * tlb refills to work correctly.
  852.  */
  853. page = (KSEG0 + (page & (dcache_size - 1)));
  854. blast_dcache32_page_indexed(page);
  855. blast_dcache32_page_indexed(page ^ dcache_waybit);
  856. }
  857. out:
  858. }
  859. /* If the addresses passed to these routines are valid, they are
  860.  * either:
  861.  *
  862.  * 1) In KSEG0, so we can do a direct flush of the page.
  863.  * 2) In KSEG2, and since every process can translate those
  864.  *    addresses all the time in kernel mode we can do a direct
  865.  *    flush.
  866.  * 3) In KSEG1, no flush necessary.
  867.  */
  868. static void r4k_flush_page_to_ram_s16(struct page *page)
  869. {
  870. blast_scache16_page((unsigned long)page_address(page));
  871. }
  872. static void r4k_flush_page_to_ram_s32(struct page *page)
  873. {
  874. blast_scache32_page((unsigned long)page_address(page));
  875. }
  876. static void r4k_flush_page_to_ram_s64(struct page *page)
  877. {
  878. blast_scache64_page((unsigned long)page_address(page));
  879. }
  880. static void r4k_flush_page_to_ram_s128(struct page *page)
  881. {
  882. blast_scache128_page((unsigned long)page_address(page));
  883. }
  884. static void r4k_flush_page_to_ram_d16(struct page *page)
  885. {
  886. blast_dcache16_page((unsigned long)page_address(page));
  887. }
  888. static void r4k_flush_page_to_ram_d32(struct page *page)
  889. {
  890. blast_dcache32_page((unsigned long)page_address(page));
  891. }
  892. static void r4k_flush_page_to_ram_d32_r4600(struct page *page)
  893. {
  894. #ifdef R4600_V1_HIT_DCACHE_WAR
  895. unsigned long flags;
  896. __save_and_cli(flags);
  897. __asm__ __volatile__("nop;nop;nop;nop");
  898. #endif
  899. blast_dcache32_page((unsigned long)page_address(page));
  900. #ifdef R4600_V1_HIT_DCACHE_WAR
  901. __restore_flags(flags);
  902. #endif
  903. }
  904. static void
  905. r4k_flush_icache_page_s(struct vm_area_struct *vma, struct page *page)
  906. {
  907. /*
  908.  * We did an scache flush therefore PI is already clean.
  909.  */
  910. }
  911. static void
  912. r4k_flush_icache_range(unsigned long start, unsigned long end)
  913. {
  914. flush_cache_all();
  915. }
  916. /*
  917.  * Ok, this seriously sucks.  We use them to flush a user page but don't
  918.  * know the virtual address, so we have to blast away the whole icache
  919.  * which is significantly more expensive than the real thing.
  920.  */
  921. static void
  922. r4k_flush_icache_page_p(struct vm_area_struct *vma, struct page *page)
  923. {
  924. if (!(vma->vm_flags & VM_EXEC))
  925. return;
  926. flush_cache_all();
  927. }
  928. static void
  929. r4k_dma_cache_wback_inv_pc(unsigned long addr, unsigned long size)
  930. {
  931. unsigned long end, a;
  932. unsigned int flags;
  933. if (size >= dcache_size) {
  934. flush_cache_all();
  935. } else {
  936. #ifdef R4600_V2_HIT_CACHEOP_WAR
  937. /* Workaround for R4600 bug.  See comment in <asm/war>. */
  938. __save_and_cli(flags);
  939. *(volatile unsigned long *)KSEG1;
  940. #endif
  941. a = addr & ~(dc_lsize - 1);
  942. end = (addr + size) & ~(dc_lsize - 1);
  943. while (1) {
  944. flush_dcache_line(a); /* Hit_Writeback_Inv_D */
  945. if (a == end) break;
  946. a += dc_lsize;
  947. }
  948. #ifdef R4600_V2_HIT_CACHEOP_WAR
  949. __restore_flags(flags);
  950. #endif
  951. }
  952. bc_wback_inv(addr, size);
  953. }
  954. static void
  955. r4k_dma_cache_wback_inv_sc(unsigned long addr, unsigned long size)
  956. {
  957. unsigned long end, a;
  958. if (size >= scache_size) {
  959. flush_cache_all();
  960. return;
  961. }
  962. a = addr & ~(sc_lsize - 1);
  963. end = (addr + size) & ~(sc_lsize - 1);
  964. while (1) {
  965. flush_scache_line(a); /* Hit_Writeback_Inv_SD */
  966. if (a == end) break;
  967. a += sc_lsize;
  968. }
  969. }
  970. static void
  971. r4k_dma_cache_inv_pc(unsigned long addr, unsigned long size)
  972. {
  973. unsigned long end, a;
  974. unsigned int flags;
  975. if (size >= dcache_size) {
  976. flush_cache_all();
  977. } else {
  978. #ifdef R4600_V2_HIT_CACHEOP_WAR
  979. /* Workaround for R4600 bug.  See comment above. */
  980. __save_and_cli(flags);
  981. *(volatile unsigned long *)KSEG1;
  982. #endif
  983. a = addr & ~(dc_lsize - 1);
  984. end = (addr + size) & ~(dc_lsize - 1);
  985. while (1) {
  986. flush_dcache_line(a); /* Hit_Writeback_Inv_D */
  987. if (a == end) break;
  988. a += dc_lsize;
  989. }
  990. #ifdef R4600_V2_HIT_CACHEOP_WAR
  991. __restore_flags(flags);
  992. #endif
  993. }
  994. bc_inv(addr, size);
  995. }
  996. static void
  997. r4k_dma_cache_inv_sc(unsigned long addr, unsigned long size)
  998. {
  999. unsigned long end, a;
  1000. if (size >= scache_size) {
  1001. flush_cache_all();
  1002. return;
  1003. }
  1004. a = addr & ~(sc_lsize - 1);
  1005. end = (addr + size) & ~(sc_lsize - 1);
  1006. while (1) {
  1007. flush_scache_line(a); /* Hit_Writeback_Inv_SD */
  1008. if (a == end) break;
  1009. a += sc_lsize;
  1010. }
  1011. }
  1012. /*
  1013.  * While we're protected against bad userland addresses we don't care
  1014.  * very much about what happens in that case.  Usually a segmentation
  1015.  * fault will dump the process later on anyway ...
  1016.  */
  1017. static void r4k_flush_cache_sigtramp(unsigned long addr)
  1018. {
  1019. #ifdef R4600_V1_HIT_DCACHE_WAR
  1020. unsigned long flags;
  1021. __save_and_cli(flags);
  1022. __asm__ __volatile__("nop;nop;nop;nop");
  1023. #endif
  1024. protected_writeback_dcache_line(addr & ~(dc_lsize - 1));
  1025. protected_flush_icache_line(addr & ~(ic_lsize - 1));
  1026. #ifdef R4600_V1_HIT_DCACHE_WAR
  1027. __restore_flags(flags);
  1028. #endif
  1029. }
  1030. static void r4600v20k_flush_cache_sigtramp(unsigned long addr)
  1031. {
  1032. unsigned int flags;
  1033. #ifdef R4600_V2_HIT_CACHEOP_WAR
  1034. __save_and_cli(flags);
  1035. /* Clear internal cache refill buffer */
  1036. *(volatile unsigned int *)KSEG1;
  1037. #endif
  1038. protected_writeback_dcache_line(addr & ~(dc_lsize - 1));
  1039. protected_flush_icache_line(addr & ~(ic_lsize - 1));
  1040. #ifdef R4600_V2_HIT_CACHEOP_WAR
  1041. __restore_flags(flags);
  1042. #endif
  1043. }
  1044. /* Detect and size the various r4k caches. */
  1045. static void __init probe_icache(unsigned long config)
  1046. {
  1047.         switch (mips_cpu.cputype) {
  1048.         case CPU_VR41XX:
  1049.         case CPU_VR4111:
  1050.         case CPU_VR4121:
  1051.         case CPU_VR4122:
  1052.         case CPU_VR4131:
  1053.         case CPU_VR4181:
  1054.         case CPU_VR4181A:
  1055.                 icache_size = 1 << (10 + ((config >> 9) & 7));
  1056.                 break;
  1057.         default:
  1058.                 icache_size = 1 << (12 + ((config >> 9) & 7));
  1059.                 break;
  1060.         }
  1061. ic_lsize = 16 << ((config >> 5) & 1);
  1062. printk("Primary instruction cache %dkb, linesize %d bytes.n",
  1063.        icache_size >> 10, ic_lsize);
  1064. }
  1065. static void __init probe_dcache(unsigned long config)
  1066. {
  1067.         switch (mips_cpu.cputype) {
  1068.         case CPU_VR41XX:
  1069.         case CPU_VR4111:
  1070.         case CPU_VR4121:
  1071.         case CPU_VR4122:
  1072.         case CPU_VR4131:
  1073.         case CPU_VR4181:
  1074.         case CPU_VR4181A:
  1075.                 dcache_size = 1 << (10 + ((config >> 6) & 7));
  1076.                 break;
  1077.         default:
  1078.                 dcache_size = 1 << (12 + ((config >> 6) & 7));
  1079.                 break;
  1080.         }
  1081. dc_lsize = 16 << ((config >> 4) & 1);
  1082. printk("Primary data cache %dkb, linesize %d bytes.n",
  1083.        dcache_size >> 10, dc_lsize);
  1084. }
  1085. /* If you even _breathe_ on this function, look at the gcc output
  1086.  * and make sure it does not pop things on and off the stack for
  1087.  * the cache sizing loop that executes in KSEG1 space or else
  1088.  * you will crash and burn badly.  You have been warned.
  1089.  */
  1090. static int __init probe_scache(unsigned long config)
  1091. {
  1092. extern unsigned long stext;
  1093. unsigned long flags, addr, begin, end, pow2;
  1094. int tmp;
  1095. tmp = ((config >> 17) & 1);
  1096. if(tmp)
  1097. return 0;
  1098. tmp = ((config >> 22) & 3);
  1099. switch(tmp) {
  1100. case 0:
  1101. sc_lsize = 16;
  1102. break;
  1103. case 1:
  1104. sc_lsize = 32;
  1105. break;
  1106. case 2:
  1107. sc_lsize = 64;
  1108. break;
  1109. case 3:
  1110. sc_lsize = 128;
  1111. break;
  1112. }
  1113. begin = (unsigned long) &stext;
  1114. begin &= ~((4 * 1024 * 1024) - 1);
  1115. end = begin + (4 * 1024 * 1024);
  1116. /* This is such a bitch, you'd think they would make it
  1117.  * easy to do this.  Away you daemons of stupidity!
  1118.  */
  1119. __save_and_cli(flags);
  1120. /* Fill each size-multiple cache line with a valid tag. */
  1121. pow2 = (64 * 1024);
  1122. for(addr = begin; addr < end; addr = (begin + pow2)) {
  1123. unsigned long *p = (unsigned long *) addr;
  1124. __asm__ __volatile__("nop" : : "r" (*p)); /* whee... */
  1125. pow2 <<= 1;
  1126. }
  1127. /* Load first line with zero (therefore invalid) tag. */
  1128. set_taglo(0);
  1129. set_taghi(0);
  1130. __asm__ __volatile__("nop; nop; nop; nop;"); /* avoid the hazard */
  1131. __asm__ __volatile__("nt.set noreordernt"
  1132.      ".set mips3nt"
  1133.      "cache 8, (%0)nt"
  1134.      ".set mips0nt"
  1135.      ".set reordernt" : : "r" (begin));
  1136. __asm__ __volatile__("nt.set noreordernt"
  1137.      ".set mips3nt"
  1138.      "cache 9, (%0)nt"
  1139.      ".set mips0nt"
  1140.      ".set reordernt" : : "r" (begin));
  1141. __asm__ __volatile__("nt.set noreordernt"
  1142.      ".set mips3nt"
  1143.      "cache 11, (%0)nt"
  1144.      ".set mips0nt"
  1145.      ".set reordernt" : : "r" (begin));
  1146. /* Now search for the wrap around point. */
  1147. pow2 = (128 * 1024);
  1148. tmp = 0;
  1149. for(addr = (begin + (128 * 1024)); addr < (end); addr = (begin + pow2)) {
  1150. __asm__ __volatile__("nt.set noreordernt"
  1151.      ".set mips3nt"
  1152.      "cache 7, (%0)nt"
  1153.      ".set mips0nt"
  1154.      ".set reordernt" : : "r" (addr));
  1155. __asm__ __volatile__("nop; nop; nop; nop;"); /* hazard... */
  1156. if(!get_taglo())
  1157. break;
  1158. pow2 <<= 1;
  1159. }
  1160. __restore_flags(flags);
  1161. addr -= begin;
  1162. printk("Secondary cache sized at %dK linesize %d bytes.n",
  1163.        (int) (addr >> 10), sc_lsize);
  1164. scache_size = addr;
  1165. return 1;
  1166. }
  1167. static void __init setup_noscache_funcs(void)
  1168. {
  1169. unsigned int prid;
  1170. switch(dc_lsize) {
  1171. case 16:
  1172. _clear_page = r4k_clear_page_d16;
  1173. _copy_page = r4k_copy_page_d16;
  1174. _flush_cache_all = r4k_flush_cache_all_d16i16;
  1175. _flush_cache_mm = r4k_flush_cache_mm_d16i16;
  1176. _flush_cache_range = r4k_flush_cache_range_d16i16;
  1177. _flush_cache_page = r4k_flush_cache_page_d16i16;
  1178. _flush_page_to_ram = r4k_flush_page_to_ram_d16;
  1179. break;
  1180. case 32:
  1181. prid = read_32bit_cp0_register(CP0_PRID) & 0xfff0;
  1182. if (prid == 0x2010) { /* R4600 V1.7 */
  1183. _clear_page = r4k_clear_page_r4600_v1;
  1184. _copy_page = r4k_copy_page_r4600_v1;
  1185. _flush_page_to_ram = r4k_flush_page_to_ram_d32_r4600;
  1186. } else if (prid == 0x2020) { /* R4600 V2.0 */
  1187. _clear_page = r4k_clear_page_r4600_v2;
  1188. _copy_page = r4k_copy_page_r4600_v2;
  1189. _flush_page_to_ram = r4k_flush_page_to_ram_d32;
  1190. } else {
  1191. _clear_page = r4k_clear_page_d32;
  1192. _copy_page = r4k_copy_page_d32;
  1193. _flush_page_to_ram = r4k_flush_page_to_ram_d32;
  1194. }
  1195. _flush_cache_all = r4k_flush_cache_all_d32i32;
  1196. _flush_cache_mm = r4k_flush_cache_mm_d32i32;
  1197. _flush_cache_range = r4k_flush_cache_range_d32i32;
  1198. _flush_cache_page = r4k_flush_cache_page_d32i32;
  1199. break;
  1200. }
  1201. ___flush_cache_all = _flush_cache_all;
  1202. _flush_icache_page = r4k_flush_icache_page_p;
  1203. _dma_cache_wback_inv = r4k_dma_cache_wback_inv_pc;
  1204. _dma_cache_wback = r4k_dma_cache_wback_inv_pc;
  1205. _dma_cache_inv = r4k_dma_cache_inv_pc;
  1206. }
  1207. static void __init setup_scache_funcs(void)
  1208. {
  1209. switch(sc_lsize) {
  1210. case 16:
  1211. switch(dc_lsize) {
  1212. case 16:
  1213. _flush_cache_all = r4k_flush_cache_all_s16d16i16;
  1214. _flush_cache_mm = r4k_flush_cache_mm_s16d16i16;
  1215. _flush_cache_range = r4k_flush_cache_range_s16d16i16;
  1216. _flush_cache_page = r4k_flush_cache_page_s16d16i16;
  1217. break;
  1218. case 32:
  1219. panic("Invalid cache configuration detected");
  1220. };
  1221. _flush_page_to_ram = r4k_flush_page_to_ram_s16;
  1222. _clear_page = r4k_clear_page_s16;
  1223. _copy_page = r4k_copy_page_s16;
  1224. break;
  1225. case 32:
  1226. switch(dc_lsize) {
  1227. case 16:
  1228. _flush_cache_all = r4k_flush_cache_all_s32d16i16;
  1229. _flush_cache_mm = r4k_flush_cache_mm_s32d16i16;
  1230. _flush_cache_range = r4k_flush_cache_range_s32d16i16;
  1231. _flush_cache_page = r4k_flush_cache_page_s32d16i16;
  1232. break;
  1233. case 32:
  1234. _flush_cache_all = r4k_flush_cache_all_s32d32i32;
  1235. _flush_cache_mm = r4k_flush_cache_mm_s32d32i32;
  1236. _flush_cache_range = r4k_flush_cache_range_s32d32i32;
  1237. _flush_cache_page = r4k_flush_cache_page_s32d32i32;
  1238. break;
  1239. };
  1240. _flush_page_to_ram = r4k_flush_page_to_ram_s32;
  1241. _clear_page = r4k_clear_page_s32;
  1242. _copy_page = r4k_copy_page_s32;
  1243. break;
  1244. case 64:
  1245. switch(dc_lsize) {
  1246. case 16:
  1247. _flush_cache_all = r4k_flush_cache_all_s64d16i16;
  1248. _flush_cache_mm = r4k_flush_cache_mm_s64d16i16;
  1249. _flush_cache_range = r4k_flush_cache_range_s64d16i16;
  1250. _flush_cache_page = r4k_flush_cache_page_s64d16i16;
  1251. break;
  1252. case 32:
  1253. _flush_cache_all = r4k_flush_cache_all_s64d32i32;
  1254. _flush_cache_mm = r4k_flush_cache_mm_s64d32i32;
  1255. _flush_cache_range = r4k_flush_cache_range_s64d32i32;
  1256. _flush_cache_page = r4k_flush_cache_page_s64d32i32;
  1257. break;
  1258. };
  1259. _flush_page_to_ram = r4k_flush_page_to_ram_s64;
  1260. _clear_page = r4k_clear_page_s64;
  1261. _copy_page = r4k_copy_page_s64;
  1262. break;
  1263. case 128:
  1264. switch(dc_lsize) {
  1265. case 16:
  1266. _flush_cache_all = r4k_flush_cache_all_s128d16i16;
  1267. _flush_cache_mm = r4k_flush_cache_mm_s128d16i16;
  1268. _flush_cache_range = r4k_flush_cache_range_s128d16i16;
  1269. _flush_cache_page = r4k_flush_cache_page_s128d16i16;
  1270. break;
  1271. case 32:
  1272. _flush_cache_all = r4k_flush_cache_all_s128d32i32;
  1273. _flush_cache_mm = r4k_flush_cache_mm_s128d32i32;
  1274. _flush_cache_range = r4k_flush_cache_range_s128d32i32;
  1275. _flush_cache_page = r4k_flush_cache_page_s128d32i32;
  1276. break;
  1277. };
  1278. _flush_page_to_ram = r4k_flush_page_to_ram_s128;
  1279. _clear_page = r4k_clear_page_s128;
  1280. _copy_page = r4k_copy_page_s128;
  1281. break;
  1282. }
  1283. ___flush_cache_all = _flush_cache_all;
  1284. _flush_icache_page = r4k_flush_icache_page_s;
  1285. _dma_cache_wback_inv = r4k_dma_cache_wback_inv_sc;
  1286. _dma_cache_wback = r4k_dma_cache_wback_inv_sc;
  1287. _dma_cache_inv = r4k_dma_cache_inv_sc;
  1288. }
  1289. typedef int (*probe_func_t)(unsigned long);
  1290. static inline void __init setup_scache(unsigned int config)
  1291. {
  1292. probe_func_t probe_scache_kseg1;
  1293. int sc_present = 0;
  1294. /* Maybe the cpu knows about a l2 cache? */
  1295. probe_scache_kseg1 = (probe_func_t) (KSEG1ADDR(&probe_scache));
  1296. sc_present = probe_scache_kseg1(config);
  1297. if (!sc_present) {
  1298. setup_noscache_funcs();
  1299. return;
  1300. }
  1301. switch(mips_cpu.cputype) {
  1302. case CPU_R5000:
  1303. case CPU_NEVADA:
  1304. setup_noscache_funcs();
  1305. #if defined(CONFIG_CPU_R5000) || defined(CONFIG_CPU_NEVADA)
  1306. r5k_sc_init();
  1307. #endif
  1308. break;
  1309. default:
  1310. setup_scache_funcs();
  1311. }
  1312. }
  1313. void __init ld_mmu_r4xx0(void)
  1314. {
  1315. unsigned long config = read_32bit_cp0_register(CP0_CONFIG);
  1316. change_cp0_config(CONF_CM_CMASK | CONF_CU, CONF_CM_DEFAULT);
  1317. probe_icache(config);
  1318. probe_dcache(config);
  1319. setup_scache(config);
  1320. switch(mips_cpu.cputype) {
  1321. case CPU_R4600: /* QED style two way caches? */
  1322. case CPU_R4700:
  1323. case CPU_R5000:
  1324. case CPU_NEVADA:
  1325. _flush_cache_page = r4k_flush_cache_page_d32i32_r4600;
  1326. }
  1327. _flush_cache_sigtramp = r4k_flush_cache_sigtramp;
  1328. _flush_icache_range = r4k_flush_icache_range; /* Ouch */
  1329. if ((read_32bit_cp0_register(CP0_PRID) & 0xfff0) == 0x2020) {
  1330. _flush_cache_sigtramp = r4600v20k_flush_cache_sigtramp;
  1331. }
  1332. __flush_cache_all();
  1333. }