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

嵌入式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.  * Copyright (C) 1994, 1995, 1996, 1997, 1999 by Ralf Baechle
  7.  * Modified for further R[236]000 support by Paul M. Antoine, 1996.
  8.  * Copyright (C) 1999 Silicon Graphics, Inc.
  9.  */
  10. #ifndef _ASM_MIPSREGS_H
  11. #define _ASM_MIPSREGS_H
  12. #include <linux/linkage.h>
  13. /*
  14.  * The following macros are especially useful for __asm__
  15.  * inline assembler.
  16.  */
  17. #ifndef __STR
  18. #define __STR(x) #x
  19. #endif
  20. #ifndef STR
  21. #define STR(x) __STR(x)
  22. #endif
  23. /*
  24.  * Coprocessor 0 register names
  25.  */
  26. #define CP0_INDEX $0
  27. #define CP0_RANDOM $1
  28. #define CP0_ENTRYLO0 $2
  29. #define CP0_ENTRYLO1 $3
  30. #define CP0_CONTEXT $4
  31. #define CP0_PAGEMASK $5
  32. #define CP0_WIRED $6
  33. #define CP0_INFO $7
  34. #define CP0_BADVADDR $8
  35. #define CP0_COUNT $9
  36. #define CP0_ENTRYHI $10
  37. #define CP0_COMPARE $11
  38. #define CP0_STATUS $12
  39. #define CP0_CAUSE $13
  40. #define CP0_EPC $14
  41. #define CP0_PRID $15
  42. #define CP0_CONFIG $16
  43. #define CP0_LLADDR $17
  44. #define CP0_WATCHLO $18
  45. #define CP0_WATCHHI $19
  46. #define CP0_XCONTEXT $20
  47. #define CP0_FRAMEMASK $21
  48. #define CP0_DIAGNOSTIC $22
  49. #define CP0_PERFORMANCE $25
  50. #define CP0_ECC $26
  51. #define CP0_CACHEERR $27
  52. #define CP0_TAGLO $28
  53. #define CP0_TAGHI $29
  54. #define CP0_ERROREPC $30
  55. /*
  56.  * Coprocessor 1 (FPU) register names
  57.  */
  58. #define CP1_REVISION   $0
  59. #define CP1_STATUS     $31
  60. /*
  61.  * Values for PageMask register
  62.  */
  63. #define PM_4K   0x00000000
  64. #define PM_16K  0x00006000
  65. #define PM_64K  0x0001e000
  66. #define PM_256K 0x0007e000
  67. #define PM_1M   0x001fe000
  68. #define PM_4M   0x007fe000
  69. #define PM_16M  0x01ffe000
  70. /*
  71.  * Values used for computation of new tlb entries
  72.  */
  73. #define PL_4K   12
  74. #define PL_16K  14
  75. #define PL_64K  16
  76. #define PL_256K 18
  77. #define PL_1M   20
  78. #define PL_4M   22
  79. #define PL_16M  24
  80. /*
  81.  * Macros to access the system control coprocessor
  82.  */
  83. #define read_32bit_cp0_register(source)                         
  84. ({ int __res;                                                   
  85.         __asm__ __volatile__(                                   
  86.         "mfc0t%0,"STR(source)                                  
  87.         : "=r" (__res));                                        
  88.         __res;})
  89. #define read_64bit_cp0_register(source)                         
  90. ({ int __res;                                                   
  91.         __asm__ __volatile__(                                   
  92.         ".settmips3nt"                                       
  93.         "dmfc0t%0,"STR(source)"nt"                           
  94.         ".settmips0"                                           
  95.         : "=r" (__res));                                        
  96.         __res;})
  97. #define write_32bit_cp0_register(register,value)                
  98.         __asm__ __volatile__(                                   
  99.         "mtc0t%0,"STR(register)                                
  100.         : : "r" (value));
  101. #define write_64bit_cp0_register(register,value)                
  102.         __asm__ __volatile__(                                   
  103.         ".settmips3nt"                                       
  104.         "dmtc0t%0,"STR(register)"nt"                         
  105.         ".settmips0"                                           
  106.         : : "r" (value))
  107. /*
  108.  * R4x00 interrupt enable / cause bits
  109.  */
  110. #define IE_SW0          (1<< 8)
  111. #define IE_SW1          (1<< 9)
  112. #define IE_IRQ0         (1<<10)
  113. #define IE_IRQ1         (1<<11)
  114. #define IE_IRQ2         (1<<12)
  115. #define IE_IRQ3         (1<<13)
  116. #define IE_IRQ4         (1<<14)
  117. #define IE_IRQ5         (1<<15)
  118. /*
  119.  * R4x00 interrupt cause bits
  120.  */
  121. #define C_SW0           (1<< 8)
  122. #define C_SW1           (1<< 9)
  123. #define C_IRQ0          (1<<10)
  124. #define C_IRQ1          (1<<11)
  125. #define C_IRQ2          (1<<12)
  126. #define C_IRQ3          (1<<13)
  127. #define C_IRQ4          (1<<14)
  128. #define C_IRQ5          (1<<15)
  129. #ifndef _LANGUAGE_ASSEMBLY
  130. /*
  131.  * Manipulate the status register.
  132.  * Mostly used to access the interrupt bits.
  133.  */
  134. #define __BUILD_SET_CP0(name,register)                          
  135. extern __inline__ unsigned int                                  
  136. set_cp0_##name(unsigned int change, unsigned int new)           
  137. {                                                               
  138. unsigned int res;                                       
  139.                                                                 
  140. res = read_32bit_cp0_register(register);                
  141. res &= ~change;                                         
  142. res |= (new & change);                                  
  143. write_32bit_cp0_register(register, res);                
  144.                                                                 
  145. return res;                                             
  146. }
  147. __BUILD_SET_CP0(status,CP0_STATUS)
  148. __BUILD_SET_CP0(cause,CP0_CAUSE)
  149. __BUILD_SET_CP0(config,CP0_CONFIG)
  150. #endif /* defined (_LANGUAGE_ASSEMBLY) */
  151. /*
  152.  * Bitfields in the R4xx0 cp0 status register
  153.  */
  154. #define ST0_IE 0x00000001
  155. #define ST0_EXL 0x00000002
  156. #define ST0_ERL 0x00000004
  157. #define ST0_KSU 0x00000018
  158. #  define KSU_USER 0x00000010
  159. #  define KSU_SUPERVISOR 0x00000008
  160. #  define KSU_KERNEL 0x00000000
  161. #define ST0_UX 0x00000020
  162. #define ST0_SX 0x00000040
  163. #define ST0_KX  0x00000080
  164. #define ST0_DE 0x00010000
  165. #define ST0_CE 0x00020000
  166. /*
  167.  * Status register bits available in all MIPS CPUs.
  168.  */
  169. #define ST0_IM 0x0000ff00
  170. #define  STATUSB_IP0 8
  171. #define  STATUSF_IP0 (1   <<  8)
  172. #define  STATUSB_IP1 9
  173. #define  STATUSF_IP1 (1   <<  9)
  174. #define  STATUSB_IP2 10
  175. #define  STATUSF_IP2 (1   << 10)
  176. #define  STATUSB_IP3 11
  177. #define  STATUSF_IP3 (1   << 11)
  178. #define  STATUSB_IP4 12
  179. #define  STATUSF_IP4 (1   << 12)
  180. #define  STATUSB_IP5 13
  181. #define  STATUSF_IP5 (1   << 13)
  182. #define  STATUSB_IP6 14
  183. #define  STATUSF_IP6 (1   << 14)
  184. #define  STATUSB_IP7 15
  185. #define  STATUSF_IP7 (1   << 15)
  186. #define ST0_CH 0x00040000
  187. #define ST0_SR 0x00100000
  188. #define ST0_TS 0x00200000
  189. #define ST0_BEV 0x00400000
  190. #define ST0_RE 0x02000000
  191. #define ST0_FR 0x04000000
  192. #define ST0_CU 0xf0000000
  193. #define ST0_CU0 0x10000000
  194. #define ST0_CU1 0x20000000
  195. #define ST0_CU2 0x40000000
  196. #define ST0_CU3 0x80000000
  197. #define ST0_XX 0x80000000 /* MIPS IV naming */
  198. /*
  199.  * Bitfields and bit numbers in the coprocessor 0 cause register.
  200.  *
  201.  * Refer to your MIPS R4xx0 manual, chapter 5 for explanation.
  202.  */
  203. #define  CAUSEB_EXCCODE 2
  204. #define  CAUSEF_EXCCODE (31  <<  2)
  205. #define  CAUSEB_IP 8
  206. #define  CAUSEF_IP (255 <<  8)
  207. #define  CAUSEB_IP0 8
  208. #define  CAUSEF_IP0 (1   <<  8)
  209. #define  CAUSEB_IP1 9
  210. #define  CAUSEF_IP1 (1   <<  9)
  211. #define  CAUSEB_IP2 10
  212. #define  CAUSEF_IP2 (1   << 10)
  213. #define  CAUSEB_IP3 11
  214. #define  CAUSEF_IP3 (1   << 11)
  215. #define  CAUSEB_IP4 12
  216. #define  CAUSEF_IP4 (1   << 12)
  217. #define  CAUSEB_IP5 13
  218. #define  CAUSEF_IP5 (1   << 13)
  219. #define  CAUSEB_IP6 14
  220. #define  CAUSEF_IP6 (1   << 14)
  221. #define  CAUSEB_IP7 15
  222. #define  CAUSEF_IP7 (1   << 15)
  223. #define  CAUSEB_IV 23
  224. #define  CAUSEF_IV (1   << 23)
  225. #define  CAUSEB_CE 28
  226. #define  CAUSEF_CE (3   << 28)
  227. #define  CAUSEB_BD 31
  228. #define  CAUSEF_BD (1   << 31)
  229. /*
  230.  * Bits in the coprocessor 0 config register.
  231.  */
  232. #define CONF_CM_CACHABLE_NO_WA 0
  233. #define CONF_CM_CACHABLE_WA 1
  234. #define CONF_CM_UNCACHED 2
  235. #define CONF_CM_CACHABLE_NONCOHERENT 3
  236. #define CONF_CM_CACHABLE_CE 4
  237. #define CONF_CM_CACHABLE_COW 5
  238. #define CONF_CM_CACHABLE_CUW 6
  239. #define CONF_CM_CACHABLE_ACCELERATED 7
  240. #define CONF_CM_CMASK 7
  241. #define CONF_DB (1 <<  4)
  242. #define CONF_IB (1 <<  5)
  243. #define CONF_SC (1 << 17)
  244. /*
  245.  * R10000 performance counter definitions.
  246.  *
  247.  * FIXME: The R10000 performance counter opens a nice way to implement CPU
  248.  *        time accounting with a precision of one cycle.  I don't have
  249.  *        R10000 silicon but just a manual, so ...
  250.  */
  251. /*
  252.  * Events counted by counter #0
  253.  */
  254. #define CE0_CYCLES 0
  255. #define CE0_INSN_ISSUED 1
  256. #define CE0_LPSC_ISSUED 2
  257. #define CE0_S_ISSUED 3
  258. #define CE0_SC_ISSUED 4
  259. #define CE0_SC_FAILED 5
  260. #define CE0_BRANCH_DECODED 6
  261. #define CE0_QW_WB_SECONDARY 7
  262. #define CE0_CORRECTED_ECC_ERRORS 8
  263. #define CE0_ICACHE_MISSES 9
  264. #define CE0_SCACHE_I_MISSES 10
  265. #define CE0_SCACHE_I_WAY_MISSPREDICTED 11
  266. #define CE0_EXT_INTERVENTIONS_REQ 12
  267. #define CE0_EXT_INVALIDATE_REQ 13
  268. #define CE0_VIRTUAL_COHERENCY_COND 14
  269. #define CE0_INSN_GRADUATED 15
  270. /*
  271.  * Events counted by counter #1
  272.  */
  273. #define CE1_CYCLES 0
  274. #define CE1_INSN_GRADUATED 1
  275. #define CE1_LPSC_GRADUATED 2
  276. #define CE1_S_GRADUATED 3
  277. #define CE1_SC_GRADUATED 4
  278. #define CE1_FP_INSN_GRADUATED 5
  279. #define CE1_QW_WB_PRIMARY 6
  280. #define CE1_TLB_REFILL 7
  281. #define CE1_BRANCH_MISSPREDICTED 8
  282. #define CE1_DCACHE_MISS 9
  283. #define CE1_SCACHE_D_MISSES 10
  284. #define CE1_SCACHE_D_WAY_MISSPREDICTED 11
  285. #define CE1_EXT_INTERVENTION_HITS 12
  286. #define CE1_EXT_INVALIDATE_REQ 13
  287. #define CE1_SP_HINT_TO_CEXCL_SC_BLOCKS 14
  288. #define CE1_SP_HINT_TO_SHARED_SC_BLOCKS 15
  289. /*
  290.  * These flags define in which priviledge mode the counters count events
  291.  */
  292. #define CEB_USER 8 /* Count events in user mode, EXL = ERL = 0 */
  293. #define CEB_SUPERVISOR 4 /* Count events in supvervisor mode EXL = ERL = 0 */
  294. #define CEB_KERNEL 2 /* Count events in kernel mode EXL = ERL = 0 */
  295. #define CEB_EXL 1 /* Count events with EXL = 1, ERL = 0 */
  296. #ifndef _LANGUAGE_ASSEMBLY
  297. /*
  298.  * Functions to access the performance counter and control registers
  299.  */
  300. extern asmlinkage unsigned int read_perf_cntr(unsigned int counter);
  301. extern asmlinkage void write_perf_cntr(unsigned int counter, unsigned int val);
  302. extern asmlinkage unsigned int read_perf_cntl(unsigned int counter);
  303. extern asmlinkage void write_perf_cntl(unsigned int counter, unsigned int val);
  304. #endif
  305. #endif /* _ASM_MIPSREGS_H */