mips32.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:26k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Kevin D. Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
  3.  * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
  4.  *
  5.  * This program is free software; you can distribute it and/or modify it
  6.  * under the terms of the GNU General Public License (Version 2) as
  7.  * published by the Free Software Foundation.
  8.  *
  9.  * This program is distributed in the hope it will be useful, but WITHOUT
  10.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11.  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12.  * for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License along
  15.  * with this program; if not, write to the Free Software Foundation, Inc.,
  16.  * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  17.  *
  18.  * MIPS32 CPU variant specific MMU/Cache routines.
  19.  */
  20. #include <linux/init.h>
  21. #include <linux/kernel.h>
  22. #include <linux/sched.h>
  23. #include <linux/mm.h>
  24. #include <asm/bootinfo.h>
  25. #include <asm/cpu.h>
  26. #include <asm/bcache.h>
  27. #include <asm/io.h>
  28. #include <asm/page.h>
  29. #include <asm/pgtable.h>
  30. #include <asm/system.h>
  31. #include <asm/mmu_context.h>
  32. /* CP0 hazard avoidance. */
  33. #define BARRIER __asm__ __volatile__(".set noreordernt" 
  34.      "nop; nop; nop; nop; nop; nop;nt" 
  35.      ".set reordernt")
  36. /* Primary cache parameters. */
  37. static int icache_size, dcache_size; /* Size in bytes */
  38. static int ic_lsize, dc_lsize;       /* LineSize in bytes */
  39. /* Secondary cache (if present) parameters. */
  40. static unsigned int scache_size, sc_lsize; /* Again, in bytes */
  41. #include <asm/cacheops.h>
  42. #include <asm/mips32_cache.h>
  43. #undef DEBUG_CACHE
  44. /*
  45.  * Dummy cache handling routines for machines without boardcaches
  46.  */
  47. static void no_sc_noop(void) {}
  48. static struct bcache_ops no_sc_ops = {
  49. (void *)no_sc_noop, (void *)no_sc_noop,
  50. (void *)no_sc_noop, (void *)no_sc_noop
  51. };
  52. struct bcache_ops *bcops = &no_sc_ops;
  53. /*
  54.  * Zero an entire page.
  55.  */
  56. static void mips32_clear_page_dc(unsigned long page)
  57. {
  58. unsigned long i;
  59.         if (mips_cpu.options & MIPS_CPU_CACHE_CDEX) {
  60.         for (i=page; i<page+PAGE_SIZE; i+=dc_lsize) {
  61.         __asm__ __volatile__(
  62.         ".settnoreordernt"
  63. ".settnoatnt"
  64. ".settmips3nt"
  65. "cachet%2,(%0)nt"
  66. ".settmips0nt"
  67. ".settatnt"
  68. ".settreorder"
  69. :"=r" (i)
  70. :"0" (i),
  71. "I" (Create_Dirty_Excl_D));
  72. }
  73. }
  74. for (i=page; i<page+PAGE_SIZE; i+=4)
  75.         *(unsigned long *)(i) = 0;
  76. }
  77. static void mips32_clear_page_sc(unsigned long page)
  78. {
  79. unsigned long i;
  80.         if (mips_cpu.options & MIPS_CPU_CACHE_CDEX) {
  81.         for (i=page; i<page+PAGE_SIZE; i+=sc_lsize) {
  82.         __asm__ __volatile__(
  83. ".settnoreordernt"
  84. ".settnoatnt"
  85. ".settmips3nt"
  86. "cachet%2,(%0)nt"
  87. ".settmips0nt"
  88. ".settatnt"
  89. ".settreorder"
  90. :"=r" (i)
  91. :"0" (i),
  92. "I" (Create_Dirty_Excl_SD));
  93. }
  94. }
  95. for (i=page; i<page+PAGE_SIZE; i+=4)
  96.         *(unsigned long *)(i) = 0;
  97. }
  98. static void mips32_copy_page_dc(unsigned long to, unsigned long from)
  99. {
  100. unsigned long i;
  101.         if (mips_cpu.options & MIPS_CPU_CACHE_CDEX) {
  102.         for (i=to; i<to+PAGE_SIZE; i+=dc_lsize) {
  103.         __asm__ __volatile__(
  104.         ".settnoreordernt"
  105. ".settnoatnt"
  106. ".settmips3nt"
  107. "cachet%2,(%0)nt"
  108. ".settmips0nt"
  109. ".settatnt"
  110. ".settreorder"
  111. :"=r" (i)
  112. :"0" (i),
  113. "I" (Create_Dirty_Excl_D));
  114. }
  115. }
  116. for (i=0; i<PAGE_SIZE; i+=4)
  117.         *(unsigned long *)(to+i) = *(unsigned long *)(from+i);
  118. }
  119. static void mips32_copy_page_sc(unsigned long to, unsigned long from)
  120. {
  121. unsigned long i;
  122.         if (mips_cpu.options & MIPS_CPU_CACHE_CDEX) {
  123.         for (i=to; i<to+PAGE_SIZE; i+=sc_lsize) {
  124.         __asm__ __volatile__(
  125. ".settnoreordernt"
  126. ".settnoatnt"
  127. ".settmips3nt"
  128. "cachet%2,(%0)nt"
  129. ".settmips0nt"
  130. ".settatnt"
  131. ".settreorder"
  132. :"=r" (i)
  133. :"0" (i),
  134. "I" (Create_Dirty_Excl_SD));
  135. }
  136. }
  137. for (i=0; i<PAGE_SIZE; i+=4)
  138.         *(unsigned long *)(to+i) = *(unsigned long *)(from+i);
  139. }
  140. static inline void mips32_flush_cache_all_sc(void)
  141. {
  142. unsigned long flags;
  143. __save_and_cli(flags);
  144. blast_dcache(); blast_icache(); blast_scache();
  145. __restore_flags(flags);
  146. }
  147. static inline void mips32_flush_cache_all_pc(void)
  148. {
  149. unsigned long flags;
  150. __save_and_cli(flags);
  151. blast_dcache(); blast_icache();
  152. __restore_flags(flags);
  153. }
  154. static void
  155. mips32_flush_cache_range_sc(struct mm_struct *mm,
  156.  unsigned long start,
  157.  unsigned long end)
  158. {
  159. struct vm_area_struct *vma;
  160. unsigned long flags;
  161. if(mm->context == 0)
  162. return;
  163. start &= PAGE_MASK;
  164. #ifdef DEBUG_CACHE
  165. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  166. #endif
  167. vma = find_vma(mm, start);
  168. if(vma) {
  169. if(mm->context != current->mm->context) {
  170. mips32_flush_cache_all_sc();
  171. } else {
  172. pgd_t *pgd;
  173. pmd_t *pmd;
  174. pte_t *pte;
  175. __save_and_cli(flags);
  176. while(start < end) {
  177. pgd = pgd_offset(mm, start);
  178. pmd = pmd_offset(pgd, start);
  179. pte = pte_offset(pmd, start);
  180. if(pte_val(*pte) & _PAGE_VALID)
  181. blast_scache_page(start);
  182. start += PAGE_SIZE;
  183. }
  184. __restore_flags(flags);
  185. }
  186. }
  187. }
  188. static void mips32_flush_cache_range_pc(struct mm_struct *mm,
  189.      unsigned long start,
  190.      unsigned long end)
  191. {
  192. if(mm->context != 0) {
  193. unsigned long flags;
  194. #ifdef DEBUG_CACHE
  195. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  196. #endif
  197. __save_and_cli(flags);
  198. blast_dcache(); blast_icache();
  199. __restore_flags(flags);
  200. }
  201. }
  202. /*
  203.  * On architectures like the Sparc, we could get rid of lines in
  204.  * the cache created only by a certain context, but on the MIPS
  205.  * (and actually certain Sparc's) we cannot.
  206.  */
  207. static void mips32_flush_cache_mm_sc(struct mm_struct *mm)
  208. {
  209. if(mm->context != 0) {
  210. #ifdef DEBUG_CACHE
  211. printk("cmm[%d]", (int)mm->context);
  212. #endif
  213. mips32_flush_cache_all_sc();
  214. }
  215. }
  216. static void mips32_flush_cache_mm_pc(struct mm_struct *mm)
  217. {
  218. if(mm->context != 0) {
  219. #ifdef DEBUG_CACHE
  220. printk("cmm[%d]", (int)mm->context);
  221. #endif
  222. mips32_flush_cache_all_pc();
  223. }
  224. }
  225. static void mips32_flush_cache_page_sc(struct vm_area_struct *vma,
  226.     unsigned long page)
  227. {
  228. struct mm_struct *mm = vma->vm_mm;
  229. unsigned long flags;
  230. pgd_t *pgdp;
  231. pmd_t *pmdp;
  232. pte_t *ptep;
  233. /*
  234.  * If ownes no valid ASID yet, cannot possibly have gotten
  235.  * this page into the cache.
  236.  */
  237. if (mm->context == 0)
  238. return;
  239. #ifdef DEBUG_CACHE
  240. printk("cpage[%d,%08lx]", (int)mm->context, page);
  241. #endif
  242. __save_and_cli(flags);
  243. page &= PAGE_MASK;
  244. pgdp = pgd_offset(mm, page);
  245. pmdp = pmd_offset(pgdp, page);
  246. ptep = pte_offset(pmdp, page);
  247. /*
  248.  * If the page isn't marked valid, the page cannot possibly be
  249.  * in the cache.
  250.  */
  251. if (!(pte_val(*ptep) & _PAGE_VALID))
  252. goto out;
  253. /*
  254.  * Doing flushes for another ASID than the current one is
  255.  * too difficult since R4k caches do a TLB translation
  256.  * for every cache flush operation.  So we do indexed flushes
  257.  * in that case, which doesn't overly flush the cache too much.
  258.  */
  259. if (mm->context != current->active_mm->context) {
  260. /*
  261.  * Do indexed flush, too much work to get the (possible)
  262.  * tlb refills to work correctly.
  263.  */
  264. page = (KSEG0 + (page & (scache_size - 1)));
  265. blast_dcache_page_indexed(page);
  266. blast_scache_page_indexed(page);
  267. } else
  268. blast_scache_page(page);
  269. out:
  270. __restore_flags(flags);
  271. }
  272. static void mips32_flush_cache_page_pc(struct vm_area_struct *vma,
  273.     unsigned long page)
  274. {
  275. struct mm_struct *mm = vma->vm_mm;
  276. unsigned long flags;
  277. pgd_t *pgdp;
  278. pmd_t *pmdp;
  279. pte_t *ptep;
  280. /*
  281.  * If ownes no valid ASID yet, cannot possibly have gotten
  282.  * this page into the cache.
  283.  */
  284. if (mm->context == 0)
  285. return;
  286. #ifdef DEBUG_CACHE
  287. printk("cpage[%d,%08lx]", (int)mm->context, page);
  288. #endif
  289. __save_and_cli(flags);
  290. page &= PAGE_MASK;
  291. pgdp = pgd_offset(mm, page);
  292. pmdp = pmd_offset(pgdp, page);
  293. ptep = pte_offset(pmdp, page);
  294. /*
  295.  * If the page isn't marked valid, the page cannot possibly be
  296.  * in the cache.
  297.  */
  298. if (!(pte_val(*ptep) & _PAGE_VALID))
  299. goto out;
  300. /*
  301.  * Doing flushes for another ASID than the current one is
  302.  * too difficult since Mips32 caches do a TLB translation
  303.  * for every cache flush operation.  So we do indexed flushes
  304.  * in that case, which doesn't overly flush the cache too much.
  305.  */
  306. if (mm == current->active_mm) {
  307. blast_dcache_page(page);
  308. } else {
  309. /* Do indexed flush, too much work to get the (possible)
  310.  * tlb refills to work correctly.
  311.  */
  312. page = (KSEG0 + (page & (dcache_size - 1)));
  313. blast_dcache_page_indexed(page);
  314. }
  315. out:
  316. __restore_flags(flags);
  317. }
  318. /* If the addresses passed to these routines are valid, they are
  319.  * either:
  320.  *
  321.  * 1) In KSEG0, so we can do a direct flush of the page.
  322.  * 2) In KSEG2, and since every process can translate those
  323.  *    addresses all the time in kernel mode we can do a direct
  324.  *    flush.
  325.  * 3) In KSEG1, no flush necessary.
  326.  */
  327. static void mips32_flush_page_to_ram_sc(struct page *page)
  328. {
  329. blast_scache_page((unsigned long)page_address(page));
  330. }
  331. static void mips32_flush_page_to_ram_pc(struct page *page)
  332. {
  333. blast_dcache_page((unsigned long)page_address(page));
  334. }
  335. static void
  336. mips32_flush_icache_page_s(struct vm_area_struct *vma, struct page *page)
  337. {
  338. /*
  339.  * We did an scache flush therefore PI is already clean.
  340.  */
  341. }
  342. static void
  343. mips32_flush_icache_range(unsigned long start, unsigned long end)
  344. {
  345. flush_cache_all();
  346. }
  347. static void
  348. mips32_flush_icache_page(struct vm_area_struct *vma, struct page *page)
  349. {
  350. int address;
  351. if (!(vma->vm_flags & VM_EXEC))
  352. return;
  353. address = KSEG0 + ((unsigned long)page_address(page) & PAGE_MASK & (dcache_size - 1));
  354. blast_icache_page_indexed(address);
  355. }
  356. /*
  357.  * Writeback and invalidate the primary cache dcache before DMA.
  358.  */
  359. static void
  360. mips32_dma_cache_wback_inv_pc(unsigned long addr, unsigned long size)
  361. {
  362. unsigned long end, a;
  363. unsigned int flags;
  364. if (size >= dcache_size) {
  365. flush_cache_all();
  366. } else {
  367.         __save_and_cli(flags);
  368. a = addr & ~(dc_lsize - 1);
  369. end = (addr + size) & ~(dc_lsize - 1);
  370. while (1) {
  371. flush_dcache_line(a); /* Hit_Writeback_Inv_D */
  372. if (a == end) break;
  373. a += dc_lsize;
  374. }
  375. __restore_flags(flags);
  376. }
  377. bc_wback_inv(addr, size);
  378. }
  379. static void
  380. mips32_dma_cache_wback_inv_sc(unsigned long addr, unsigned long size)
  381. {
  382. unsigned long end, a;
  383. if (size >= scache_size) {
  384. flush_cache_all();
  385. return;
  386. }
  387. a = addr & ~(sc_lsize - 1);
  388. end = (addr + size) & ~(sc_lsize - 1);
  389. while (1) {
  390. flush_scache_line(a); /* Hit_Writeback_Inv_SD */
  391. if (a == end) break;
  392. a += sc_lsize;
  393. }
  394. }
  395. static void
  396. mips32_dma_cache_inv_pc(unsigned long addr, unsigned long size)
  397. {
  398. unsigned long end, a;
  399. unsigned int flags;
  400. if (size >= dcache_size) {
  401. flush_cache_all();
  402. } else {
  403.         __save_and_cli(flags);
  404. a = addr & ~(dc_lsize - 1);
  405. end = (addr + size) & ~(dc_lsize - 1);
  406. while (1) {
  407. flush_dcache_line(a); /* Hit_Writeback_Inv_D */
  408. if (a == end) break;
  409. a += dc_lsize;
  410. }
  411. __restore_flags(flags);
  412. }
  413. bc_inv(addr, size);
  414. }
  415. static void
  416. mips32_dma_cache_inv_sc(unsigned long addr, unsigned long size)
  417. {
  418. unsigned long end, a;
  419. if (size >= scache_size) {
  420. flush_cache_all();
  421. return;
  422. }
  423. a = addr & ~(sc_lsize - 1);
  424. end = (addr + size) & ~(sc_lsize - 1);
  425. while (1) {
  426. flush_scache_line(a); /* Hit_Writeback_Inv_SD */
  427. if (a == end) break;
  428. a += sc_lsize;
  429. }
  430. }
  431. static void
  432. mips32_dma_cache_wback(unsigned long addr, unsigned long size)
  433. {
  434. panic("mips32_dma_cache called - should not happen.n");
  435. }
  436. /*
  437.  * While we're protected against bad userland addresses we don't care
  438.  * very much about what happens in that case.  Usually a segmentation
  439.  * fault will dump the process later on anyway ...
  440.  */
  441. static void mips32_flush_cache_sigtramp(unsigned long addr)
  442. {
  443. protected_writeback_dcache_line(addr & ~(dc_lsize - 1));
  444. protected_flush_icache_line(addr & ~(ic_lsize - 1));
  445. }
  446. #undef DEBUG_TLB
  447. #undef DEBUG_TLBUPDATE
  448. void flush_tlb_all(void)
  449. {
  450. unsigned long flags;
  451. unsigned long old_ctx;
  452. int entry;
  453. #ifdef DEBUG_TLB
  454. printk("[tlball]");
  455. #endif
  456. __save_and_cli(flags);
  457. /* Save old context and create impossible VPN2 value */
  458. old_ctx = (get_entryhi() & 0xff);
  459. set_entryhi(KSEG0);
  460. set_entrylo0(0);
  461. set_entrylo1(0);
  462. BARRIER;
  463. entry = get_wired();
  464. /* Blast 'em all away. */
  465. while(entry < mips_cpu.tlbsize) {
  466.         /* Make sure all entries differ. */  
  467.         set_entryhi(KSEG0+entry*0x2000);
  468. set_index(entry);
  469. BARRIER;
  470. tlb_write_indexed();
  471. BARRIER;
  472. entry++;
  473. }
  474. BARRIER;
  475. set_entryhi(old_ctx);
  476. __restore_flags(flags);
  477. }
  478. void flush_tlb_mm(struct mm_struct *mm)
  479. {
  480. if (mm->context != 0) {
  481. unsigned long flags;
  482. #ifdef DEBUG_TLB
  483. printk("[tlbmm<%d>]", mm->context);
  484. #endif
  485. __save_and_cli(flags);
  486. get_new_mmu_context(mm, asid_cache);
  487. if (mm == current->active_mm)
  488. set_entryhi(mm->context & 0xff);
  489. __restore_flags(flags);
  490. }
  491. }
  492. void flush_tlb_range(struct mm_struct *mm, unsigned long start,
  493. unsigned long end)
  494. {
  495. if(mm->context != 0) {
  496. unsigned long flags;
  497. int size;
  498. #ifdef DEBUG_TLB
  499. printk("[tlbrange<%02x,%08lx,%08lx>]", (mm->context & 0xff),
  500.        start, end);
  501. #endif
  502. __save_and_cli(flags);
  503. size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
  504. size = (size + 1) >> 1;
  505. if(size <= mips_cpu.tlbsize/2) {
  506. int oldpid = (get_entryhi() & 0xff);
  507. int newpid = (mm->context & 0xff);
  508. start &= (PAGE_MASK << 1);
  509. end += ((PAGE_SIZE << 1) - 1);
  510. end &= (PAGE_MASK << 1);
  511. while(start < end) {
  512. int idx;
  513. set_entryhi(start | newpid);
  514. start += (PAGE_SIZE << 1);
  515. BARRIER;
  516. tlb_probe();
  517. BARRIER;
  518. idx = get_index();
  519. set_entrylo0(0);
  520. set_entrylo1(0);
  521. if(idx < 0)
  522. continue;
  523. /* Make sure all entries differ. */
  524. set_entryhi(KSEG0+idx*0x2000);
  525. BARRIER;
  526. tlb_write_indexed();
  527. BARRIER;
  528. }
  529. set_entryhi(oldpid);
  530. } else {
  531. get_new_mmu_context(mm, asid_cache);
  532. if (mm == current->active_mm)
  533. set_entryhi(mm->context & 0xff);
  534. }
  535. __restore_flags(flags);
  536. }
  537. }
  538. void flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
  539. {
  540. if (vma->vm_mm->context != 0) {
  541. unsigned long flags;
  542. int oldpid, newpid, idx;
  543. #ifdef DEBUG_TLB
  544. printk("[tlbpage<%d,%08lx>]", vma->vm_mm->context, page);
  545. #endif
  546. newpid = (vma->vm_mm->context & 0xff);
  547. page &= (PAGE_MASK << 1);
  548. __save_and_cli(flags);
  549. oldpid = (get_entryhi() & 0xff);
  550. set_entryhi(page | newpid);
  551. BARRIER;
  552. tlb_probe();
  553. BARRIER;
  554. idx = get_index();
  555. set_entrylo0(0);
  556. set_entrylo1(0);
  557. if(idx < 0)
  558. goto finish;
  559. /* Make sure all entries differ. */  
  560. set_entryhi(KSEG0+idx*0x2000);
  561. BARRIER;
  562. tlb_write_indexed();
  563. finish:
  564. BARRIER;
  565. set_entryhi(oldpid);
  566. __restore_flags(flags);
  567. }
  568. }
  569. void pgd_init(unsigned long page)
  570. {
  571. unsigned long *p = (unsigned long *) page;
  572. int i;
  573. for(i = 0; i < USER_PTRS_PER_PGD; i+=8) {
  574. p[i + 0] = (unsigned long) invalid_pte_table;
  575. p[i + 1] = (unsigned long) invalid_pte_table;
  576. p[i + 2] = (unsigned long) invalid_pte_table;
  577. p[i + 3] = (unsigned long) invalid_pte_table;
  578. p[i + 4] = (unsigned long) invalid_pte_table;
  579. p[i + 5] = (unsigned long) invalid_pte_table;
  580. p[i + 6] = (unsigned long) invalid_pte_table;
  581. p[i + 7] = (unsigned long) invalid_pte_table;
  582. }
  583. }
  584. /* 
  585.  * Updates the TLB with the new pte(s).
  586.  */
  587. void update_mmu_cache(struct vm_area_struct * vma,
  588.       unsigned long address, pte_t pte)
  589. {
  590. unsigned long flags;
  591. pgd_t *pgdp;
  592. pmd_t *pmdp;
  593. pte_t *ptep;
  594. int idx, pid;
  595. /*
  596.  * Handle debugger faulting in for debugee.
  597.  */
  598. if (current->active_mm != vma->vm_mm)
  599. return;
  600. pid = get_entryhi() & 0xff;
  601. #ifdef DEBUG_TLB
  602. if((pid != (vma->vm_mm->context & 0xff)) || (vma->vm_mm->context == 0)) {
  603. printk("update_mmu_cache: Wheee, bogus tlbpid mmpid=%d tlbpid=%dn",
  604.        (int) (vma->vm_mm->context & 0xff), pid);
  605. }
  606. #endif
  607. __save_and_cli(flags);
  608. address &= (PAGE_MASK << 1);
  609. set_entryhi(address | (pid));
  610. pgdp = pgd_offset(vma->vm_mm, address);
  611. BARRIER;
  612. tlb_probe();
  613. BARRIER;
  614. pmdp = pmd_offset(pgdp, address);
  615. idx = get_index();
  616. ptep = pte_offset(pmdp, address);
  617. BARRIER;
  618. set_entrylo0(pte_val(*ptep++) >> 6);
  619. set_entrylo1(pte_val(*ptep) >> 6);
  620. set_entryhi(address | (pid));
  621. BARRIER;
  622. if(idx < 0) {
  623. tlb_write_random();
  624. } else {
  625. tlb_write_indexed();
  626. }
  627. BARRIER;
  628. set_entryhi(pid);
  629. BARRIER;
  630. __restore_flags(flags);
  631. }
  632. void show_regs(struct pt_regs * regs)
  633. {
  634. /* Saved main processor registers. */
  635. printk("$0 : %08lx %08lx %08lx %08lxn",
  636.        0UL, regs->regs[1], regs->regs[2], regs->regs[3]);
  637. printk("$4 : %08lx %08lx %08lx %08lxn",
  638.                regs->regs[4], regs->regs[5], regs->regs[6], regs->regs[7]);
  639. printk("$8 : %08lx %08lx %08lx %08lxn",
  640.        regs->regs[8], regs->regs[9], regs->regs[10], regs->regs[11]);
  641. printk("$12: %08lx %08lx %08lx %08lxn",
  642.                regs->regs[12], regs->regs[13], regs->regs[14], regs->regs[15]);
  643. printk("$16: %08lx %08lx %08lx %08lxn",
  644.        regs->regs[16], regs->regs[17], regs->regs[18], regs->regs[19]);
  645. printk("$20: %08lx %08lx %08lx %08lxn",
  646.                regs->regs[20], regs->regs[21], regs->regs[22], regs->regs[23]);
  647. printk("$24: %08lx %08lxn",
  648.        regs->regs[24], regs->regs[25]);
  649. printk("$28: %08lx %08lx %08lx %08lxn",
  650.        regs->regs[28], regs->regs[29], regs->regs[30], regs->regs[31]);
  651. /* Saved cp0 registers. */
  652. printk("epc   : %08lx    %snStatus: %08lxnCause : %08lxn",
  653.        regs->cp0_epc, print_tainted(), regs->cp0_status, regs->cp0_cause);
  654. }
  655. void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
  656.       unsigned long entryhi, unsigned long pagemask)
  657. {
  658.         unsigned long flags;
  659.         unsigned long wired;
  660.         unsigned long old_pagemask;
  661.         unsigned long old_ctx;
  662.         __save_and_cli(flags);
  663.         /* Save old context and create impossible VPN2 value */
  664.         old_ctx = (get_entryhi() & 0xff);
  665.         old_pagemask = get_pagemask();
  666.         wired = get_wired();
  667.         set_wired (wired + 1);
  668.         set_index (wired);
  669.         BARRIER;    
  670.         set_pagemask (pagemask);
  671.         set_entryhi(entryhi);
  672.         set_entrylo0(entrylo0);
  673.         set_entrylo1(entrylo1);
  674.         BARRIER;    
  675.         tlb_write_indexed();
  676.         BARRIER;    
  677.     
  678.         set_entryhi(old_ctx);
  679.         BARRIER;    
  680.         set_pagemask (old_pagemask);
  681.         flush_tlb_all();    
  682.         __restore_flags(flags);
  683. }
  684. /* Detect and size the various caches. */
  685. static void __init probe_icache(unsigned long config)
  686. {
  687.         unsigned long config1;
  688. unsigned int lsize;
  689.         if (!(config & (1 << 31))) {
  690.         /* 
  691.  * Not a MIPS32 complainant CPU. 
  692.  * Config 1 register not supported, we assume R4k style.
  693.  */
  694.         icache_size = 1 << (12 + ((config >> 9) & 7));
  695. ic_lsize = 16 << ((config >> 5) & 1);
  696. mips_cpu.icache.linesz = ic_lsize;
  697. /* 
  698.  * We cannot infer associativity - assume direct map
  699.  * unless probe template indicates otherwise
  700.  */
  701. if(!mips_cpu.icache.ways) mips_cpu.icache.ways = 1;
  702. mips_cpu.icache.sets = 
  703. (icache_size / ic_lsize) / mips_cpu.icache.ways;
  704. } else {
  705.        config1 = read_mips32_cp0_config1(); 
  706.        if ((lsize = ((config1 >> 19) & 7)))
  707.        mips_cpu.icache.linesz = 2 << lsize;
  708.        else 
  709.        mips_cpu.icache.linesz = lsize;
  710.        mips_cpu.icache.sets = 64 << ((config1 >> 22) & 7);
  711.        mips_cpu.icache.ways = 1 + ((config1 >> 16) & 7);
  712.        ic_lsize = mips_cpu.icache.linesz;
  713.        icache_size = mips_cpu.icache.sets * mips_cpu.icache.ways * 
  714.              ic_lsize;
  715. }
  716. printk("Primary instruction cache %dkb, linesize %d bytes (%d ways)n",
  717.        icache_size >> 10, ic_lsize, mips_cpu.icache.ways);
  718. }
  719. static void __init probe_dcache(unsigned long config)
  720. {
  721.         unsigned long config1;
  722. unsigned int lsize;
  723.         if (!(config & (1 << 31))) {
  724.         /* 
  725.  * Not a MIPS32 complainant CPU. 
  726.  * Config 1 register not supported, we assume R4k style.
  727.  */  
  728. dcache_size = 1 << (12 + ((config >> 6) & 7));
  729. dc_lsize = 16 << ((config >> 4) & 1);
  730. mips_cpu.dcache.linesz = dc_lsize;
  731. /* 
  732.  * We cannot infer associativity - assume direct map
  733.  * unless probe template indicates otherwise
  734.  */
  735. if(!mips_cpu.dcache.ways) mips_cpu.dcache.ways = 1;
  736. mips_cpu.dcache.sets = 
  737. (dcache_size / dc_lsize) / mips_cpu.dcache.ways;
  738. } else {
  739.         config1 = read_mips32_cp0_config1();
  740. if ((lsize = ((config1 >> 10) & 7)))
  741.         mips_cpu.dcache.linesz = 2 << lsize;
  742. else 
  743.         mips_cpu.dcache.linesz= lsize;
  744. mips_cpu.dcache.sets = 64 << ((config1 >> 13) & 7);
  745. mips_cpu.dcache.ways = 1 + ((config1 >> 7) & 7);
  746. dc_lsize = mips_cpu.dcache.linesz;
  747. dcache_size = 
  748. mips_cpu.dcache.sets * mips_cpu.dcache.ways
  749. * dc_lsize;
  750. }
  751. printk("Primary data cache %dkb, linesize %d bytes (%d ways)n",
  752.        dcache_size >> 10, dc_lsize, mips_cpu.dcache.ways);
  753. }
  754. /* If you even _breathe_ on this function, look at the gcc output
  755.  * and make sure it does not pop things on and off the stack for
  756.  * the cache sizing loop that executes in KSEG1 space or else
  757.  * you will crash and burn badly.  You have been warned.
  758.  */
  759. static int __init probe_scache(unsigned long config)
  760. {
  761. extern unsigned long stext;
  762. unsigned long flags, addr, begin, end, pow2;
  763. int tmp;
  764. if (mips_cpu.scache.flags == MIPS_CACHE_NOT_PRESENT)
  765. return 0;
  766. tmp = ((config >> 17) & 1);
  767. if(tmp)
  768. return 0;
  769. tmp = ((config >> 22) & 3);
  770. switch(tmp) {
  771. case 0:
  772. sc_lsize = 16;
  773. break;
  774. case 1:
  775. sc_lsize = 32;
  776. break;
  777. case 2:
  778. sc_lsize = 64;
  779. break;
  780. case 3:
  781. sc_lsize = 128;
  782. break;
  783. }
  784. begin = (unsigned long) &stext;
  785. begin &= ~((4 * 1024 * 1024) - 1);
  786. end = begin + (4 * 1024 * 1024);
  787. /* This is such a bitch, you'd think they would make it
  788.  * easy to do this.  Away you daemons of stupidity!
  789.  */
  790. __save_and_cli(flags);
  791. /* Fill each size-multiple cache line with a valid tag. */
  792. pow2 = (64 * 1024);
  793. for(addr = begin; addr < end; addr = (begin + pow2)) {
  794. unsigned long *p = (unsigned long *) addr;
  795. __asm__ __volatile__("nop" : : "r" (*p)); /* whee... */
  796. pow2 <<= 1;
  797. }
  798. /* Load first line with zero (therefore invalid) tag. */
  799. set_taglo(0);
  800. set_taghi(0);
  801. __asm__ __volatile__("nop; nop; nop; nop;"); /* avoid the hazard */
  802. __asm__ __volatile__("nt.set noreordernt"
  803.      ".set mips3nt"
  804.      "cache 8, (%0)nt"
  805.      ".set mips0nt"
  806.      ".set reordernt" : : "r" (begin));
  807. __asm__ __volatile__("nt.set noreordernt"
  808.      ".set mips3nt"
  809.      "cache 9, (%0)nt"
  810.      ".set mips0nt"
  811.      ".set reordernt" : : "r" (begin));
  812. __asm__ __volatile__("nt.set noreordernt"
  813.      ".set mips3nt"
  814.      "cache 11, (%0)nt"
  815.      ".set mips0nt"
  816.      ".set reordernt" : : "r" (begin));
  817. /* Now search for the wrap around point. */
  818. pow2 = (128 * 1024);
  819. tmp = 0;
  820. for(addr = (begin + (128 * 1024)); addr < (end); addr = (begin + pow2)) {
  821. __asm__ __volatile__("nt.set noreordernt"
  822.      ".set mips3nt"
  823.      "cache 7, (%0)nt"
  824.      ".set mips0nt"
  825.      ".set reordernt" : : "r" (addr));
  826. __asm__ __volatile__("nop; nop; nop; nop;"); /* hazard... */
  827. if(!get_taglo())
  828. break;
  829. pow2 <<= 1;
  830. }
  831. __restore_flags(flags);
  832. addr -= begin;
  833. printk("Secondary cache sized at %dK linesize %d bytes.n",
  834.        (int) (addr >> 10), sc_lsize);
  835. scache_size = addr;
  836. return 1;
  837. }
  838. static void __init setup_noscache_funcs(void)
  839. {
  840. _clear_page = (void *)mips32_clear_page_dc;
  841. _copy_page = (void *)mips32_copy_page_dc;
  842. _flush_cache_all = mips32_flush_cache_all_pc;
  843. ___flush_cache_all = mips32_flush_cache_all_pc;
  844. _flush_cache_mm = mips32_flush_cache_mm_pc;
  845. _flush_cache_range = mips32_flush_cache_range_pc;
  846. _flush_cache_page = mips32_flush_cache_page_pc;
  847. _flush_page_to_ram = mips32_flush_page_to_ram_pc;
  848. _flush_icache_page = mips32_flush_icache_page;
  849. _dma_cache_wback_inv = mips32_dma_cache_wback_inv_pc;
  850. _dma_cache_wback = mips32_dma_cache_wback;
  851. _dma_cache_inv = mips32_dma_cache_inv_pc;
  852. }
  853. static void __init setup_scache_funcs(void)
  854. {
  855.         _flush_cache_all = mips32_flush_cache_all_sc;
  856.         ___flush_cache_all = mips32_flush_cache_all_sc;
  857. _flush_cache_mm = mips32_flush_cache_mm_sc;
  858. _flush_cache_range = mips32_flush_cache_range_sc;
  859. _flush_cache_page = mips32_flush_cache_page_sc;
  860. _flush_page_to_ram = mips32_flush_page_to_ram_sc;
  861. _clear_page = (void *)mips32_clear_page_sc;
  862. _copy_page = (void *)mips32_copy_page_sc;
  863. _flush_icache_page = mips32_flush_icache_page_s;
  864. _dma_cache_wback_inv = mips32_dma_cache_wback_inv_sc;
  865. _dma_cache_wback = mips32_dma_cache_wback;
  866. _dma_cache_inv = mips32_dma_cache_inv_sc;
  867. }
  868. typedef int (*probe_func_t)(unsigned long);
  869. static inline void __init setup_scache(unsigned int config)
  870. {
  871. probe_func_t probe_scache_kseg1;
  872. int sc_present = 0;
  873. /* Maybe the cpu knows about a l2 cache? */
  874. probe_scache_kseg1 = (probe_func_t) (KSEG1ADDR(&probe_scache));
  875. sc_present = probe_scache_kseg1(config);
  876. if (sc_present) {
  877.    mips_cpu.scache.linesz = sc_lsize;
  878. /* 
  879.  * We cannot infer associativity - assume direct map
  880.  * unless probe template indicates otherwise
  881.  */
  882. if(!mips_cpu.scache.ways) mips_cpu.scache.ways = 1;
  883. mips_cpu.scache.sets = 
  884.   (scache_size / sc_lsize) / mips_cpu.scache.ways;
  885. setup_scache_funcs();
  886. return;
  887. }
  888. setup_noscache_funcs();
  889. }
  890. static void __init probe_tlb(unsigned long config)
  891. {
  892.         unsigned long config1;
  893.         if (!(config & (1 << 31))) {
  894.         /* 
  895.  * Not a MIPS32 complainant CPU. 
  896.  * Config 1 register not supported, we assume R4k style.
  897.  */  
  898.         mips_cpu.tlbsize = 48;
  899. } else {
  900.         config1 = read_mips32_cp0_config1();
  901. if (!((config >> 7) & 3))
  902.         panic("No MMU present");
  903. else
  904.         mips_cpu.tlbsize = ((config1 >> 25) & 0x3f) + 1;
  905. }
  906. printk("Number of TLB entries %d.n", mips_cpu.tlbsize);
  907. }
  908. void __init ld_mmu_mips32(void)
  909. {
  910. unsigned long config = read_32bit_cp0_register(CP0_CONFIG);
  911. printk("CPU revision is: %08xn", read_32bit_cp0_register(CP0_PRID));
  912. #ifdef CONFIG_MIPS_UNCACHED
  913. change_cp0_config(CONF_CM_CMASK, CONF_CM_UNCACHED);
  914. #else
  915. change_cp0_config(CONF_CM_CMASK, CONF_CM_CACHABLE_NONCOHERENT);
  916. #endif
  917. probe_icache(config);
  918. probe_dcache(config);
  919. setup_scache(config);
  920. probe_tlb(config);
  921. _flush_cache_sigtramp = mips32_flush_cache_sigtramp;
  922. _flush_icache_range = mips32_flush_icache_range; /* Ouch */
  923. __flush_cache_all();
  924. write_32bit_cp0_register(CP0_WIRED, 0);
  925. /*
  926.  * You should never change this register:
  927.  *   - The entire mm handling assumes the c0_pagemask register to
  928.  *     be set for 4kb pages.
  929.  */
  930. write_32bit_cp0_register(CP0_PAGEMASK, PM_4K);
  931. flush_tlb_all();
  932. }