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

Linux/Unix编程

开发平台:

Unix_Linux

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