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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * mips32_cache.h
  3.  *
  4.  * Carsten Langgaard, carstenl@mips.com
  5.  * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
  6.  *
  7.  * ########################################################################
  8.  *
  9.  *  This program is free software; you can distribute it and/or modify it
  10.  *  under the terms of the GNU General Public License (Version 2) as
  11.  *  published by the Free Software Foundation.
  12.  *
  13.  *  This program is distributed in the hope it will be useful, but WITHOUT
  14.  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  15.  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  16.  *  for more details.
  17.  *
  18.  *  You should have received a copy of the GNU General Public License along
  19.  *  with this program; if not, write to the Free Software Foundation, Inc.,
  20.  *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  21.  *
  22.  * ########################################################################
  23.  *
  24.  * Inline assembly cache operations.
  25.  * 
  26.  * This file is the original r4cache.c file with modification that makes the
  27.  * cache handling more generic.
  28.  *
  29.  * FIXME: Handle split L2 caches.
  30.  *
  31.  */
  32. #ifndef _MIPS_R4KCACHE_H
  33. #define _MIPS_R4KCACHE_H
  34. #include <asm/asm.h>
  35. #include <asm/cacheops.h>
  36. extern inline void flush_icache_line_indexed(unsigned long addr)
  37. {
  38. __asm__ __volatile__(
  39. ".set noreordernt"
  40. ".set mips3nt"
  41. "cache %1, (%0)nt"
  42. ".set mips0nt"
  43. ".set reorder"
  44. :
  45. : "r" (addr),
  46.   "i" (Index_Invalidate_I));
  47. }
  48. extern inline void flush_dcache_line_indexed(unsigned long addr)
  49. {
  50. __asm__ __volatile__(
  51. ".set noreordernt"
  52. ".set mips3nt"
  53. "cache %1, (%0)nt"
  54. ".set mips0nt"
  55. ".set reorder"
  56. :
  57. : "r" (addr),
  58.   "i" (Index_Writeback_Inv_D));
  59. }
  60. extern inline void flush_scache_line_indexed(unsigned long addr)
  61. {
  62. __asm__ __volatile__(
  63. ".set noreordernt"
  64. ".set mips3nt"
  65. "cache %1, (%0)nt"
  66. ".set mips0nt"
  67. ".set reorder"
  68. :
  69. : "r" (addr),
  70.   "i" (Index_Writeback_Inv_SD));
  71. }
  72. extern inline void flush_icache_line(unsigned long addr)
  73. {
  74. __asm__ __volatile__(
  75. ".set noreordernt"
  76. ".set mips3nt"
  77. "cache %1, (%0)nt"
  78. ".set mips0nt"
  79. ".set reorder"
  80. :
  81. : "r" (addr),
  82.   "i" (Hit_Invalidate_I));
  83. }
  84. extern inline void flush_dcache_line(unsigned long addr)
  85. {
  86. __asm__ __volatile__(
  87. ".set noreordernt"
  88. ".set mips3nt"
  89. "cache %1, (%0)nt"
  90. ".set mips0nt"
  91. ".set reorder"
  92. :
  93. : "r" (addr),
  94.   "i" (Hit_Writeback_Inv_D));
  95. }
  96. extern inline void invalidate_dcache_line(unsigned long addr)
  97. {
  98. __asm__ __volatile__(
  99. ".set noreordernt"
  100. ".set mips3nt"
  101. "cache %1, (%0)nt"
  102. ".set mips0nt"
  103. ".set reorder"
  104. :
  105. : "r" (addr),
  106.   "i" (Hit_Invalidate_D));
  107. }
  108. extern inline void invalidate_scache_line(unsigned long addr)
  109. {
  110. __asm__ __volatile__(
  111. ".set noreordernt"
  112. ".set mips3nt"
  113. "cache %1, (%0)nt"
  114. ".set mips0nt"
  115. ".set reorder"
  116. :
  117. : "r" (addr),
  118.   "i" (Hit_Invalidate_SD));
  119. }
  120. extern inline void flush_scache_line(unsigned long addr)
  121. {
  122. __asm__ __volatile__(
  123. ".set noreordernt"
  124. ".set mips3nt"
  125. "cache %1, (%0)nt"
  126. ".set mips0nt"
  127. ".set reorder"
  128. :
  129. : "r" (addr),
  130.   "i" (Hit_Writeback_Inv_SD));
  131. }
  132. /*
  133.  * The next two are for badland addresses like signal trampolines.
  134.  */
  135. extern inline void protected_flush_icache_line(unsigned long addr)
  136. {
  137. __asm__ __volatile__(
  138. ".set noreordernt"
  139. ".set mips3n"
  140. "1:tcache %1,(%0)n"
  141. "2:t.set mips0nt"
  142. ".set reordernt"
  143. ".sectiont__ex_table,"a"nt"
  144. STR(PTR)"t1b,2bnt"
  145. ".previous"
  146. :
  147. : "r" (addr),
  148.   "i" (Hit_Invalidate_I));
  149. }
  150. extern inline void protected_writeback_dcache_line(unsigned long addr)
  151. {
  152. __asm__ __volatile__(
  153. ".set noreordernt"
  154. ".set mips3n"
  155. "1:tcache %1,(%0)n"
  156. "2:t.set mips0nt"
  157. ".set reordernt"
  158. ".sectiont__ex_table,"a"nt"
  159. STR(PTR)"t1b,2bnt"
  160. ".previous"
  161. :
  162. : "r" (addr),
  163.   "i" (Hit_Writeback_D));
  164. }
  165. #define cache_unroll(base,op)         
  166. __asm__ __volatile__("          
  167. .set noreorder;         
  168. .set mips3;         
  169.                 cache %1, (%0);                 
  170. .set mips0;
  171. .set reorder"
  172. :
  173. : "r" (base),
  174.   "i" (op));
  175. extern inline void blast_dcache(void)
  176. {
  177. unsigned long start = KSEG0;
  178. unsigned long end = (start + dcache_size);
  179. while(start < end) {
  180. cache_unroll(start,Index_Writeback_Inv_D);
  181. start += dc_lsize;
  182. }
  183. }
  184. extern inline void blast_dcache_page(unsigned long page)
  185. {
  186. unsigned long start = page;
  187. unsigned long end = (start + PAGE_SIZE);
  188. while(start < end) {
  189. cache_unroll(start,Hit_Writeback_Inv_D);
  190. start += dc_lsize;
  191. }
  192. }
  193. extern inline void blast_dcache_page_indexed(unsigned long page)
  194. {
  195. unsigned long start = page;
  196. unsigned long end = (start + PAGE_SIZE);
  197. while(start < end) {
  198. cache_unroll(start,Index_Writeback_Inv_D);
  199. start += dc_lsize;
  200. }
  201. }
  202. extern inline void blast_icache(void)
  203. {
  204. unsigned long start = KSEG0;
  205. unsigned long end = (start + icache_size);
  206. while(start < end) {
  207. cache_unroll(start,Index_Invalidate_I);
  208. start += ic_lsize;
  209. }
  210. }
  211. extern inline void blast_icache_page(unsigned long page)
  212. {
  213. unsigned long start = page;
  214. unsigned long end = (start + PAGE_SIZE);
  215. while(start < end) {
  216. cache_unroll(start,Hit_Invalidate_I);
  217. start += ic_lsize;
  218. }
  219. }
  220. extern inline void blast_icache_page_indexed(unsigned long page)
  221. {
  222. unsigned long start = page;
  223. unsigned long end = (start + PAGE_SIZE);
  224. while(start < end) {
  225. cache_unroll(start,Index_Invalidate_I);
  226. start += ic_lsize;
  227. }
  228. }
  229. extern inline void blast_scache(void)
  230. {
  231. unsigned long start = KSEG0;
  232. unsigned long end = KSEG0 + scache_size;
  233. while(start < end) {
  234. cache_unroll(start,Index_Writeback_Inv_SD);
  235. start += sc_lsize;
  236. }
  237. }
  238. extern inline void blast_scache_page(unsigned long page)
  239. {
  240. unsigned long start = page;
  241. unsigned long end = page + PAGE_SIZE;
  242. while(start < end) {
  243. cache_unroll(start,Hit_Writeback_Inv_SD);
  244. start += sc_lsize;
  245. }
  246. }
  247. extern inline void blast_scache_page_indexed(unsigned long page)
  248. {
  249. unsigned long start = page;
  250. unsigned long end = page + PAGE_SIZE;
  251. while(start < end) {
  252. cache_unroll(start,Index_Writeback_Inv_SD);
  253. start += sc_lsize;
  254. }
  255. }
  256. #endif /* !(_MIPS_R4KCACHE_H) */