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

嵌入式Linux

开发平台:

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/init.h>
  18. #include <linux/kernel.h>
  19. #include <linux/sched.h>
  20. #include <linux/mm.h>
  21. #include <asm/bootinfo.h>
  22. #include <asm/cpu.h>
  23. #include <asm/bcache.h>
  24. #include <asm/io.h>
  25. #include <asm/page.h>
  26. #include <asm/pgtable.h>
  27. #include <asm/system.h>
  28. #include <asm/mmu_context.h>
  29. /* CP0 hazard avoidance. */
  30. #define BARRIER __asm__ __volatile__(".set noreordernt" 
  31.      "nop; nop; nop; nop; nop; nop;nt" 
  32.      ".set reordernt")
  33. /* Primary cache parameters. */
  34. static int icache_size, dcache_size; /* Size in bytes */
  35. static int ic_lsize, dc_lsize;       /* LineSize in bytes */
  36. /* Secondary cache (if present) parameters. */
  37. static unsigned int scache_size, sc_lsize; /* Again, in bytes */
  38. #include <asm/cacheops.h>
  39. #include <asm/r4kcache.h>
  40. #undef DEBUG_CACHE
  41. /*
  42.  * Dummy cache handling routines for machines without boardcaches
  43.  */
  44. static void no_sc_noop(void) {}
  45. static struct bcache_ops no_sc_ops = {
  46. (void *)no_sc_noop, (void *)no_sc_noop,
  47. (void *)no_sc_noop, (void *)no_sc_noop
  48. };
  49. struct bcache_ops *bcops = &no_sc_ops;
  50. /*
  51.  * On processors with QED R4600 style two set assosicative cache
  52.  * this is the bit which selects the way in the cache for the
  53.  * indexed cachops.
  54.  */
  55. #define icache_waybit (icache_size >> 1)
  56. #define dcache_waybit (dcache_size >> 1)
  57. /*
  58.  * Zero an entire page.  Basically a simple unrolled loop should do the
  59.  * job but we want more performance by saving memory bus bandwidth.  We
  60.  * have five flavours of the routine available for:
  61.  *
  62.  * - 16byte cachelines and no second level cache
  63.  * - 32byte cachelines second level cache
  64.  * - a version which handles the buggy R4600 v1.x
  65.  * - a version which handles the buggy R4600 v2.0
  66.  * - Finally a last version without fancy cache games for the SC and MC
  67.  *   versions of R4000 and R4400.
  68.  */
  69. static void r4k_clear_page_d16(void * page)
  70. {
  71. __asm__ __volatile__(
  72. ".settnoreordernt"
  73. ".settnoatnt"
  74. ".settmips3nt"
  75. "daddiut$1,%0,%2n"
  76. "1:tcachet%3,(%0)nt"
  77. "sdt$0,(%0)nt"
  78. "sdt$0,8(%0)nt"
  79. "cachet%3,16(%0)nt"
  80. "sdt$0,16(%0)nt"
  81. "sdt$0,24(%0)nt"
  82. "daddiut%0,64nt"
  83. "cachet%3,-32(%0)nt"
  84. "sdt$0,-32(%0)nt"
  85. "sdt$0,-24(%0)nt"
  86. "cachet%3,-16(%0)nt"
  87. "sdt$0,-16(%0)nt"
  88. "bnet$1,%0,1bnt"
  89. "sdt$0,-8(%0)nt"
  90. ".settmips0nt"
  91. ".settatnt"
  92. ".settreorder"
  93. :"=r" (page)
  94. :"0" (page),
  95.  "I" (PAGE_SIZE),
  96.  "i" (Create_Dirty_Excl_D)
  97. :"$1","memory");
  98. }
  99. static void r4k_clear_page_d32(void * page)
  100. {
  101. __asm__ __volatile__(
  102. ".settnoreordernt"
  103. ".settnoatnt"
  104. ".settmips3nt"
  105. "daddiut$1,%0,%2n"
  106. "1:tcachet%3,(%0)nt"
  107. "sdt$0,(%0)nt"
  108. "sdt$0,8(%0)nt"
  109. "sdt$0,16(%0)nt"
  110. "sdt$0,24(%0)nt"
  111. "daddiut%0,64nt"
  112. "cachet%3,-32(%0)nt"
  113. "sdt$0,-32(%0)nt"
  114. "sdt$0,-24(%0)nt"
  115. "sdt$0,-16(%0)nt"
  116. "bnet$1,%0,1bnt"
  117. "sdt$0,-8(%0)nt"
  118. ".settmips0nt"
  119. ".settatnt"
  120. ".settreorder"
  121. :"=r" (page)
  122. :"0" (page),
  123.  "I" (PAGE_SIZE),
  124.  "i" (Create_Dirty_Excl_D)
  125. :"$1","memory");
  126. }
  127. /*
  128.  * This flavour of r4k_clear_page is for the R4600 V1.x.  Cite from the
  129.  * IDT R4600 V1.7 errata:
  130.  *
  131.  *  18. The CACHE instructions Hit_Writeback_Invalidate_D, Hit_Writeback_D,
  132.  *      Hit_Invalidate_D and Create_Dirty_Excl_D should only be
  133.  *      executed if there is no other dcache activity. If the dcache is
  134.  *      accessed for another instruction immeidately preceding when these
  135.  *      cache instructions are executing, it is possible that the dcache 
  136.  *      tag match outputs used by these cache instructions will be 
  137.  *      incorrect. These cache instructions should be preceded by at least
  138.  *      four instructions that are not any kind of load or store 
  139.  *      instruction.
  140.  *
  141.  *      This is not allowed:    lw
  142.  *                              nop
  143.  *                              nop
  144.  *                              nop
  145.  *                              cache       Hit_Writeback_Invalidate_D
  146.  *
  147.  *      This is allowed:        lw
  148.  *                              nop
  149.  *                              nop
  150.  *                              nop
  151.  *                              nop
  152.  *                              cache       Hit_Writeback_Invalidate_D
  153.  */
  154. static void r4k_clear_page_r4600_v1(void * page)
  155. {
  156. __asm__ __volatile__(
  157. ".settnoreordernt"
  158. ".settnoatnt"
  159. ".settmips3nt"
  160. "daddiut$1,%0,%2n"
  161. "1:tnopnt"
  162. "nopnt"
  163. "nopnt"
  164. "nopnt"
  165. "cachet%3,(%0)nt"
  166. "sdt$0,(%0)nt"
  167. "sdt$0,8(%0)nt"
  168. "sdt$0,16(%0)nt"
  169. "sdt$0,24(%0)nt"
  170. "daddiut%0,64nt"
  171. "nopnt"
  172. "nopnt"
  173. "nopnt"
  174. "cachet%3,-32(%0)nt"
  175. "sdt$0,-32(%0)nt"
  176. "sdt$0,-24(%0)nt"
  177. "sdt$0,-16(%0)nt"
  178. "bnet$1,%0,1bnt"
  179. "sdt$0,-8(%0)nt"
  180. ".settmips0nt"
  181. ".settatnt"
  182. ".settreorder"
  183. :"=r" (page)
  184. :"0" (page),
  185.  "I" (PAGE_SIZE),
  186.  "i" (Create_Dirty_Excl_D)
  187. :"$1","memory");
  188. }
  189. /*
  190.  * And this one is for the R4600 V2.0
  191.  */
  192. static void r4k_clear_page_r4600_v2(void * page)
  193. {
  194. unsigned int flags;
  195. __save_and_cli(flags);
  196. *(volatile unsigned int *)KSEG1;
  197. __asm__ __volatile__(
  198. ".settnoreordernt"
  199. ".settnoatnt"
  200. ".settmips3nt"
  201. "daddiut$1,%0,%2n"
  202. "1:tcachet%3,(%0)nt"
  203. "sdt$0,(%0)nt"
  204. "sdt$0,8(%0)nt"
  205. "sdt$0,16(%0)nt"
  206. "sdt$0,24(%0)nt"
  207. "daddiut%0,64nt"
  208. "cachet%3,-32(%0)nt"
  209. "sdt$0,-32(%0)nt"
  210. "sdt$0,-24(%0)nt"
  211. "sdt$0,-16(%0)nt"
  212. "bnet$1,%0,1bnt"
  213. "sdt$0,-8(%0)nt"
  214. ".settmips0nt"
  215. ".settatnt"
  216. ".settreorder"
  217. :"=r" (page)
  218. :"0" (page),
  219.  "I" (PAGE_SIZE),
  220.  "i" (Create_Dirty_Excl_D)
  221. :"$1","memory");
  222. __restore_flags(flags);
  223. }
  224. /*
  225.  * The next 4 versions are optimized for all possible scache configurations
  226.  * of the SC / MC versions of R4000 and R4400 ...
  227.  *
  228.  * Todo: For even better performance we should have a routine optimized for
  229.  * every legal combination of dcache / scache linesize.  When I (Ralf) tried
  230.  * this the kernel crashed shortly after mounting the root filesystem.  CPU
  231.  * bug?  Weirdo cache instruction semantics?
  232.  */
  233. static void r4k_clear_page_s16(void * page)
  234. {
  235. __asm__ __volatile__(
  236. ".settnoreordernt"
  237. ".settnoatnt"
  238. ".settmips3nt"
  239. "daddiut$1,%0,%2n"
  240. "1:tcachet%3,(%0)nt"
  241. "sdt$0,(%0)nt"
  242. "sdt$0,8(%0)nt"
  243. "cachet%3,16(%0)nt"
  244. "sdt$0,16(%0)nt"
  245. "sdt$0,24(%0)nt"
  246. "daddiut%0,64nt"
  247. "cachet%3,-32(%0)nt"
  248. "sdt$0,-32(%0)nt"
  249. "sdt$0,-24(%0)nt"
  250. "cachet%3,-16(%0)nt"
  251. "sdt$0,-16(%0)nt"
  252. "bnet$1,%0,1bnt"
  253. "sdt$0,-8(%0)nt"
  254. ".settmips0nt"
  255. ".settatnt"
  256. ".settreorder"
  257. :"=r" (page)
  258. :"0" (page),
  259.  "I" (PAGE_SIZE),
  260.  "i" (Create_Dirty_Excl_SD)
  261. :"$1","memory");
  262. }
  263. static void r4k_clear_page_s32(void * page)
  264. {
  265. __asm__ __volatile__(
  266. ".settnoreordernt"
  267. ".settnoatnt"
  268. ".settmips3nt"
  269. "daddiut$1,%0,%2n"
  270. "1:tcachet%3,(%0)nt"
  271. "sdt$0,(%0)nt"
  272. "sdt$0,8(%0)nt"
  273. "sdt$0,16(%0)nt"
  274. "sdt$0,24(%0)nt"
  275. "daddiut%0,64nt"
  276. "cachet%3,-32(%0)nt"
  277. "sdt$0,-32(%0)nt"
  278. "sdt$0,-24(%0)nt"
  279. "sdt$0,-16(%0)nt"
  280. "bnet$1,%0,1bnt"
  281. "sdt$0,-8(%0)nt"
  282. ".settmips0nt"
  283. ".settatnt"
  284. ".settreorder"
  285. :"=r" (page)
  286. :"0" (page),
  287.  "I" (PAGE_SIZE),
  288.  "i" (Create_Dirty_Excl_SD)
  289. :"$1","memory");
  290. }
  291. static void r4k_clear_page_s64(void * page)
  292. {
  293. __asm__ __volatile__(
  294. ".settnoreordernt"
  295. ".settnoatnt"
  296. ".settmips3nt"
  297. "daddiut$1,%0,%2n"
  298. "1:tcachet%3,(%0)nt"
  299. "sdt$0,(%0)nt"
  300. "sdt$0,8(%0)nt"
  301. "sdt$0,16(%0)nt"
  302. "sdt$0,24(%0)nt"
  303. "daddiut%0,64nt"
  304. "sdt$0,-32(%0)nt"
  305. "sdt$0,-24(%0)nt"
  306. "sdt$0,-16(%0)nt"
  307. "bnet$1,%0,1bnt"
  308. "sdt$0,-8(%0)nt"
  309. ".settmips0nt"
  310. ".settatnt"
  311. ".settreorder"
  312. :"=r" (page)
  313. :"0" (page),
  314.  "I" (PAGE_SIZE),
  315.  "i" (Create_Dirty_Excl_SD)
  316. :"$1","memory");
  317. }
  318. static void r4k_clear_page_s128(void * page)
  319. {
  320. __asm__ __volatile__(
  321. ".settnoreordernt"
  322. ".settnoatnt"
  323. ".settmips3nt"
  324. "daddiut$1,%0,%2n"
  325. "1:tcachet%3,(%0)nt"
  326. "sdt$0,(%0)nt"
  327. "sdt$0,8(%0)nt"
  328. "sdt$0,16(%0)nt"
  329. "sdt$0,24(%0)nt"
  330. "sdt$0,32(%0)nt"
  331. "sdt$0,40(%0)nt"
  332. "sdt$0,48(%0)nt"
  333. "sdt$0,56(%0)nt"
  334. "daddiut%0,128nt"
  335. "sdt$0,-64(%0)nt"
  336. "sdt$0,-56(%0)nt"
  337. "sdt$0,-48(%0)nt"
  338. "sdt$0,-40(%0)nt"
  339. "sdt$0,-32(%0)nt"
  340. "sdt$0,-24(%0)nt"
  341. "sdt$0,-16(%0)nt"
  342. "bnet$1,%0,1bnt"
  343. "sdt$0,-8(%0)nt"
  344. ".settmips0nt"
  345. ".settatnt"
  346. ".settreorder"
  347. :"=r" (page)
  348. :"0" (page),
  349.  "I" (PAGE_SIZE),
  350.  "i" (Create_Dirty_Excl_SD)
  351. :"$1","memory");
  352. }
  353. /*
  354.  * This is still inefficient.  We only can do better if we know the
  355.  * virtual address where the copy will be accessed.
  356.  */
  357. static void r4k_copy_page_d16(void * to, void * from)
  358. {
  359. unsigned long dummy1, dummy2;
  360. unsigned long reg1, reg2, reg3, reg4;
  361. __asm__ __volatile__(
  362. ".settnoreordernt"
  363. ".settnoatnt"
  364. ".settmips3nt"
  365. "daddiut$1,%0,%8n"
  366. "1:tcachet%9,(%0)nt"
  367. "lwt%2,(%1)nt"
  368. "lwt%3,4(%1)nt"
  369. "lwt%4,8(%1)nt"
  370. "lwt%5,12(%1)nt"
  371. "swt%2,(%0)nt"
  372. "swt%3,4(%0)nt"
  373. "swt%4,8(%0)nt"
  374. "swt%5,12(%0)nt"
  375. "cachet%9,16(%0)nt"
  376. "lwt%2,16(%1)nt"
  377. "lwt%3,20(%1)nt"
  378. "lwt%4,24(%1)nt"
  379. "lwt%5,28(%1)nt"
  380. "swt%2,16(%0)nt"
  381. "swt%3,20(%0)nt"
  382. "swt%4,24(%0)nt"
  383. "swt%5,28(%0)nt"
  384. "cachet%9,32(%0)nt"
  385. "daddiut%0,64nt"
  386. "daddiut%1,64nt"
  387. "lwt%2,-32(%1)nt"
  388. "lwt%3,-28(%1)nt"
  389. "lwt%4,-24(%1)nt"
  390. "lwt%5,-20(%1)nt"
  391. "swt%2,-32(%0)nt"
  392. "swt%3,-28(%0)nt"
  393. "swt%4,-24(%0)nt"
  394. "swt%5,-20(%0)nt"
  395. "cachet%9,-16(%0)nt"
  396. "lwt%2,-16(%1)nt"
  397. "lwt%3,-12(%1)nt"
  398. "lwt%4,-8(%1)nt"
  399. "lwt%5,-4(%1)nt"
  400. "swt%2,-16(%0)nt"
  401. "swt%3,-12(%0)nt"
  402. "swt%4,-8(%0)nt"
  403. "bnet$1,%0,1bnt"
  404. "swt%5,-4(%0)nt"
  405. ".settmips0nt"
  406. ".settatnt"
  407. ".settreorder"
  408. :"=r" (dummy1), "=r" (dummy2),
  409.  "=&r" (reg1), "=&r" (reg2), "=&r" (reg3), "=&r" (reg4)
  410. :"0" (to), "1" (from),
  411.  "I" (PAGE_SIZE),
  412.  "i" (Create_Dirty_Excl_D));
  413. }
  414. static void r4k_copy_page_d32(void * to, void * from)
  415. {
  416. unsigned long dummy1, dummy2;
  417. unsigned long reg1, reg2, reg3, reg4;
  418. __asm__ __volatile__(
  419. ".settnoreordernt"
  420. ".settnoatnt"
  421. ".settmips3nt"
  422. "daddiut$1,%0,%8n"
  423. "1:tcachet%9,(%0)nt"
  424. "lwt%2,(%1)nt"
  425. "lwt%3,4(%1)nt"
  426. "lwt%4,8(%1)nt"
  427. "lwt%5,12(%1)nt"
  428. "swt%2,(%0)nt"
  429. "swt%3,4(%0)nt"
  430. "swt%4,8(%0)nt"
  431. "swt%5,12(%0)nt"
  432. "lwt%2,16(%1)nt"
  433. "lwt%3,20(%1)nt"
  434. "lwt%4,24(%1)nt"
  435. "lwt%5,28(%1)nt"
  436. "swt%2,16(%0)nt"
  437. "swt%3,20(%0)nt"
  438. "swt%4,24(%0)nt"
  439. "swt%5,28(%0)nt"
  440. "cachet%9,32(%0)nt"
  441. "daddiut%0,64nt"
  442. "daddiut%1,64nt"
  443. "lwt%2,-32(%1)nt"
  444. "lwt%3,-28(%1)nt"
  445. "lwt%4,-24(%1)nt"
  446. "lwt%5,-20(%1)nt"
  447. "swt%2,-32(%0)nt"
  448. "swt%3,-28(%0)nt"
  449. "swt%4,-24(%0)nt"
  450. "swt%5,-20(%0)nt"
  451. "lwt%2,-16(%1)nt"
  452. "lwt%3,-12(%1)nt"
  453. "lwt%4,-8(%1)nt"
  454. "lwt%5,-4(%1)nt"
  455. "swt%2,-16(%0)nt"
  456. "swt%3,-12(%0)nt"
  457. "swt%4,-8(%0)nt"
  458. "bnet$1,%0,1bnt"
  459. "swt%5,-4(%0)nt"
  460. ".settmips0nt"
  461. ".settatnt"
  462. ".settreorder"
  463. :"=r" (dummy1), "=r" (dummy2),
  464.  "=&r" (reg1), "=&r" (reg2), "=&r" (reg3), "=&r" (reg4)
  465. :"0" (to), "1" (from),
  466.  "I" (PAGE_SIZE),
  467.  "i" (Create_Dirty_Excl_D));
  468. }
  469. /*
  470.  * Again a special version for the R4600 V1.x
  471.  */
  472. static void r4k_copy_page_r4600_v1(void * to, void * from)
  473. {
  474. unsigned long dummy1, dummy2;
  475. unsigned long reg1, reg2, reg3, reg4;
  476. __asm__ __volatile__(
  477. ".settnoreordernt"
  478. ".settnoatnt"
  479. ".settmips3nt"
  480. "daddiut$1,%0,%8n"
  481. "1:tnopnt"
  482. "nopnt"
  483. "nopnt"
  484. "nopnt"
  485. "tcachet%9,(%0)nt"
  486. "lwt%2,(%1)nt"
  487. "lwt%3,4(%1)nt"
  488. "lwt%4,8(%1)nt"
  489. "lwt%5,12(%1)nt"
  490. "swt%2,(%0)nt"
  491. "swt%3,4(%0)nt"
  492. "swt%4,8(%0)nt"
  493. "swt%5,12(%0)nt"
  494. "lwt%2,16(%1)nt"
  495. "lwt%3,20(%1)nt"
  496. "lwt%4,24(%1)nt"
  497. "lwt%5,28(%1)nt"
  498. "swt%2,16(%0)nt"
  499. "swt%3,20(%0)nt"
  500. "swt%4,24(%0)nt"
  501. "swt%5,28(%0)nt"
  502. "nopnt"
  503. "nopnt"
  504. "nopnt"
  505. "nopnt"
  506. "cachet%9,32(%0)nt"
  507. "daddiut%0,64nt"
  508. "daddiut%1,64nt"
  509. "lwt%2,-32(%1)nt"
  510. "lwt%3,-28(%1)nt"
  511. "lwt%4,-24(%1)nt"
  512. "lwt%5,-20(%1)nt"
  513. "swt%2,-32(%0)nt"
  514. "swt%3,-28(%0)nt"
  515. "swt%4,-24(%0)nt"
  516. "swt%5,-20(%0)nt"
  517. "lwt%2,-16(%1)nt"
  518. "lwt%3,-12(%1)nt"
  519. "lwt%4,-8(%1)nt"
  520. "lwt%5,-4(%1)nt"
  521. "swt%2,-16(%0)nt"
  522. "swt%3,-12(%0)nt"
  523. "swt%4,-8(%0)nt"
  524. "bnet$1,%0,1bnt"
  525. "swt%5,-4(%0)nt"
  526. ".settmips0nt"
  527. ".settatnt"
  528. ".settreorder"
  529. :"=r" (dummy1), "=r" (dummy2),
  530.  "=&r" (reg1), "=&r" (reg2), "=&r" (reg3), "=&r" (reg4)
  531. :"0" (to), "1" (from),
  532.  "I" (PAGE_SIZE),
  533.  "i" (Create_Dirty_Excl_D));
  534. }
  535. static void r4k_copy_page_r4600_v2(void * to, void * from)
  536. {
  537. unsigned long dummy1, dummy2;
  538. unsigned long reg1, reg2, reg3, reg4;
  539. unsigned int flags;
  540. __save_and_cli(flags);
  541. __asm__ __volatile__(
  542. ".settnoreordernt"
  543. ".settnoatnt"
  544. ".settmips3nt"
  545. "daddiut$1,%0,%8n"
  546. "1:tnopnt"
  547. "nopnt"
  548. "nopnt"
  549. "nopnt"
  550. "tcachet%9,(%0)nt"
  551. "lwt%2,(%1)nt"
  552. "lwt%3,4(%1)nt"
  553. "lwt%4,8(%1)nt"
  554. "lwt%5,12(%1)nt"
  555. "swt%2,(%0)nt"
  556. "swt%3,4(%0)nt"
  557. "swt%4,8(%0)nt"
  558. "swt%5,12(%0)nt"
  559. "lwt%2,16(%1)nt"
  560. "lwt%3,20(%1)nt"
  561. "lwt%4,24(%1)nt"
  562. "lwt%5,28(%1)nt"
  563. "swt%2,16(%0)nt"
  564. "swt%3,20(%0)nt"
  565. "swt%4,24(%0)nt"
  566. "swt%5,28(%0)nt"
  567. "nopnt"
  568. "nopnt"
  569. "nopnt"
  570. "nopnt"
  571. "cachet%9,32(%0)nt"
  572. "daddiut%0,64nt"
  573. "daddiut%1,64nt"
  574. "lwt%2,-32(%1)nt"
  575. "lwt%3,-28(%1)nt"
  576. "lwt%4,-24(%1)nt"
  577. "lwt%5,-20(%1)nt"
  578. "swt%2,-32(%0)nt"
  579. "swt%3,-28(%0)nt"
  580. "swt%4,-24(%0)nt"
  581. "swt%5,-20(%0)nt"
  582. "lwt%2,-16(%1)nt"
  583. "lwt%3,-12(%1)nt"
  584. "lwt%4,-8(%1)nt"
  585. "lwt%5,-4(%1)nt"
  586. "swt%2,-16(%0)nt"
  587. "swt%3,-12(%0)nt"
  588. "swt%4,-8(%0)nt"
  589. "bnet$1,%0,1bnt"
  590. "swt%5,-4(%0)nt"
  591. ".settmips0nt"
  592. ".settatnt"
  593. ".settreorder"
  594. :"=r" (dummy1), "=r" (dummy2),
  595.  "=&r" (reg1), "=&r" (reg2), "=&r" (reg3), "=&r" (reg4)
  596. :"0" (to), "1" (from),
  597.  "I" (PAGE_SIZE),
  598.  "i" (Create_Dirty_Excl_D));
  599. __restore_flags(flags);
  600. }
  601. /*
  602.  * These are for R4000SC / R4400MC
  603.  */
  604. static void r4k_copy_page_s16(void * to, void * from)
  605. {
  606. unsigned long dummy1, dummy2;
  607. unsigned long reg1, reg2, reg3, reg4;
  608. __asm__ __volatile__(
  609. ".settnoreordernt"
  610. ".settnoatnt"
  611. ".settmips3nt"
  612. "daddiut$1,%0,%8n"
  613. "1:tcachet%9,(%0)nt"
  614. "lwt%2,(%1)nt"
  615. "lwt%3,4(%1)nt"
  616. "lwt%4,8(%1)nt"
  617. "lwt%5,12(%1)nt"
  618. "swt%2,(%0)nt"
  619. "swt%3,4(%0)nt"
  620. "swt%4,8(%0)nt"
  621. "swt%5,12(%0)nt"
  622. "cachet%9,16(%0)nt"
  623. "lwt%2,16(%1)nt"
  624. "lwt%3,20(%1)nt"
  625. "lwt%4,24(%1)nt"
  626. "lwt%5,28(%1)nt"
  627. "swt%2,16(%0)nt"
  628. "swt%3,20(%0)nt"
  629. "swt%4,24(%0)nt"
  630. "swt%5,28(%0)nt"
  631. "cachet%9,32(%0)nt"
  632. "daddiut%0,64nt"
  633. "daddiut%1,64nt"
  634. "lwt%2,-32(%1)nt"
  635. "lwt%3,-28(%1)nt"
  636. "lwt%4,-24(%1)nt"
  637. "lwt%5,-20(%1)nt"
  638. "swt%2,-32(%0)nt"
  639. "swt%3,-28(%0)nt"
  640. "swt%4,-24(%0)nt"
  641. "swt%5,-20(%0)nt"
  642. "cachet%9,-16(%0)nt"
  643. "lwt%2,-16(%1)nt"
  644. "lwt%3,-12(%1)nt"
  645. "lwt%4,-8(%1)nt"
  646. "lwt%5,-4(%1)nt"
  647. "swt%2,-16(%0)nt"
  648. "swt%3,-12(%0)nt"
  649. "swt%4,-8(%0)nt"
  650. "bnet$1,%0,1bnt"
  651. "swt%5,-4(%0)nt"
  652. ".settmips0nt"
  653. ".settatnt"
  654. ".settreorder"
  655. :"=r" (dummy1), "=r" (dummy2),
  656.  "=&r" (reg1), "=&r" (reg2), "=&r" (reg3), "=&r" (reg4)
  657. :"0" (to), "1" (from),
  658.  "I" (PAGE_SIZE),
  659.  "i" (Create_Dirty_Excl_SD));
  660. }
  661. static void r4k_copy_page_s32(void * to, void * from)
  662. {
  663. unsigned long dummy1, dummy2;
  664. unsigned long reg1, reg2, reg3, reg4;
  665. __asm__ __volatile__(
  666. ".settnoreordernt"
  667. ".settnoatnt"
  668. ".settmips3nt"
  669. "daddiut$1,%0,%8n"
  670. "1:tcachet%9,(%0)nt"
  671. "lwt%2,(%1)nt"
  672. "lwt%3,4(%1)nt"
  673. "lwt%4,8(%1)nt"
  674. "lwt%5,12(%1)nt"
  675. "swt%2,(%0)nt"
  676. "swt%3,4(%0)nt"
  677. "swt%4,8(%0)nt"
  678. "swt%5,12(%0)nt"
  679. "lwt%2,16(%1)nt"
  680. "lwt%3,20(%1)nt"
  681. "lwt%4,24(%1)nt"
  682. "lwt%5,28(%1)nt"
  683. "swt%2,16(%0)nt"
  684. "swt%3,20(%0)nt"
  685. "swt%4,24(%0)nt"
  686. "swt%5,28(%0)nt"
  687. "cachet%9,32(%0)nt"
  688. "daddiut%0,64nt"
  689. "daddiut%1,64nt"
  690. "lwt%2,-32(%1)nt"
  691. "lwt%3,-28(%1)nt"
  692. "lwt%4,-24(%1)nt"
  693. "lwt%5,-20(%1)nt"
  694. "swt%2,-32(%0)nt"
  695. "swt%3,-28(%0)nt"
  696. "swt%4,-24(%0)nt"
  697. "swt%5,-20(%0)nt"
  698. "lwt%2,-16(%1)nt"
  699. "lwt%3,-12(%1)nt"
  700. "lwt%4,-8(%1)nt"
  701. "lwt%5,-4(%1)nt"
  702. "swt%2,-16(%0)nt"
  703. "swt%3,-12(%0)nt"
  704. "swt%4,-8(%0)nt"
  705. "bnet$1,%0,1bnt"
  706. "swt%5,-4(%0)nt"
  707. ".settmips0nt"
  708. ".settatnt"
  709. ".settreorder"
  710. :"=r" (dummy1), "=r" (dummy2),
  711.  "=&r" (reg1), "=&r" (reg2), "=&r" (reg3), "=&r" (reg4)
  712. :"0" (to), "1" (from),
  713.  "I" (PAGE_SIZE),
  714.  "i" (Create_Dirty_Excl_SD));
  715. }
  716. static void r4k_copy_page_s64(void * to, void * from)
  717. {
  718. unsigned long dummy1, dummy2;
  719. unsigned long reg1, reg2, reg3, reg4;
  720. __asm__ __volatile__(
  721. ".settnoreordernt"
  722. ".settnoatnt"
  723. ".settmips3nt"
  724. "daddiut$1,%0,%8n"
  725. "1:tcachet%9,(%0)nt"
  726. "lwt%2,(%1)nt"
  727. "lwt%3,4(%1)nt"
  728. "lwt%4,8(%1)nt"
  729. "lwt%5,12(%1)nt"
  730. "swt%2,(%0)nt"
  731. "swt%3,4(%0)nt"
  732. "swt%4,8(%0)nt"
  733. "swt%5,12(%0)nt"
  734. "lwt%2,16(%1)nt"
  735. "lwt%3,20(%1)nt"
  736. "lwt%4,24(%1)nt"
  737. "lwt%5,28(%1)nt"
  738. "swt%2,16(%0)nt"
  739. "swt%3,20(%0)nt"
  740. "swt%4,24(%0)nt"
  741. "swt%5,28(%0)nt"
  742. "daddiut%0,64nt"
  743. "daddiut%1,64nt"
  744. "lwt%2,-32(%1)nt"
  745. "lwt%3,-28(%1)nt"
  746. "lwt%4,-24(%1)nt"
  747. "lwt%5,-20(%1)nt"
  748. "swt%2,-32(%0)nt"
  749. "swt%3,-28(%0)nt"
  750. "swt%4,-24(%0)nt"
  751. "swt%5,-20(%0)nt"
  752. "lwt%2,-16(%1)nt"
  753. "lwt%3,-12(%1)nt"
  754. "lwt%4,-8(%1)nt"
  755. "lwt%5,-4(%1)nt"
  756. "swt%2,-16(%0)nt"
  757. "swt%3,-12(%0)nt"
  758. "swt%4,-8(%0)nt"
  759. "bnet$1,%0,1bnt"
  760. "swt%5,-4(%0)nt"
  761. ".settmips0nt"
  762. ".settatnt"
  763. ".settreorder"
  764. :"=r" (dummy1), "=r" (dummy2),
  765.  "=&r" (reg1), "=&r" (reg2), "=&r" (reg3), "=&r" (reg4)
  766. :"0" (to), "1" (from),
  767.  "I" (PAGE_SIZE),
  768.  "i" (Create_Dirty_Excl_SD));
  769. }
  770. static void r4k_copy_page_s128(void * to, void * from)
  771. {
  772. unsigned long dummy1, dummy2;
  773. unsigned long reg1, reg2, reg3, reg4;
  774. __asm__ __volatile__(
  775. ".settnoreordernt"
  776. ".settnoatnt"
  777. ".settmips3nt"
  778. "daddiut$1,%0,%8n"
  779. "1:tcachet%9,(%0)nt"
  780. "lwt%2,(%1)nt"
  781. "lwt%3,4(%1)nt"
  782. "lwt%4,8(%1)nt"
  783. "lwt%5,12(%1)nt"
  784. "swt%2,(%0)nt"
  785. "swt%3,4(%0)nt"
  786. "swt%4,8(%0)nt"
  787. "swt%5,12(%0)nt"
  788. "lwt%2,16(%1)nt"
  789. "lwt%3,20(%1)nt"
  790. "lwt%4,24(%1)nt"
  791. "lwt%5,28(%1)nt"
  792. "swt%2,16(%0)nt"
  793. "swt%3,20(%0)nt"
  794. "swt%4,24(%0)nt"
  795. "swt%5,28(%0)nt"
  796. "lwt%2,32(%1)nt"
  797. "lwt%3,36(%1)nt"
  798. "lwt%4,40(%1)nt"
  799. "lwt%5,44(%1)nt"
  800. "swt%2,32(%0)nt"
  801. "swt%3,36(%0)nt"
  802. "swt%4,40(%0)nt"
  803. "swt%5,44(%0)nt"
  804. "lwt%2,48(%1)nt"
  805. "lwt%3,52(%1)nt"
  806. "lwt%4,56(%1)nt"
  807. "lwt%5,60(%1)nt"
  808. "swt%2,48(%0)nt"
  809. "swt%3,52(%0)nt"
  810. "swt%4,56(%0)nt"
  811. "swt%5,60(%0)nt"
  812. "daddiut%0,128nt"
  813. "daddiut%1,128nt"
  814. "lwt%2,-64(%1)nt"
  815. "lwt%3,-60(%1)nt"
  816. "lwt%4,-56(%1)nt"
  817. "lwt%5,-52(%1)nt"
  818. "swt%2,-64(%0)nt"
  819. "swt%3,-60(%0)nt"
  820. "swt%4,-56(%0)nt"
  821. "swt%5,-52(%0)nt"
  822. "lwt%2,-48(%1)nt"
  823. "lwt%3,-44(%1)nt"
  824. "lwt%4,-40(%1)nt"
  825. "lwt%5,-36(%1)nt"
  826. "swt%2,-48(%0)nt"
  827. "swt%3,-44(%0)nt"
  828. "swt%4,-40(%0)nt"
  829. "swt%5,-36(%0)nt"
  830. "lwt%2,-32(%1)nt"
  831. "lwt%3,-28(%1)nt"
  832. "lwt%4,-24(%1)nt"
  833. "lwt%5,-20(%1)nt"
  834. "swt%2,-32(%0)nt"
  835. "swt%3,-28(%0)nt"
  836. "swt%4,-24(%0)nt"
  837. "swt%5,-20(%0)nt"
  838. "lwt%2,-16(%1)nt"
  839. "lwt%3,-12(%1)nt"
  840. "lwt%4,-8(%1)nt"
  841. "lwt%5,-4(%1)nt"
  842. "swt%2,-16(%0)nt"
  843. "swt%3,-12(%0)nt"
  844. "swt%4,-8(%0)nt"
  845. "bnet$1,%0,1bnt"
  846. "swt%5,-4(%0)nt"
  847. ".settmips0nt"
  848. ".settatnt"
  849. ".settreorder"
  850. :"=r" (dummy1), "=r" (dummy2),
  851.  "=&r" (reg1), "=&r" (reg2), "=&r" (reg3), "=&r" (reg4)
  852. :"0" (to), "1" (from),
  853.  "I" (PAGE_SIZE),
  854.  "i" (Create_Dirty_Excl_SD));
  855. }
  856. /*
  857.  * If you think for one second that this stuff coming up is a lot
  858.  * of bulky code eating too many kernel cache lines.  Think _again_.
  859.  *
  860.  * Consider:
  861.  * 1) Taken branches have a 3 cycle penalty on R4k
  862.  * 2) The branch itself is a real dead cycle on even R4600/R5000.
  863.  * 3) Only one of the following variants of each type is even used by
  864.  *    the kernel based upon the cache parameters we detect at boot time.
  865.  *
  866.  * QED.
  867.  */
  868. static inline void r4k_flush_cache_all_s16d16i16(void)
  869. {
  870. unsigned long flags;
  871. __save_and_cli(flags);
  872. blast_dcache16(); blast_icache16(); blast_scache16();
  873. __restore_flags(flags);
  874. }
  875. static inline void r4k_flush_cache_all_s32d16i16(void)
  876. {
  877. unsigned long flags;
  878. __save_and_cli(flags);
  879. blast_dcache16(); blast_icache16(); blast_scache32();
  880. __restore_flags(flags);
  881. }
  882. static inline void r4k_flush_cache_all_s64d16i16(void)
  883. {
  884. unsigned long flags;
  885. __save_and_cli(flags);
  886. blast_dcache16(); blast_icache16(); blast_scache64();
  887. __restore_flags(flags);
  888. }
  889. static inline void r4k_flush_cache_all_s128d16i16(void)
  890. {
  891. unsigned long flags;
  892. __save_and_cli(flags);
  893. blast_dcache16(); blast_icache16(); blast_scache128();
  894. __restore_flags(flags);
  895. }
  896. static inline void r4k_flush_cache_all_s32d32i32(void)
  897. {
  898. unsigned long flags;
  899. __save_and_cli(flags);
  900. blast_dcache32(); blast_icache32(); blast_scache32();
  901. __restore_flags(flags);
  902. }
  903. static inline void r4k_flush_cache_all_s64d32i32(void)
  904. {
  905. unsigned long flags;
  906. __save_and_cli(flags);
  907. blast_dcache32(); blast_icache32(); blast_scache64();
  908. __restore_flags(flags);
  909. }
  910. static inline void r4k_flush_cache_all_s128d32i32(void)
  911. {
  912. unsigned long flags;
  913. __save_and_cli(flags);
  914. blast_dcache32(); blast_icache32(); blast_scache128();
  915. __restore_flags(flags);
  916. }
  917. static inline void r4k_flush_cache_all_d16i16(void)
  918. {
  919. unsigned long flags;
  920. __save_and_cli(flags);
  921. blast_dcache16(); blast_icache16();
  922. __restore_flags(flags);
  923. }
  924. static inline void r4k_flush_cache_all_d32i32(void)
  925. {
  926. unsigned long flags;
  927. __save_and_cli(flags);
  928. blast_dcache32(); blast_icache32();
  929. __restore_flags(flags);
  930. }
  931. static void
  932. r4k_flush_cache_range_s16d16i16(struct mm_struct *mm,
  933.                                 unsigned long start,
  934.                                 unsigned long end)
  935. {
  936. struct vm_area_struct *vma;
  937. unsigned long flags;
  938. if (mm->context == 0)
  939. return;
  940. start &= PAGE_MASK;
  941. #ifdef DEBUG_CACHE
  942. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  943. #endif
  944. vma = find_vma(mm, start);
  945. if (vma) {
  946. if (mm->context != current->active_mm->context) {
  947. r4k_flush_cache_all_s16d16i16();
  948. } else {
  949. pgd_t *pgd;
  950. pmd_t *pmd;
  951. pte_t *pte;
  952. __save_and_cli(flags);
  953. while(start < end) {
  954. pgd = pgd_offset(mm, start);
  955. pmd = pmd_offset(pgd, start);
  956. pte = pte_offset(pmd, start);
  957. if(pte_val(*pte) & _PAGE_VALID)
  958. blast_scache16_page(start);
  959. start += PAGE_SIZE;
  960. }
  961. __restore_flags(flags);
  962. }
  963. }
  964. }
  965. static void
  966. r4k_flush_cache_range_s32d16i16(struct mm_struct *mm,
  967.                                 unsigned long start,
  968.                                 unsigned long end)
  969. {
  970. struct vm_area_struct *vma;
  971. unsigned long flags;
  972. if (mm->context == 0)
  973. return;
  974. start &= PAGE_MASK;
  975. #ifdef DEBUG_CACHE
  976. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  977. #endif
  978. vma = find_vma(mm, start);
  979. if (vma) {
  980. if (mm->context != current->active_mm->context) {
  981. r4k_flush_cache_all_s32d16i16();
  982. } else {
  983. pgd_t *pgd;
  984. pmd_t *pmd;
  985. pte_t *pte;
  986. __save_and_cli(flags);
  987. while(start < end) {
  988. pgd = pgd_offset(mm, start);
  989. pmd = pmd_offset(pgd, start);
  990. pte = pte_offset(pmd, start);
  991. if(pte_val(*pte) & _PAGE_VALID)
  992. blast_scache32_page(start);
  993. start += PAGE_SIZE;
  994. }
  995. __restore_flags(flags);
  996. }
  997. }
  998. }
  999. static void r4k_flush_cache_range_s64d16i16(struct mm_struct *mm,
  1000.     unsigned long start,
  1001.     unsigned long end)
  1002. {
  1003. struct vm_area_struct *vma;
  1004. unsigned long flags;
  1005. if (mm->context == 0)
  1006. return;
  1007. start &= PAGE_MASK;
  1008. #ifdef DEBUG_CACHE
  1009. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  1010. #endif
  1011. vma = find_vma(mm, start);
  1012. if(vma) {
  1013. if (mm->context != current->active_mm->context) {
  1014. r4k_flush_cache_all_s64d16i16();
  1015. } else {
  1016. pgd_t *pgd;
  1017. pmd_t *pmd;
  1018. pte_t *pte;
  1019. __save_and_cli(flags);
  1020. while(start < end) {
  1021. pgd = pgd_offset(mm, start);
  1022. pmd = pmd_offset(pgd, start);
  1023. pte = pte_offset(pmd, start);
  1024. if(pte_val(*pte) & _PAGE_VALID)
  1025. blast_scache64_page(start);
  1026. start += PAGE_SIZE;
  1027. }
  1028. __restore_flags(flags);
  1029. }
  1030. }
  1031. }
  1032. static void r4k_flush_cache_range_s128d16i16(struct mm_struct *mm,
  1033.      unsigned long start,
  1034.      unsigned long end)
  1035. {
  1036. struct vm_area_struct *vma;
  1037. unsigned long flags;
  1038. if (mm->context == 0)
  1039. return;
  1040. start &= PAGE_MASK;
  1041. #ifdef DEBUG_CACHE
  1042. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  1043. #endif
  1044. vma = find_vma(mm, start);
  1045. if (vma) {
  1046. if (mm->context != current->active_mm->context) {
  1047. r4k_flush_cache_all_s128d16i16();
  1048. } else {
  1049. pgd_t *pgd;
  1050. pmd_t *pmd;
  1051. pte_t *pte;
  1052. __save_and_cli(flags);
  1053. while(start < end) {
  1054. pgd = pgd_offset(mm, start);
  1055. pmd = pmd_offset(pgd, start);
  1056. pte = pte_offset(pmd, start);
  1057. if(pte_val(*pte) & _PAGE_VALID)
  1058. blast_scache128_page(start);
  1059. start += PAGE_SIZE;
  1060. }
  1061. __restore_flags(flags);
  1062. }
  1063. }
  1064. }
  1065. static void r4k_flush_cache_range_s32d32i32(struct mm_struct *mm,
  1066.     unsigned long start,
  1067.     unsigned long end)
  1068. {
  1069. struct vm_area_struct *vma;
  1070. unsigned long flags;
  1071. if (mm->context == 0)
  1072. return;
  1073. start &= PAGE_MASK;
  1074. #ifdef DEBUG_CACHE
  1075. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  1076. #endif
  1077. vma = find_vma(mm, start);
  1078. if (vma) {
  1079. if (mm->context != current->active_mm->context) {
  1080. r4k_flush_cache_all_s32d32i32();
  1081. } else {
  1082. pgd_t *pgd;
  1083. pmd_t *pmd;
  1084. pte_t *pte;
  1085. __save_and_cli(flags);
  1086. while(start < end) {
  1087. pgd = pgd_offset(mm, start);
  1088. pmd = pmd_offset(pgd, start);
  1089. pte = pte_offset(pmd, start);
  1090. if(pte_val(*pte) & _PAGE_VALID)
  1091. blast_scache32_page(start);
  1092. start += PAGE_SIZE;
  1093. }
  1094. __restore_flags(flags);
  1095. }
  1096. }
  1097. }
  1098. static void r4k_flush_cache_range_s64d32i32(struct mm_struct *mm,
  1099.     unsigned long start,
  1100.     unsigned long end)
  1101. {
  1102. struct vm_area_struct *vma;
  1103. unsigned long flags;
  1104. if (mm->context == 0)
  1105. return;
  1106. start &= PAGE_MASK;
  1107. #ifdef DEBUG_CACHE
  1108. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  1109. #endif
  1110. vma = find_vma(mm, start);
  1111. if (vma) {
  1112. if (mm->context != current->active_mm->context) {
  1113. r4k_flush_cache_all_s64d32i32();
  1114. } else {
  1115. pgd_t *pgd;
  1116. pmd_t *pmd;
  1117. pte_t *pte;
  1118. __save_and_cli(flags);
  1119. while(start < end) {
  1120. pgd = pgd_offset(mm, start);
  1121. pmd = pmd_offset(pgd, start);
  1122. pte = pte_offset(pmd, start);
  1123. if(pte_val(*pte) & _PAGE_VALID)
  1124. blast_scache64_page(start);
  1125. start += PAGE_SIZE;
  1126. }
  1127. __restore_flags(flags);
  1128. }
  1129. }
  1130. }
  1131. static void r4k_flush_cache_range_s128d32i32(struct mm_struct *mm,
  1132.      unsigned long start,
  1133.      unsigned long end)
  1134. {
  1135. struct vm_area_struct *vma;
  1136. unsigned long flags;
  1137. if (mm->context == 0)
  1138. return;
  1139. start &= PAGE_MASK;
  1140. #ifdef DEBUG_CACHE
  1141. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  1142. #endif
  1143. vma = find_vma(mm, start);
  1144. if (vma) {
  1145. if (mm->context != current->active_mm->context) {
  1146. r4k_flush_cache_all_s128d32i32();
  1147. } else {
  1148. pgd_t *pgd;
  1149. pmd_t *pmd;
  1150. pte_t *pte;
  1151. __save_and_cli(flags);
  1152. while(start < end) {
  1153. pgd = pgd_offset(mm, start);
  1154. pmd = pmd_offset(pgd, start);
  1155. pte = pte_offset(pmd, start);
  1156. if(pte_val(*pte) & _PAGE_VALID)
  1157. blast_scache128_page(start);
  1158. start += PAGE_SIZE;
  1159. }
  1160. __restore_flags(flags);
  1161. }
  1162. }
  1163. }
  1164. static void r4k_flush_cache_range_d16i16(struct mm_struct *mm,
  1165.  unsigned long start,
  1166.  unsigned long end)
  1167. {
  1168. if (mm->context != 0) {
  1169. unsigned long flags;
  1170. #ifdef DEBUG_CACHE
  1171. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  1172. #endif
  1173. __save_and_cli(flags);
  1174. blast_dcache16(); blast_icache16();
  1175. __restore_flags(flags);
  1176. }
  1177. }
  1178. static void r4k_flush_cache_range_d32i32(struct mm_struct *mm,
  1179.  unsigned long start,
  1180.  unsigned long end)
  1181. {
  1182. if (mm->context != 0) {
  1183. unsigned long flags;
  1184. #ifdef DEBUG_CACHE
  1185. printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
  1186. #endif
  1187. __save_and_cli(flags);
  1188. blast_dcache32(); blast_icache32();
  1189. __restore_flags(flags);
  1190. }
  1191. }
  1192. /*
  1193.  * On architectures like the Sparc, we could get rid of lines in
  1194.  * the cache created only by a certain context, but on the MIPS
  1195.  * (and actually certain Sparc's) we cannot.
  1196.  */
  1197. static void r4k_flush_cache_mm_s16d16i16(struct mm_struct *mm)
  1198. {
  1199. if (mm->context != 0) {
  1200. #ifdef DEBUG_CACHE
  1201. printk("cmm[%d]", (int)mm->context);
  1202. #endif
  1203. r4k_flush_cache_all_s16d16i16();
  1204. }
  1205. }
  1206. static void r4k_flush_cache_mm_s32d16i16(struct mm_struct *mm)
  1207. {
  1208. if (mm->context != 0) {
  1209. #ifdef DEBUG_CACHE
  1210. printk("cmm[%d]", (int)mm->context);
  1211. #endif
  1212. r4k_flush_cache_all_s32d16i16();
  1213. }
  1214. }
  1215. static void r4k_flush_cache_mm_s64d16i16(struct mm_struct *mm)
  1216. {
  1217. if (mm->context != 0) {
  1218. #ifdef DEBUG_CACHE
  1219. printk("cmm[%d]", (int)mm->context);
  1220. #endif
  1221. r4k_flush_cache_all_s64d16i16();
  1222. }
  1223. }
  1224. static void r4k_flush_cache_mm_s128d16i16(struct mm_struct *mm)
  1225. {
  1226. if (mm->context != 0) {
  1227. #ifdef DEBUG_CACHE
  1228. printk("cmm[%d]", (int)mm->context);
  1229. #endif
  1230. r4k_flush_cache_all_s128d16i16();
  1231. }
  1232. }
  1233. static void r4k_flush_cache_mm_s32d32i32(struct mm_struct *mm)
  1234. {
  1235. if (mm->context != 0) {
  1236. #ifdef DEBUG_CACHE
  1237. printk("cmm[%d]", (int)mm->context);
  1238. #endif
  1239. r4k_flush_cache_all_s32d32i32();
  1240. }
  1241. }
  1242. static void r4k_flush_cache_mm_s64d32i32(struct mm_struct *mm)
  1243. {
  1244. if (mm->context != 0) {
  1245. #ifdef DEBUG_CACHE
  1246. printk("cmm[%d]", (int)mm->context);
  1247. #endif
  1248. r4k_flush_cache_all_s64d32i32();
  1249. }
  1250. }
  1251. static void r4k_flush_cache_mm_s128d32i32(struct mm_struct *mm)
  1252. {
  1253. if (mm->context != 0) {
  1254. #ifdef DEBUG_CACHE
  1255. printk("cmm[%d]", (int)mm->context);
  1256. #endif
  1257. r4k_flush_cache_all_s128d32i32();
  1258. }
  1259. }
  1260. static void r4k_flush_cache_mm_d16i16(struct mm_struct *mm)
  1261. {
  1262. if (mm->context != 0) {
  1263. #ifdef DEBUG_CACHE
  1264. printk("cmm[%d]", (int)mm->context);
  1265. #endif
  1266. r4k_flush_cache_all_d16i16();
  1267. }
  1268. }
  1269. static void r4k_flush_cache_mm_d32i32(struct mm_struct *mm)
  1270. {
  1271. if (mm->context != 0) {
  1272. #ifdef DEBUG_CACHE
  1273. printk("cmm[%d]", (int)mm->context);
  1274. #endif
  1275. r4k_flush_cache_all_d32i32();
  1276. }
  1277. }
  1278. static void r4k_flush_cache_page_s16d16i16(struct vm_area_struct *vma,
  1279.    unsigned long page)
  1280. {
  1281. struct mm_struct *mm = vma->vm_mm;
  1282. unsigned long flags;
  1283. pgd_t *pgdp;
  1284. pmd_t *pmdp;
  1285. pte_t *ptep;
  1286. /*
  1287.  * If ownes no valid ASID yet, cannot possibly have gotten
  1288.  * this page into the cache.
  1289.  */
  1290. if (mm->context == 0)
  1291. return;
  1292. #ifdef DEBUG_CACHE
  1293. printk("cpage[%d,%08lx]", (int)mm->context, page);
  1294. #endif
  1295. __save_and_cli(flags);
  1296. page &= PAGE_MASK;
  1297. pgdp = pgd_offset(mm, page);
  1298. pmdp = pmd_offset(pgdp, page);
  1299. ptep = pte_offset(pmdp, page);
  1300. /*
  1301.  * If the page isn't marked valid, the page cannot possibly be
  1302.  * in the cache.
  1303.  */
  1304. if (!(pte_val(*ptep) & _PAGE_VALID))
  1305. goto out;
  1306. /*
  1307.  * Doing flushes for another ASID than the current one is
  1308.  * too difficult since stupid R4k caches do a TLB translation
  1309.  * for every cache flush operation.  So we do indexed flushes
  1310.  * in that case, which doesn't overly flush the cache too much.
  1311.  */
  1312. if (mm->context != current->active_mm->context) {
  1313. /*
  1314.  * Do indexed flush, too much work to get the (possible)
  1315.  * tlb refills to work correctly.
  1316.  */
  1317. page = (KSEG0 + (page & (scache_size - 1)));
  1318. blast_dcache16_page_indexed(page);
  1319. blast_scache16_page_indexed(page);
  1320. } else
  1321. blast_scache16_page(page);
  1322. out:
  1323. __restore_flags(flags);
  1324. }
  1325. static void r4k_flush_cache_page_s32d16i16(struct vm_area_struct *vma,
  1326.    unsigned long page)
  1327. {
  1328. struct mm_struct *mm = vma->vm_mm;
  1329. unsigned long flags;
  1330. pgd_t *pgdp;
  1331. pmd_t *pmdp;
  1332. pte_t *ptep;
  1333. /*
  1334.  * If ownes no valid ASID yet, cannot possibly have gotten
  1335.  * this page into the cache.
  1336.  */
  1337. if (mm->context == 0)
  1338. return;
  1339. #ifdef DEBUG_CACHE
  1340. printk("cpage[%d,%08lx]", (int)mm->context, page);
  1341. #endif
  1342. __save_and_cli(flags);
  1343. page &= PAGE_MASK;
  1344. pgdp = pgd_offset(mm, page);
  1345. pmdp = pmd_offset(pgdp, page);
  1346. ptep = pte_offset(pmdp, page);
  1347. /* If the page isn't marked valid, the page cannot possibly be
  1348.  * in the cache.
  1349.  */
  1350. if (!(pte_val(*ptep) & _PAGE_VALID))
  1351. goto out;
  1352. /*
  1353.  * Doing flushes for another ASID than the current one is
  1354.  * too difficult since stupid R4k caches do a TLB translation
  1355.  * for every cache flush operation.  So we do indexed flushes
  1356.  * in that case, which doesn't overly flush the cache too much.
  1357.  */
  1358. if (mm->context != current->active_mm->context) {
  1359. /*
  1360.  * Do indexed flush, too much work to get the (possible)
  1361.  * tlb refills to work correctly.
  1362.  */
  1363. page = (KSEG0 + (page & (scache_size - 1)));
  1364. blast_dcache16_page_indexed(page);
  1365. blast_scache32_page_indexed(page);
  1366. } else
  1367. blast_scache32_page(page);
  1368. out:
  1369. __restore_flags(flags);
  1370. }
  1371. static void r4k_flush_cache_page_s64d16i16(struct vm_area_struct *vma,
  1372.    unsigned long page)
  1373. {
  1374. struct mm_struct *mm = vma->vm_mm;
  1375. unsigned long flags;
  1376. pgd_t *pgdp;
  1377. pmd_t *pmdp;
  1378. pte_t *ptep;
  1379. /*
  1380.  * If ownes no valid ASID yet, cannot possibly have gotten
  1381.  * this page into the cache.
  1382.  */
  1383. if (mm->context == 0)
  1384. return;
  1385. #ifdef DEBUG_CACHE
  1386. printk("cpage[%d,%08lx]", (int)mm->context, page);
  1387. #endif
  1388. __save_and_cli(flags);
  1389. page &= PAGE_MASK;
  1390. pgdp = pgd_offset(mm, page);
  1391. pmdp = pmd_offset(pgdp, page);
  1392. ptep = pte_offset(pmdp, page);
  1393. /* If the page isn't marked valid, the page cannot possibly be
  1394.  * in the cache.
  1395.  */
  1396. if (!(pte_val(*ptep) & _PAGE_VALID))
  1397. goto out;
  1398. /*
  1399.  * Doing flushes for another ASID than the current one is
  1400.  * too difficult since stupid R4k caches do a TLB translation
  1401.  * for every cache flush operation.  So we do indexed flushes
  1402.  * in that case, which doesn't overly flush the cache too much.
  1403.  */
  1404. if (mm->context != current->active_mm->context) {
  1405. /*
  1406.  * Do indexed flush, too much work to get the (possible)
  1407.  * tlb refills to work correctly.
  1408.  */
  1409. page = (KSEG0 + (page & (scache_size - 1)));
  1410. blast_dcache16_page_indexed(page);
  1411. blast_scache64_page_indexed(page);
  1412. } else
  1413. blast_scache64_page(page);
  1414. out:
  1415. __restore_flags(flags);
  1416. }
  1417. static void r4k_flush_cache_page_s128d16i16(struct vm_area_struct *vma,
  1418.     unsigned long page)
  1419. {
  1420. struct mm_struct *mm = vma->vm_mm;
  1421. unsigned long flags;
  1422. pgd_t *pgdp;
  1423. pmd_t *pmdp;
  1424. pte_t *ptep;
  1425. /*
  1426.  * If ownes no valid ASID yet, cannot possibly have gotten
  1427.  * this page into the cache.
  1428.  */
  1429. if (mm->context == 0)
  1430. return;
  1431. #ifdef DEBUG_CACHE
  1432. printk("cpage[%d,%08lx]", (int)mm->context, page);
  1433. #endif
  1434. __save_and_cli(flags);
  1435. page &= PAGE_MASK;
  1436. pgdp = pgd_offset(mm, page);
  1437. pmdp = pmd_offset(pgdp, page);
  1438. ptep = pte_offset(pmdp, page);
  1439. /*
  1440.  * If the page isn't marked valid, the page cannot possibly be
  1441.  * in the cache.
  1442.  */
  1443. if (!(pte_val(*ptep) & _PAGE_VALID))
  1444. goto out;
  1445. /*
  1446.  * Doing flushes for another ASID than the current one is
  1447.  * too difficult since stupid R4k caches do a TLB translation
  1448.  * for every cache flush operation.  So we do indexed flushes
  1449.  * in that case, which doesn't overly flush the cache too much.
  1450.  */
  1451. if (mm->context != current->active_mm->context) {
  1452. /*
  1453.  * Do indexed flush, too much work to get the (possible)
  1454.  * tlb refills to work correctly.
  1455.  */
  1456. page = (KSEG0 + (page & (scache_size - 1)));
  1457. blast_dcache16_page_indexed(page);
  1458. blast_scache128_page_indexed(page);
  1459. } else
  1460. blast_scache128_page(page);
  1461. out:
  1462. __restore_flags(flags);
  1463. }
  1464. static void r4k_flush_cache_page_s32d32i32(struct vm_area_struct *vma,
  1465.    unsigned long page)
  1466. {
  1467. struct mm_struct *mm = vma->vm_mm;
  1468. unsigned long flags;
  1469. pgd_t *pgdp;
  1470. pmd_t *pmdp;
  1471. pte_t *ptep;
  1472. /*
  1473.  * If ownes no valid ASID yet, cannot possibly have gotten
  1474.  * this page into the cache.
  1475.  */
  1476. if (mm->context == 0)
  1477. return;
  1478. #ifdef DEBUG_CACHE
  1479. printk("cpage[%d,%08lx]", (int)mm->context, page);
  1480. #endif
  1481. __save_and_cli(flags);
  1482. page &= PAGE_MASK;
  1483. pgdp = pgd_offset(mm, page);
  1484. pmdp = pmd_offset(pgdp, page);
  1485. ptep = pte_offset(pmdp, page);
  1486. /*
  1487.  * If the page isn't marked valid, the page cannot possibly be
  1488.  * in the cache.
  1489.  */
  1490. if (!(pte_val(*ptep) & _PAGE_VALID))
  1491. goto out;
  1492. /*
  1493.  * Doing flushes for another ASID than the current one is
  1494.  * too difficult since stupid R4k caches do a TLB translation
  1495.  * for every cache flush operation.  So we do indexed flushes
  1496.  * in that case, which doesn't overly flush the cache too much.
  1497.  */
  1498. if (mm->context != current->active_mm->context) {
  1499. /*
  1500.  * Do indexed flush, too much work to get the (possible)
  1501.  * tlb refills to work correctly.
  1502.  */
  1503. page = (KSEG0 + (page & (scache_size - 1)));
  1504. blast_dcache32_page_indexed(page);
  1505. blast_scache32_page_indexed(page);
  1506. } else
  1507. blast_scache32_page(page);
  1508. out:
  1509. __restore_flags(flags);
  1510. }
  1511. static void r4k_flush_cache_page_s64d32i32(struct vm_area_struct *vma,
  1512.    unsigned long page)
  1513. {
  1514. struct mm_struct *mm = vma->vm_mm;
  1515. unsigned long flags;
  1516. pgd_t *pgdp;
  1517. pmd_t *pmdp;
  1518. pte_t *ptep;
  1519. /*
  1520.  * If ownes no valid ASID yet, cannot possibly have gotten
  1521.  * this page into the cache.
  1522.  */
  1523. if (mm->context == 0)
  1524. return;
  1525. #ifdef DEBUG_CACHE
  1526. printk("cpage[%d,%08lx]", (int)mm->context, page);
  1527. #endif
  1528. __save_and_cli(flags);
  1529. page &= PAGE_MASK;
  1530. pgdp = pgd_offset(mm, page);
  1531. pmdp = pmd_offset(pgdp, page);
  1532. ptep = pte_offset(pmdp, page);
  1533. /*
  1534.  * If the page isn't marked valid, the page cannot possibly be
  1535.  * in the cache.
  1536.  */
  1537. if (!(pte_val(*ptep) & _PAGE_VALID))
  1538. goto out;
  1539. /*
  1540.  * Doing flushes for another ASID than the current one is
  1541.  * too difficult since stupid R4k caches do a TLB translation
  1542.  * for every cache flush operation.  So we do indexed flushes
  1543.  * in that case, which doesn't overly flush the cache too much.
  1544.  */
  1545. if (mm->context != current->active_mm->context) {
  1546. /*
  1547.  * Do indexed flush, too much work to get the (possible)
  1548.  * tlb refills to work correctly.
  1549.  */
  1550. page = (KSEG0 + (page & (scache_size - 1)));
  1551. blast_dcache32_page_indexed(page);
  1552. blast_scache64_page_indexed(page);
  1553. } else
  1554. blast_scache64_page(page);
  1555. out:
  1556. __restore_flags(flags);
  1557. }
  1558. static void r4k_flush_cache_page_s128d32i32(struct vm_area_struct *vma,
  1559.     unsigned long page)
  1560. {
  1561. struct mm_struct *mm = vma->vm_mm;
  1562. unsigned long flags;
  1563. pgd_t *pgdp;
  1564. pmd_t *pmdp;
  1565. pte_t *ptep;
  1566. /*
  1567.  * If ownes no valid ASID yet, cannot possibly have gotten
  1568.  * this page into the cache.
  1569.  */
  1570. if (mm->context == 0)
  1571. return;
  1572. #ifdef DEBUG_CACHE
  1573. printk("cpage[%d,%08lx]", (int)mm->context, page);
  1574. #endif
  1575. __save_and_cli(flags);
  1576. page &= PAGE_MASK;
  1577. pgdp = pgd_offset(mm, page);
  1578. pmdp = pmd_offset(pgdp, page);
  1579. ptep = pte_offset(pmdp, page);
  1580. /*
  1581.  * If the page isn't marked valid, the page cannot possibly be
  1582.  * in the cache.
  1583.  */
  1584. if (!(pte_val(*ptep) & _PAGE_VALID))
  1585. goto out;
  1586. /*
  1587.  * Doing flushes for another ASID than the current one is
  1588.  * too difficult since stupid R4k caches do a TLB translation
  1589.  * for every cache flush operation.  So we do indexed flushes
  1590.  * in that case, which doesn't overly flush the cache too much.
  1591.  */
  1592. if (mm->context != current->active_mm->context) {
  1593. /* Do indexed flush, too much work to get the (possible)
  1594.  * tlb refills to work correctly.
  1595.  */
  1596. page = (KSEG0 + (page & (scache_size - 1)));
  1597. blast_dcache32_page_indexed(page);
  1598. blast_scache128_page_indexed(page);
  1599. } else
  1600. blast_scache128_page(page);
  1601. out:
  1602. __restore_flags(flags);
  1603. }
  1604. static void r4k_flush_cache_page_d16i16(struct vm_area_struct *vma,
  1605. unsigned long page)
  1606. {
  1607. struct mm_struct *mm = vma->vm_mm;
  1608. unsigned long flags;
  1609. pgd_t *pgdp;
  1610. pmd_t *pmdp;
  1611. pte_t *ptep;
  1612. /*
  1613.  * If ownes no valid ASID yet, cannot possibly have gotten
  1614.  * this page into the cache.
  1615.  */
  1616. if (mm->context == 0)
  1617. return;
  1618. #ifdef DEBUG_CACHE
  1619. printk("cpage[%d,%08lx]", (int)mm->context, page);
  1620. #endif
  1621. __save_and_cli(flags);
  1622. page &= PAGE_MASK;
  1623. pgdp = pgd_offset(mm, page);
  1624. pmdp = pmd_offset(pgdp, page);
  1625. ptep = pte_offset(pmdp, page);
  1626. /*
  1627.  * If the page isn't marked valid, the page cannot possibly be
  1628.  * in the cache.
  1629.  */
  1630. if (!(pte_val(*ptep) & _PAGE_VALID))
  1631. goto out;
  1632. /*
  1633.  * Doing flushes for another ASID than the current one is
  1634.  * too difficult since stupid R4k caches do a TLB translation
  1635.  * for every cache flush operation.  So we do indexed flushes
  1636.  * in that case, which doesn't overly flush the cache too much.
  1637.  */
  1638. if (mm == current->active_mm) {
  1639. blast_dcache16_page(page);
  1640. } else {
  1641. /* Do indexed flush, too much work to get the (possible)
  1642.  * tlb refills to work correctly.
  1643.  */
  1644. page = (KSEG0 + (page & (dcache_size - 1)));
  1645. blast_dcache16_page_indexed(page);
  1646. }
  1647. out:
  1648. __restore_flags(flags);
  1649. }
  1650. static void r4k_flush_cache_page_d32i32(struct vm_area_struct *vma,
  1651. unsigned long page)
  1652. {
  1653. struct mm_struct *mm = vma->vm_mm;
  1654. unsigned long flags;
  1655. pgd_t *pgdp;
  1656. pmd_t *pmdp;
  1657. pte_t *ptep;
  1658. /*
  1659.  * If ownes no valid ASID yet, cannot possibly have gotten
  1660.  * this page into the cache.
  1661.  */
  1662. if (mm->context == 0)
  1663. return;
  1664. #ifdef DEBUG_CACHE
  1665. printk("cpage[%d,%08lx]", (int)mm->context, page);
  1666. #endif
  1667. __save_and_cli(flags);
  1668. page &= PAGE_MASK;
  1669. pgdp = pgd_offset(mm, page);
  1670. pmdp = pmd_offset(pgdp, page);
  1671. ptep = pte_offset(pmdp, page);
  1672. /*
  1673.  * If the page isn't marked valid, the page cannot possibly be
  1674.  * in the cache.
  1675.  */
  1676. if (!(pte_val(*ptep) & _PAGE_PRESENT))
  1677. goto out;
  1678. /*
  1679.  * Doing flushes for another ASID than the current one is
  1680.  * too difficult since stupid R4k caches do a TLB translation
  1681.  * for every cache flush operation.  So we do indexed flushes
  1682.  * in that case, which doesn't overly flush the cache too much.
  1683.  */
  1684. if ((mm == current->active_mm) && (pte_val(*ptep) & _PAGE_VALID)) {
  1685. blast_dcache32_page(page);
  1686. } else {
  1687. /*
  1688.  * Do indexed flush, too much work to get the (possible)
  1689.  * tlb refills to work correctly.
  1690.  */
  1691. page = (KSEG0 + (page & (dcache_size - 1)));
  1692. blast_dcache32_page_indexed(page);
  1693. }
  1694. out:
  1695. __restore_flags(flags);
  1696. }
  1697. static void r4k_flush_cache_page_d32i32_r4600(struct vm_area_struct *vma,
  1698.       unsigned long page)
  1699. {
  1700. struct mm_struct *mm = vma->vm_mm;
  1701. unsigned long flags;
  1702. pgd_t *pgdp;
  1703. pmd_t *pmdp;
  1704. pte_t *ptep;
  1705. /*
  1706.  * If ownes no valid ASID yet, cannot possibly have gotten
  1707.  * this page into the cache.
  1708.  */
  1709. if (mm->context == 0)
  1710. return;
  1711. #ifdef DEBUG_CACHE
  1712. printk("cpage[%d,%08lx]", (int)mm->context, page);
  1713. #endif
  1714. __save_and_cli(flags);
  1715. page &= PAGE_MASK;
  1716. pgdp = pgd_offset(mm, page);
  1717. pmdp = pmd_offset(pgdp, page);
  1718. ptep = pte_offset(pmdp, page);
  1719. /*
  1720.  * If the page isn't marked valid, the page cannot possibly be
  1721.  * in the cache.
  1722.  */
  1723. if (!(pte_val(*ptep) & _PAGE_PRESENT))
  1724. goto out;
  1725. /*
  1726.  * Doing flushes for another ASID than the current one is
  1727.  * too difficult since stupid R4k caches do a TLB translation
  1728.  * for every cache flush operation.  So we do indexed flushes
  1729.  * in that case, which doesn't overly flush the cache too much.
  1730.  */
  1731. if ((mm == current->active_mm) && (pte_val(*ptep) & _PAGE_VALID)) {
  1732. blast_dcache32_page(page);
  1733. } else {
  1734. /* Do indexed flush, too much work to get the (possible)
  1735.  * tlb refills to work correctly.
  1736.  */
  1737. page = (KSEG0 + (page & (dcache_size - 1)));
  1738. blast_dcache32_page_indexed(page);
  1739. blast_dcache32_page_indexed(page ^ dcache_waybit);
  1740. }
  1741. out:
  1742. __restore_flags(flags);
  1743. }
  1744. /* If the addresses passed to these routines are valid, they are
  1745.  * either:
  1746.  *
  1747.  * 1) In KSEG0, so we can do a direct flush of the page.
  1748.  * 2) In KSEG2, and since every process can translate those
  1749.  *    addresses all the time in kernel mode we can do a direct
  1750.  *    flush.
  1751.  * 3) In KSEG1, no flush necessary.
  1752.  */
  1753. static void r4k_flush_page_to_ram_s16(struct page *page)
  1754. {
  1755. blast_scache16_page((unsigned long)page_address(page));
  1756. }
  1757. static void r4k_flush_page_to_ram_s32(struct page *page)
  1758. {
  1759. blast_scache32_page((unsigned long)page_address(page));
  1760. }
  1761. static void r4k_flush_page_to_ram_s64(struct page *page)
  1762. {
  1763. blast_scache64_page((unsigned long)page_address(page));
  1764. }
  1765. static void r4k_flush_page_to_ram_s128(struct page *page)
  1766. {
  1767. blast_scache128_page((unsigned long)page_address(page));
  1768. }
  1769. static void r4k_flush_page_to_ram_d16(struct page *page)
  1770. {
  1771. blast_dcache16_page((unsigned long)page_address(page));
  1772. }
  1773. static void r4k_flush_page_to_ram_d32(struct page *page)
  1774. {
  1775. blast_dcache32_page((unsigned long)page_address(page));
  1776. }
  1777. static void r4k_flush_page_to_ram_d32_r4600(struct page *page)
  1778. {
  1779. unsigned long flags;
  1780. __save_and_cli(flags); /* For R4600 v1.7 bug.  */
  1781. blast_dcache32_page((unsigned long)page_address(page));
  1782. __restore_flags(flags);
  1783. }
  1784. static void
  1785. r4k_flush_icache_page_s(struct vm_area_struct *vma, struct page *page)
  1786. {
  1787. /*
  1788.  * We did an scache flush therefore PI is already clean.
  1789.  */
  1790. }
  1791. static void
  1792. r4k_flush_icache_range(unsigned long start, unsigned long end)
  1793. {
  1794. flush_cache_all();
  1795. }
  1796. /*
  1797.  * Ok, this seriously sucks.  We use them to flush a user page but don't
  1798.  * know the virtual address, so we have to blast away the whole icache
  1799.  * which is significantly more expensive than the real thing.
  1800.  */
  1801. static void
  1802. r4k_flush_icache_page_p(struct vm_area_struct *vma, struct page *page)
  1803. {
  1804. if (!(vma->vm_flags & VM_EXEC))
  1805. return;
  1806. flush_cache_all();
  1807. }
  1808. /*
  1809.  * Writeback and invalidate the primary cache dcache before DMA.
  1810.  *
  1811.  * R4600 v2.0 bug: "The CACHE instructions Hit_Writeback_Inv_D,
  1812.  * Hit_Writeback_D, Hit_Invalidate_D and Create_Dirty_Exclusive_D will only
  1813.  * operate correctly if the internal data cache refill buffer is empty.  These
  1814.  * CACHE instructions should be separated from any potential data cache miss
  1815.  * by a load instruction to an uncached address to empty the response buffer."
  1816.  * (Revision 2.0 device errata from IDT available on http://www.idt.com/
  1817.  * in .pdf format.)
  1818.  */
  1819. static void
  1820. r4k_dma_cache_wback_inv_pc(unsigned long addr, unsigned long size)
  1821. {
  1822. unsigned long end, a;
  1823. unsigned int flags;
  1824. if (size >= dcache_size) {
  1825. flush_cache_all();
  1826. } else {
  1827. /* Workaround for R4600 bug.  See comment above. */
  1828. __save_and_cli(flags);
  1829. *(volatile unsigned long *)KSEG1;
  1830. a = addr & ~(dc_lsize - 1);
  1831. end = (addr + size) & ~(dc_lsize - 1);
  1832. while (1) {
  1833. flush_dcache_line(a); /* Hit_Writeback_Inv_D */
  1834. if (a == end) break;
  1835. a += dc_lsize;
  1836. }
  1837. __restore_flags(flags);
  1838. }
  1839. bc_wback_inv(addr, size);
  1840. }
  1841. static void
  1842. r4k_dma_cache_wback_inv_sc(unsigned long addr, unsigned long size)
  1843. {
  1844. unsigned long end, a;
  1845. if (size >= scache_size) {
  1846. flush_cache_all();
  1847. return;
  1848. }
  1849. a = addr & ~(sc_lsize - 1);
  1850. end = (addr + size) & ~(sc_lsize - 1);
  1851. while (1) {
  1852. flush_scache_line(a); /* Hit_Writeback_Inv_SD */
  1853. if (a == end) break;
  1854. a += sc_lsize;
  1855. }
  1856. }
  1857. static void
  1858. r4k_dma_cache_inv_pc(unsigned long addr, unsigned long size)
  1859. {
  1860. unsigned long end, a;
  1861. unsigned int flags;
  1862. if (size >= dcache_size) {
  1863. flush_cache_all();
  1864. } else {
  1865. /* Workaround for R4600 bug.  See comment above. */
  1866. __save_and_cli(flags);
  1867. *(volatile unsigned long *)KSEG1;
  1868. a = addr & ~(dc_lsize - 1);
  1869. end = (addr + size) & ~(dc_lsize - 1);
  1870. while (1) {
  1871. flush_dcache_line(a); /* Hit_Writeback_Inv_D */
  1872. if (a == end) break;
  1873. a += dc_lsize;
  1874. }
  1875. __restore_flags(flags);
  1876. }
  1877. bc_inv(addr, size);
  1878. }
  1879. static void
  1880. r4k_dma_cache_inv_sc(unsigned long addr, unsigned long size)
  1881. {
  1882. unsigned long end, a;
  1883. if (size >= scache_size) {
  1884. flush_cache_all();
  1885. return;
  1886. }
  1887. a = addr & ~(sc_lsize - 1);
  1888. end = (addr + size) & ~(sc_lsize - 1);
  1889. while (1) {
  1890. flush_scache_line(a); /* Hit_Writeback_Inv_SD */
  1891. if (a == end) break;
  1892. a += sc_lsize;
  1893. }
  1894. }
  1895. static void
  1896. r4k_dma_cache_wback(unsigned long addr, unsigned long size)
  1897. {
  1898. panic("r4k_dma_cache called - should not happen.n");
  1899. }
  1900. /*
  1901.  * While we're protected against bad userland addresses we don't care
  1902.  * very much about what happens in that case.  Usually a segmentation
  1903.  * fault will dump the process later on anyway ...
  1904.  */
  1905. static void r4k_flush_cache_sigtramp(unsigned long addr)
  1906. {
  1907. __asm__ __volatile__("nop;nop;nop;nop"); /* R4600 V1.7 */
  1908. protected_writeback_dcache_line(addr & ~(dc_lsize - 1));
  1909. protected_flush_icache_line(addr & ~(ic_lsize - 1));
  1910. }
  1911. static void r4600v20k_flush_cache_sigtramp(unsigned long addr)
  1912. {
  1913. unsigned int flags;
  1914. __save_and_cli(flags);
  1915. /* Clear internal cache refill buffer */
  1916. *(volatile unsigned int *)KSEG1;
  1917. protected_writeback_dcache_line(addr & ~(dc_lsize - 1));
  1918. protected_flush_icache_line(addr & ~(ic_lsize - 1));
  1919. __restore_flags(flags);
  1920. }
  1921. #undef DEBUG_TLB
  1922. #undef DEBUG_TLBUPDATE
  1923. void flush_tlb_all(void)
  1924. {
  1925. unsigned long flags;
  1926. unsigned long old_ctx;
  1927. int entry;
  1928. #ifdef DEBUG_TLB
  1929. printk("[tlball]");
  1930. #endif
  1931. __save_and_cli(flags);
  1932. /* Save old context and create impossible VPN2 value */
  1933. old_ctx = (get_entryhi() & 0xff);
  1934. set_entryhi(KSEG0);
  1935. set_entrylo0(0);
  1936. set_entrylo1(0);
  1937. BARRIER;
  1938. entry = get_wired();
  1939. /* Blast 'em all away. */
  1940. while(entry < mips_cpu.tlbsize) {
  1941. set_index(entry);
  1942. BARRIER;
  1943. tlb_write_indexed();
  1944. BARRIER;
  1945. entry++;
  1946. }
  1947. BARRIER;
  1948. set_entryhi(old_ctx);
  1949. __restore_flags(flags);
  1950. }
  1951. void flush_tlb_mm(struct mm_struct *mm)
  1952. {
  1953. if (mm->context != 0) {
  1954. unsigned long flags;
  1955. #ifdef DEBUG_TLB
  1956. printk("[tlbmm<%d>]", mm->context);
  1957. #endif
  1958. __save_and_cli(flags);
  1959. get_new_mmu_context(mm, asid_cache);
  1960. if (mm == current->active_mm)
  1961. set_entryhi(mm->context & 0xff);
  1962. __restore_flags(flags);
  1963. }
  1964. }
  1965. void flush_tlb_range(struct mm_struct *mm, unsigned long start,
  1966. unsigned long end)
  1967. {
  1968. if(mm->context != 0) {
  1969. unsigned long flags;
  1970. int size;
  1971. #ifdef DEBUG_TLB
  1972. printk("[tlbrange<%02x,%08lx,%08lx>]", (mm->context & 0xff),
  1973.        start, end);
  1974. #endif
  1975. __save_and_cli(flags);
  1976. size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
  1977. size = (size + 1) >> 1;
  1978. if(size <= mips_cpu.tlbsize/2) {
  1979. int oldpid = (get_entryhi() & 0xff);
  1980. int newpid = (mm->context & 0xff);
  1981. start &= (PAGE_MASK << 1);
  1982. end += ((PAGE_SIZE << 1) - 1);
  1983. end &= (PAGE_MASK << 1);
  1984. while(start < end) {
  1985. int idx;
  1986. set_entryhi(start | newpid);
  1987. start += (PAGE_SIZE << 1);
  1988. BARRIER;
  1989. tlb_probe();
  1990. BARRIER;
  1991. idx = get_index();
  1992. set_entrylo0(0);
  1993. set_entrylo1(0);
  1994. set_entryhi(KSEG0);
  1995. BARRIER;
  1996. if(idx < 0)
  1997. continue;
  1998. tlb_write_indexed();
  1999. BARRIER;
  2000. }
  2001. set_entryhi(oldpid);
  2002. } else {
  2003. get_new_mmu_context(mm, asid_cache);
  2004. if (mm == current->active_mm)
  2005. set_entryhi(mm->context & 0xff);
  2006. }
  2007. __restore_flags(flags);
  2008. }
  2009. }
  2010. void flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
  2011. {
  2012. if (vma->vm_mm->context != 0) {
  2013. unsigned long flags;
  2014. int oldpid, newpid, idx;
  2015. #ifdef DEBUG_TLB
  2016. printk("[tlbpage<%d,%08lx>]", vma->vm_mm->context, page);
  2017. #endif
  2018. newpid = (vma->vm_mm->context & 0xff);
  2019. page &= (PAGE_MASK << 1);
  2020. __save_and_cli(flags);
  2021. oldpid = (get_entryhi() & 0xff);
  2022. set_entryhi(page | newpid);
  2023. BARRIER;
  2024. tlb_probe();
  2025. BARRIER;
  2026. idx = get_index();
  2027. set_entrylo0(0);
  2028. set_entrylo1(0);
  2029. set_entryhi(KSEG0);
  2030. if(idx < 0)
  2031. goto finish;
  2032. BARRIER;
  2033. tlb_write_indexed();
  2034. finish:
  2035. BARRIER;
  2036. set_entryhi(oldpid);
  2037. __restore_flags(flags);
  2038. }
  2039. }
  2040. void pgd_init(unsigned long page)
  2041. {
  2042. unsigned long *p = (unsigned long *) page;
  2043. int i;
  2044. for(i = 0; i < USER_PTRS_PER_PGD; i+=8) {
  2045. p[i + 0] = (unsigned long) invalid_pte_table;
  2046. p[i + 1] = (unsigned long) invalid_pte_table;
  2047. p[i + 2] = (unsigned long) invalid_pte_table;
  2048. p[i + 3] = (unsigned long) invalid_pte_table;
  2049. p[i + 4] = (unsigned long) invalid_pte_table;
  2050. p[i + 5] = (unsigned long) invalid_pte_table;
  2051. p[i + 6] = (unsigned long) invalid_pte_table;
  2052. p[i + 7] = (unsigned long) invalid_pte_table;
  2053. }
  2054. }
  2055. /* We will need multiple versions of update_mmu_cache(), one that just
  2056.  * updates the TLB with the new pte(s), and another which also checks
  2057.  * for the R4k "end of page" hardware bug and does the needy.
  2058.  */
  2059. void update_mmu_cache(struct vm_area_struct * vma,
  2060.  unsigned long address, pte_t pte)
  2061. {
  2062. unsigned long flags;
  2063. pgd_t *pgdp;
  2064. pmd_t *pmdp;
  2065. pte_t *ptep;
  2066. int idx, pid;
  2067. /*
  2068.  * Handle debugger faulting in for debugee.
  2069.  */
  2070. if (current->active_mm != vma->vm_mm)
  2071. return;
  2072. pid = get_entryhi() & 0xff;
  2073. #ifdef DEBUG_TLB
  2074. if((pid != (vma->vm_mm->context & 0xff)) || (vma->vm_mm->context == 0)) {
  2075. printk("update_mmu_cache: Wheee, bogus tlbpid mmpid=%d tlbpid=%dn",
  2076.        (int) (vma->vm_mm->context & 0xff), pid);
  2077. }
  2078. #endif
  2079. __save_and_cli(flags);
  2080. address &= (PAGE_MASK << 1);
  2081. set_entryhi(address | (pid));
  2082. pgdp = pgd_offset(vma->vm_mm, address);
  2083. BARRIER;
  2084. tlb_probe();
  2085. BARRIER;
  2086. pmdp = pmd_offset(pgdp, address);
  2087. idx = get_index();
  2088. ptep = pte_offset(pmdp, address);
  2089. BARRIER;
  2090. set_entrylo0(pte_val(*ptep++) >> 6);
  2091. set_entrylo1(pte_val(*ptep) >> 6);
  2092. set_entryhi(address | (pid));
  2093. BARRIER;
  2094. if(idx < 0) {
  2095. tlb_write_random();
  2096. } else {
  2097. tlb_write_indexed();
  2098. }
  2099. BARRIER;
  2100. set_entryhi(pid);
  2101. BARRIER;
  2102. __restore_flags(flags);
  2103. }
  2104. #if 0
  2105. static void r4k_update_mmu_cache_hwbug(struct vm_area_struct * vma,
  2106.        unsigned long address, pte_t pte)
  2107. {
  2108. unsigned long flags;
  2109. pgd_t *pgdp;
  2110. pmd_t *pmdp;
  2111. pte_t *ptep;
  2112. int idx;
  2113. __save_and_cli(flags);
  2114. address &= (PAGE_MASK << 1);
  2115. set_entryhi(address | (get_entryhi() & 0xff));
  2116. pgdp = pgd_offset(vma->vm_mm, address);
  2117. tlb_probe();
  2118. pmdp = pmd_offset(pgdp, address);
  2119. idx = get_index();
  2120. ptep = pte_offset(pmdp, address);
  2121. set_entrylo0(pte_val(*ptep++) >> 6);
  2122. set_entrylo1(pte_val(*ptep) >> 6);
  2123. BARRIER;
  2124. if(idx < 0)
  2125. tlb_write_random();
  2126. else
  2127. tlb_write_indexed();
  2128. BARRIER;
  2129. __restore_flags(flags);
  2130. }
  2131. #endif
  2132. void show_regs(struct pt_regs * regs)
  2133. {
  2134. /* Saved main processor registers. */
  2135. printk("$0 : %08lx %08lx %08lx %08lxn",
  2136.        0UL, regs->regs[1], regs->regs[2], regs->regs[3]);
  2137. printk("$4 : %08lx %08lx %08lx %08lxn",
  2138.                regs->regs[4], regs->regs[5], regs->regs[6], regs->regs[7]);
  2139. printk("$8 : %08lx %08lx %08lx %08lxn",
  2140.        regs->regs[8], regs->regs[9], regs->regs[10], regs->regs[11]);
  2141. printk("$12: %08lx %08lx %08lx %08lxn",
  2142.                regs->regs[12], regs->regs[13], regs->regs[14], regs->regs[15]);
  2143. printk("$16: %08lx %08lx %08lx %08lxn",
  2144.        regs->regs[16], regs->regs[17], regs->regs[18], regs->regs[19]);
  2145. printk("$20: %08lx %08lx %08lx %08lxn",
  2146.                regs->regs[20], regs->regs[21], regs->regs[22], regs->regs[23]);
  2147. printk("$24: %08lx %08lxn",
  2148.        regs->regs[24], regs->regs[25]);
  2149. printk("$28: %08lx %08lx %08lx %08lxn",
  2150.        regs->regs[28], regs->regs[29], regs->regs[30], regs->regs[31]);
  2151. /* Saved cp0 registers. */
  2152. printk("epc   : %08lx    %snStatus: %08lxnCause : %08lxn",
  2153.        regs->cp0_epc, print_tainted(), regs->cp0_status, regs->cp0_cause);
  2154. }
  2155. void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
  2156.       unsigned long entryhi, unsigned long pagemask)
  2157. {
  2158.         unsigned long flags;
  2159.         unsigned long wired;
  2160.         unsigned long old_pagemask;
  2161.         unsigned long old_ctx;
  2162.         __save_and_cli(flags);
  2163.         /* Save old context and create impossible VPN2 value */
  2164.         old_ctx = (get_entryhi() & 0xff);
  2165.         old_pagemask = get_pagemask();
  2166.         wired = get_wired();
  2167.         set_wired (wired + 1);
  2168.         set_index (wired);
  2169.         BARRIER;    
  2170.         set_pagemask (pagemask);
  2171.         set_entryhi(entryhi);
  2172.         set_entrylo0(entrylo0);
  2173.         set_entrylo1(entrylo1);
  2174.         BARRIER;    
  2175.         tlb_write_indexed();
  2176.         BARRIER;    
  2177.     
  2178.         set_entryhi(old_ctx);
  2179.         BARRIER;    
  2180.         set_pagemask (old_pagemask);
  2181.         flush_tlb_all();    
  2182.         __restore_flags(flags);
  2183. }
  2184. /* Detect and size the various r4k caches. */
  2185. static void __init probe_icache(unsigned long config)
  2186. {
  2187.         switch (mips_cpu.cputype) {
  2188.         case CPU_VR41XX:
  2189.                 icache_size = 1 << (10 + ((config >> 9) & 7));
  2190.                 break;
  2191.         default:
  2192.                 icache_size = 1 << (12 + ((config >> 9) & 7));
  2193.                 break;
  2194.         }
  2195. ic_lsize = 16 << ((config >> 5) & 1);
  2196. printk("Primary instruction cache %dkb, linesize %d bytes.n",
  2197.        icache_size >> 10, ic_lsize);
  2198. }
  2199. static void __init probe_dcache(unsigned long config)
  2200. {
  2201.         switch (mips_cpu.cputype) {
  2202.         case CPU_VR41XX:
  2203.                 dcache_size = 1 << (10 + ((config >> 6) & 7));
  2204.                 break;
  2205.         default:
  2206.                 dcache_size = 1 << (12 + ((config >> 6) & 7));
  2207.                 break;
  2208.         }
  2209. dc_lsize = 16 << ((config >> 4) & 1);
  2210. printk("Primary data cache %dkb, linesize %d bytes.n",
  2211.        dcache_size >> 10, dc_lsize);
  2212. }
  2213. /* If you even _breathe_ on this function, look at the gcc output
  2214.  * and make sure it does not pop things on and off the stack for
  2215.  * the cache sizing loop that executes in KSEG1 space or else
  2216.  * you will crash and burn badly.  You have been warned.
  2217.  */
  2218. static int __init probe_scache(unsigned long config)
  2219. {
  2220. extern unsigned long stext;
  2221. unsigned long flags, addr, begin, end, pow2;
  2222. int tmp;
  2223. tmp = ((config >> 17) & 1);
  2224. if(tmp)
  2225. return 0;
  2226. tmp = ((config >> 22) & 3);
  2227. switch(tmp) {
  2228. case 0:
  2229. sc_lsize = 16;
  2230. break;
  2231. case 1:
  2232. sc_lsize = 32;
  2233. break;
  2234. case 2:
  2235. sc_lsize = 64;
  2236. break;
  2237. case 3:
  2238. sc_lsize = 128;
  2239. break;
  2240. }
  2241. begin = (unsigned long) &stext;
  2242. begin &= ~((4 * 1024 * 1024) - 1);
  2243. end = begin + (4 * 1024 * 1024);
  2244. /* This is such a bitch, you'd think they would make it
  2245.  * easy to do this.  Away you daemons of stupidity!
  2246.  */
  2247. __save_and_cli(flags);
  2248. /* Fill each size-multiple cache line with a valid tag. */
  2249. pow2 = (64 * 1024);
  2250. for(addr = begin; addr < end; addr = (begin + pow2)) {
  2251. unsigned long *p = (unsigned long *) addr;
  2252. __asm__ __volatile__("nop" : : "r" (*p)); /* whee... */
  2253. pow2 <<= 1;
  2254. }
  2255. /* Load first line with zero (therefore invalid) tag. */
  2256. set_taglo(0);
  2257. set_taghi(0);
  2258. __asm__ __volatile__("nop; nop; nop; nop;"); /* avoid the hazard */
  2259. __asm__ __volatile__("nt.set noreordernt"
  2260.      ".set mips3nt"
  2261.      "cache 8, (%0)nt"
  2262.      ".set mips0nt"
  2263.      ".set reordernt" : : "r" (begin));
  2264. __asm__ __volatile__("nt.set noreordernt"
  2265.      ".set mips3nt"
  2266.      "cache 9, (%0)nt"
  2267.      ".set mips0nt"
  2268.      ".set reordernt" : : "r" (begin));
  2269. __asm__ __volatile__("nt.set noreordernt"
  2270.      ".set mips3nt"
  2271.      "cache 11, (%0)nt"
  2272.      ".set mips0nt"
  2273.      ".set reordernt" : : "r" (begin));
  2274. /* Now search for the wrap around point. */
  2275. pow2 = (128 * 1024);
  2276. tmp = 0;
  2277. for(addr = (begin + (128 * 1024)); addr < (end); addr = (begin + pow2)) {
  2278. __asm__ __volatile__("nt.set noreordernt"
  2279.      ".set mips3nt"
  2280.      "cache 7, (%0)nt"
  2281.      ".set mips0nt"
  2282.      ".set reordernt" : : "r" (addr));
  2283. __asm__ __volatile__("nop; nop; nop; nop;"); /* hazard... */
  2284. if(!get_taglo())
  2285. break;
  2286. pow2 <<= 1;
  2287. }
  2288. __restore_flags(flags);
  2289. addr -= begin;
  2290. printk("Secondary cache sized at %dK linesize %d bytes.n",
  2291.        (int) (addr >> 10), sc_lsize);
  2292. scache_size = addr;
  2293. return 1;
  2294. }
  2295. static void __init setup_noscache_funcs(void)
  2296. {
  2297. unsigned int prid;
  2298. switch(dc_lsize) {
  2299. case 16:
  2300. _clear_page = r4k_clear_page_d16;
  2301. _copy_page = r4k_copy_page_d16;
  2302. _flush_cache_all = r4k_flush_cache_all_d16i16;
  2303. _flush_cache_mm = r4k_flush_cache_mm_d16i16;
  2304. _flush_cache_range = r4k_flush_cache_range_d16i16;
  2305. _flush_cache_page = r4k_flush_cache_page_d16i16;
  2306. _flush_page_to_ram = r4k_flush_page_to_ram_d16;
  2307. break;
  2308. case 32:
  2309. prid = read_32bit_cp0_register(CP0_PRID) & 0xfff0;
  2310. if (prid == 0x2010) { /* R4600 V1.7 */
  2311. _clear_page = r4k_clear_page_r4600_v1;
  2312. _copy_page = r4k_copy_page_r4600_v1;
  2313. _flush_page_to_ram = r4k_flush_page_to_ram_d32_r4600;
  2314. } else if (prid == 0x2020) { /* R4600 V2.0 */
  2315. _clear_page = r4k_clear_page_r4600_v2;
  2316. _copy_page = r4k_copy_page_r4600_v2;
  2317. _flush_page_to_ram = r4k_flush_page_to_ram_d32;
  2318. } else {
  2319. _clear_page = r4k_clear_page_d32;
  2320. _copy_page = r4k_copy_page_d32;
  2321. _flush_page_to_ram = r4k_flush_page_to_ram_d32;
  2322. }
  2323. _flush_cache_all = r4k_flush_cache_all_d32i32;
  2324. _flush_cache_mm = r4k_flush_cache_mm_d32i32;
  2325. _flush_cache_range = r4k_flush_cache_range_d32i32;
  2326. _flush_cache_page = r4k_flush_cache_page_d32i32;
  2327. break;
  2328. }
  2329. ___flush_cache_all = _flush_cache_all;
  2330. _flush_icache_page = r4k_flush_icache_page_p;
  2331. _dma_cache_wback_inv = r4k_dma_cache_wback_inv_pc;
  2332. _dma_cache_wback = r4k_dma_cache_wback;
  2333. _dma_cache_inv = r4k_dma_cache_inv_pc;
  2334. }
  2335. static void __init setup_scache_funcs(void)
  2336. {
  2337. switch(sc_lsize) {
  2338. case 16:
  2339. switch(dc_lsize) {
  2340. case 16:
  2341. _flush_cache_all = r4k_flush_cache_all_s16d16i16;
  2342. _flush_cache_mm = r4k_flush_cache_mm_s16d16i16;
  2343. _flush_cache_range = r4k_flush_cache_range_s16d16i16;
  2344. _flush_cache_page = r4k_flush_cache_page_s16d16i16;
  2345. break;
  2346. case 32:
  2347. panic("Invalid cache configuration detected");
  2348. };
  2349. _flush_page_to_ram = r4k_flush_page_to_ram_s16;
  2350. _clear_page = r4k_clear_page_s16;
  2351. _copy_page = r4k_copy_page_s16;
  2352. break;
  2353. case 32:
  2354. switch(dc_lsize) {
  2355. case 16:
  2356. _flush_cache_all = r4k_flush_cache_all_s32d16i16;
  2357. _flush_cache_mm = r4k_flush_cache_mm_s32d16i16;
  2358. _flush_cache_range = r4k_flush_cache_range_s32d16i16;
  2359. _flush_cache_page = r4k_flush_cache_page_s32d16i16;
  2360. break;
  2361. case 32:
  2362. _flush_cache_all = r4k_flush_cache_all_s32d32i32;
  2363. _flush_cache_mm = r4k_flush_cache_mm_s32d32i32;
  2364. _flush_cache_range = r4k_flush_cache_range_s32d32i32;
  2365. _flush_cache_page = r4k_flush_cache_page_s32d32i32;
  2366. break;
  2367. };
  2368. _flush_page_to_ram = r4k_flush_page_to_ram_s32;
  2369. _clear_page = r4k_clear_page_s32;
  2370. _copy_page = r4k_copy_page_s32;
  2371. break;
  2372. case 64:
  2373. switch(dc_lsize) {
  2374. case 16:
  2375. _flush_cache_all = r4k_flush_cache_all_s64d16i16;
  2376. _flush_cache_mm = r4k_flush_cache_mm_s64d16i16;
  2377. _flush_cache_range = r4k_flush_cache_range_s64d16i16;
  2378. _flush_cache_page = r4k_flush_cache_page_s64d16i16;
  2379. break;
  2380. case 32:
  2381. _flush_cache_all = r4k_flush_cache_all_s64d32i32;
  2382. _flush_cache_mm = r4k_flush_cache_mm_s64d32i32;
  2383. _flush_cache_range = r4k_flush_cache_range_s64d32i32;
  2384. _flush_cache_page = r4k_flush_cache_page_s64d32i32;
  2385. break;
  2386. };
  2387. _flush_page_to_ram = r4k_flush_page_to_ram_s64;
  2388. _clear_page = r4k_clear_page_s64;
  2389. _copy_page = r4k_copy_page_s64;
  2390. break;
  2391. case 128:
  2392. switch(dc_lsize) {
  2393. case 16:
  2394. _flush_cache_all = r4k_flush_cache_all_s128d16i16;
  2395. _flush_cache_mm = r4k_flush_cache_mm_s128d16i16;
  2396. _flush_cache_range = r4k_flush_cache_range_s128d16i16;
  2397. _flush_cache_page = r4k_flush_cache_page_s128d16i16;
  2398. break;
  2399. case 32:
  2400. _flush_cache_all = r4k_flush_cache_all_s128d32i32;
  2401. _flush_cache_mm = r4k_flush_cache_mm_s128d32i32;
  2402. _flush_cache_range = r4k_flush_cache_range_s128d32i32;
  2403. _flush_cache_page = r4k_flush_cache_page_s128d32i32;
  2404. break;
  2405. };
  2406. _flush_page_to_ram = r4k_flush_page_to_ram_s128;
  2407. _clear_page = r4k_clear_page_s128;
  2408. _copy_page = r4k_copy_page_s128;
  2409. break;
  2410. }
  2411. ___flush_cache_all = _flush_cache_all;
  2412. _flush_icache_page = r4k_flush_icache_page_s;
  2413. _dma_cache_wback_inv = r4k_dma_cache_wback_inv_sc;
  2414. _dma_cache_wback = r4k_dma_cache_wback;
  2415. _dma_cache_inv = r4k_dma_cache_inv_sc;
  2416. }
  2417. typedef int (*probe_func_t)(unsigned long);
  2418. static inline void __init setup_scache(unsigned int config)
  2419. {
  2420. probe_func_t probe_scache_kseg1;
  2421. int sc_present = 0;
  2422. /* Maybe the cpu knows about a l2 cache? */
  2423. probe_scache_kseg1 = (probe_func_t) (KSEG1ADDR(&probe_scache));
  2424. sc_present = probe_scache_kseg1(config);
  2425. if (sc_present) {
  2426. setup_scache_funcs();
  2427. return;
  2428. }
  2429. setup_noscache_funcs();
  2430. }
  2431. void __init ld_mmu_r4xx0(void)
  2432. {
  2433. unsigned long config = read_32bit_cp0_register(CP0_CONFIG);
  2434. printk("CPU revision is: %08xn", read_32bit_cp0_register(CP0_PRID));
  2435. #ifdef CONFIG_MIPS_UNCACHED
  2436. change_cp0_config(CONF_CM_CMASK, CONF_CM_UNCACHED);
  2437. #else
  2438. change_cp0_config(CONF_CM_CMASK, CONF_CM_CACHABLE_NONCOHERENT);
  2439. #endif
  2440. probe_icache(config);
  2441. probe_dcache(config);
  2442. setup_scache(config);
  2443. switch(mips_cpu.cputype) {
  2444. case CPU_R4600: /* QED style two way caches? */
  2445. case CPU_R4700:
  2446. case CPU_R5000:
  2447. case CPU_NEVADA:
  2448. _flush_cache_page = r4k_flush_cache_page_d32i32_r4600;
  2449. }
  2450. _flush_cache_sigtramp = r4k_flush_cache_sigtramp;
  2451. _flush_icache_range = r4k_flush_icache_range; /* Ouch */
  2452. if ((read_32bit_cp0_register(CP0_PRID) & 0xfff0) == 0x2020) {
  2453. _flush_cache_sigtramp = r4600v20k_flush_cache_sigtramp;
  2454. }
  2455. __flush_cache_all();
  2456. write_32bit_cp0_register(CP0_WIRED, 0);
  2457. /*
  2458.  * You should never change this register:
  2459.  *   - On R4600 1.7 the tlbp never hits for pages smaller than
  2460.  *     the value in the c0_pagemask register.
  2461.  *   - The entire mm handling assumes the c0_pagemask register to
  2462.  *     be set for 4kb pages.
  2463.  */
  2464. set_pagemask(PM_4K);
  2465. flush_tlb_all();
  2466. }