home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / mips / include / asm / mipsmtregs.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  10.1 KB  |  396 lines

  1. /*
  2.  * MT regs definitions, follows on from mipsregs.h
  3.  * Copyright (C) 2004 - 2005 MIPS Technologies, Inc.  All rights reserved.
  4.  * Elizabeth Clarke et. al.
  5.  *
  6.  */
  7. #ifndef _ASM_MIPSMTREGS_H
  8. #define _ASM_MIPSMTREGS_H
  9.  
  10. #include <asm/mipsregs.h>
  11. #include <asm/war.h>
  12.  
  13. #ifndef __ASSEMBLY__
  14.  
  15. /*
  16.  * C macros
  17.  */
  18.  
  19. #define read_c0_mvpcontrol()        __read_32bit_c0_register($0, 1)
  20. #define write_c0_mvpcontrol(val)    __write_32bit_c0_register($0, 1, val)
  21.  
  22. #define read_c0_mvpconf0()        __read_32bit_c0_register($0, 2)
  23. #define read_c0_mvpconf1()        __read_32bit_c0_register($0, 3)
  24.  
  25. #define read_c0_vpecontrol()        __read_32bit_c0_register($1, 1)
  26. #define write_c0_vpecontrol(val)    __write_32bit_c0_register($1, 1, val)
  27.  
  28. #define read_c0_vpeconf0()        __read_32bit_c0_register($1, 2)
  29. #define write_c0_vpeconf0(val)        __write_32bit_c0_register($1, 2, val)
  30.  
  31. #define read_c0_tcstatus()        __read_32bit_c0_register($2, 1)
  32. #define write_c0_tcstatus(val)        __write_32bit_c0_register($2, 1, val)
  33.  
  34. #define read_c0_tcbind()        __read_32bit_c0_register($2, 2)
  35.  
  36. #define read_c0_tccontext()        __read_32bit_c0_register($2, 5)
  37. #define write_c0_tccontext(val)        __write_32bit_c0_register($2, 5, val)
  38.  
  39. #else /* Assembly */
  40. /*
  41.  * Macros for use in assembly language code
  42.  */
  43.  
  44. #define CP0_MVPCONTROL        $0, 1
  45. #define CP0_MVPCONF0        $0, 2
  46. #define CP0_MVPCONF1        $0, 3
  47. #define CP0_VPECONTROL        $1, 1
  48. #define CP0_VPECONF0        $1, 2
  49. #define CP0_VPECONF1        $1, 3
  50. #define CP0_YQMASK        $1, 4
  51. #define CP0_VPESCHEDULE    $1, 5
  52. #define CP0_VPESCHEFBK        $1, 6
  53. #define CP0_TCSTATUS        $2, 1
  54. #define CP0_TCBIND        $2, 2
  55. #define CP0_TCRESTART        $2, 3
  56. #define CP0_TCHALT        $2, 4
  57. #define CP0_TCCONTEXT        $2, 5
  58. #define CP0_TCSCHEDULE        $2, 6
  59. #define CP0_TCSCHEFBK        $2, 7
  60. #define CP0_SRSCONF0        $6, 1
  61. #define CP0_SRSCONF1        $6, 2
  62. #define CP0_SRSCONF2        $6, 3
  63. #define CP0_SRSCONF3        $6, 4
  64. #define CP0_SRSCONF4        $6, 5
  65.  
  66. #endif
  67.  
  68. /* MVPControl fields */
  69. #define MVPCONTROL_EVP        (_ULCAST_(1))
  70.  
  71. #define MVPCONTROL_VPC_SHIFT    1
  72. #define MVPCONTROL_VPC        (_ULCAST_(1) << MVPCONTROL_VPC_SHIFT)
  73.  
  74. #define MVPCONTROL_STLB_SHIFT    2
  75. #define MVPCONTROL_STLB        (_ULCAST_(1) << MVPCONTROL_STLB_SHIFT)
  76.  
  77.  
  78. /* MVPConf0 fields */
  79. #define MVPCONF0_PTC_SHIFT    0
  80. #define MVPCONF0_PTC        ( _ULCAST_(0xff))
  81. #define MVPCONF0_PVPE_SHIFT    10
  82. #define MVPCONF0_PVPE        ( _ULCAST_(0xf) << MVPCONF0_PVPE_SHIFT)
  83. #define MVPCONF0_TCA_SHIFT    15
  84. #define MVPCONF0_TCA        ( _ULCAST_(1) << MVPCONF0_TCA_SHIFT)
  85. #define MVPCONF0_PTLBE_SHIFT    16
  86. #define MVPCONF0_PTLBE        (_ULCAST_(0x3ff) << MVPCONF0_PTLBE_SHIFT)
  87. #define MVPCONF0_TLBS_SHIFT    29
  88. #define MVPCONF0_TLBS        (_ULCAST_(1) << MVPCONF0_TLBS_SHIFT)
  89. #define MVPCONF0_M_SHIFT    31
  90. #define MVPCONF0_M        (_ULCAST_(0x1) << MVPCONF0_M_SHIFT)
  91.  
  92.  
  93. /* config3 fields */
  94. #define CONFIG3_MT_SHIFT    2
  95. #define CONFIG3_MT        (_ULCAST_(1) << CONFIG3_MT_SHIFT)
  96.  
  97.  
  98. /* VPEControl fields (per VPE) */
  99. #define VPECONTROL_TARGTC    (_ULCAST_(0xff))
  100.  
  101. #define VPECONTROL_TE_SHIFT    15
  102. #define VPECONTROL_TE        (_ULCAST_(1) << VPECONTROL_TE_SHIFT)
  103. #define VPECONTROL_EXCPT_SHIFT    16
  104. #define VPECONTROL_EXCPT    (_ULCAST_(0x7) << VPECONTROL_EXCPT_SHIFT)
  105.  
  106. /* Thread Exception Codes for EXCPT field */
  107. #define THREX_TU        0
  108. #define THREX_TO        1
  109. #define THREX_IYQ        2
  110. #define THREX_GSX        3
  111. #define THREX_YSCH        4
  112. #define THREX_GSSCH        5
  113.  
  114. #define VPECONTROL_GSI_SHIFT    20
  115. #define VPECONTROL_GSI        (_ULCAST_(1) << VPECONTROL_GSI_SHIFT)
  116. #define VPECONTROL_YSI_SHIFT    21
  117. #define VPECONTROL_YSI        (_ULCAST_(1) << VPECONTROL_YSI_SHIFT)
  118.  
  119. /* VPEConf0 fields (per VPE) */
  120. #define VPECONF0_VPA_SHIFT    0
  121. #define VPECONF0_VPA        (_ULCAST_(1) << VPECONF0_VPA_SHIFT)
  122. #define VPECONF0_MVP_SHIFT    1
  123. #define VPECONF0_MVP        (_ULCAST_(1) << VPECONF0_MVP_SHIFT)
  124. #define VPECONF0_XTC_SHIFT    21
  125. #define VPECONF0_XTC        (_ULCAST_(0xff) << VPECONF0_XTC_SHIFT)
  126.  
  127. /* TCStatus fields (per TC) */
  128. #define TCSTATUS_TASID        (_ULCAST_(0xff))
  129. #define TCSTATUS_IXMT_SHIFT    10
  130. #define TCSTATUS_IXMT        (_ULCAST_(1) << TCSTATUS_IXMT_SHIFT)
  131. #define TCSTATUS_TKSU_SHIFT    11
  132. #define TCSTATUS_TKSU        (_ULCAST_(3) << TCSTATUS_TKSU_SHIFT)
  133. #define TCSTATUS_A_SHIFT    13
  134. #define TCSTATUS_A        (_ULCAST_(1) << TCSTATUS_A_SHIFT)
  135. #define TCSTATUS_DA_SHIFT    15
  136. #define TCSTATUS_DA        (_ULCAST_(1) << TCSTATUS_DA_SHIFT)
  137. #define TCSTATUS_DT_SHIFT    20
  138. #define TCSTATUS_DT        (_ULCAST_(1) << TCSTATUS_DT_SHIFT)
  139. #define TCSTATUS_TDS_SHIFT    21
  140. #define TCSTATUS_TDS        (_ULCAST_(1) << TCSTATUS_TDS_SHIFT)
  141. #define TCSTATUS_TSST_SHIFT    22
  142. #define TCSTATUS_TSST        (_ULCAST_(1) << TCSTATUS_TSST_SHIFT)
  143. #define TCSTATUS_RNST_SHIFT    23
  144. #define TCSTATUS_RNST        (_ULCAST_(3) << TCSTATUS_RNST_SHIFT)
  145. /* Codes for RNST */
  146. #define TC_RUNNING        0
  147. #define TC_WAITING        1
  148. #define TC_YIELDING        2
  149. #define TC_GATED        3
  150.  
  151. #define TCSTATUS_TMX_SHIFT    27
  152. #define TCSTATUS_TMX        (_ULCAST_(1) << TCSTATUS_TMX_SHIFT)
  153. /* TCStatus TCU bits can use same definitions/offsets as CU bits in Status */
  154.  
  155. /* TCBind */
  156. #define TCBIND_CURVPE_SHIFT    0
  157. #define TCBIND_CURVPE        (_ULCAST_(0xf))
  158.  
  159. #define TCBIND_CURTC_SHIFT    21
  160.  
  161. #define TCBIND_CURTC        (_ULCAST_(0xff) << TCBIND_CURTC_SHIFT)
  162.  
  163. /* TCHalt */
  164. #define TCHALT_H        (_ULCAST_(1))
  165.  
  166. #ifndef __ASSEMBLY__
  167.  
  168. static inline unsigned int dvpe(void)
  169. {
  170.     int res = 0;
  171.  
  172.     __asm__ __volatile__(
  173.     "    .set    push                        \n"
  174.     "    .set    noreorder                    \n"
  175.     "    .set    noat                        \n"
  176.     "    .set    mips32r2                    \n"
  177.     "    .word    0x41610001        # dvpe $1        \n"
  178.     "    move    %0, $1                        \n"
  179.     "    ehb                            \n"
  180.     "    .set    pop                        \n"
  181.     : "=r" (res));
  182.  
  183.     instruction_hazard();
  184.  
  185.     return res;
  186. }
  187.  
  188. static inline void __raw_evpe(void)
  189. {
  190.     __asm__ __volatile__(
  191.     "    .set    push                        \n"
  192.     "    .set    noreorder                    \n"
  193.     "    .set    noat                        \n"
  194.     "    .set    mips32r2                    \n"
  195.     "    .word    0x41600021        # evpe            \n"
  196.     "    ehb                            \n"
  197.     "    .set    pop                        \n");
  198. }
  199.  
  200. /* Enable virtual processor execution if previous suggested it should be.
  201.    EVPE_ENABLE to force */
  202.  
  203. #define EVPE_ENABLE MVPCONTROL_EVP
  204.  
  205. static inline void evpe(int previous)
  206. {
  207.     if ((previous & MVPCONTROL_EVP))
  208.         __raw_evpe();
  209. }
  210.  
  211. static inline unsigned int dmt(void)
  212. {
  213.     int res;
  214.  
  215.     __asm__ __volatile__(
  216.     "    .set    push                        \n"
  217.     "    .set    mips32r2                    \n"
  218.     "    .set    noat                        \n"
  219.     "    .word    0x41610BC1            # dmt $1    \n"
  220.     "    ehb                            \n"
  221.     "    move    %0, $1                        \n"
  222.     "    .set    pop                        \n"
  223.     : "=r" (res));
  224.  
  225.     instruction_hazard();
  226.  
  227.     return res;
  228. }
  229.  
  230. static inline void __raw_emt(void)
  231. {
  232.     __asm__ __volatile__(
  233.     "    .set    noreorder                    \n"
  234.     "    .set    mips32r2                    \n"
  235.     "    .word    0x41600be1            # emt        \n"
  236.     "    ehb                            \n"
  237.     "    .set    mips0                        \n"
  238.     "    .set    reorder");
  239. }
  240.  
  241. /* enable multi-threaded execution if previous suggested it should be.
  242.    EMT_ENABLE to force */
  243.  
  244. #define EMT_ENABLE VPECONTROL_TE
  245.  
  246. static inline void emt(int previous)
  247. {
  248.     if ((previous & EMT_ENABLE))
  249.         __raw_emt();
  250. }
  251.  
  252. static inline void ehb(void)
  253. {
  254.     __asm__ __volatile__(
  255.     "    .set    mips32r2                \n"
  256.     "    ehb                        \n"
  257.     "    .set    mips0                    \n");
  258. }
  259.  
  260. #define mftc0(rt,sel)                            \
  261. ({                                    \
  262.      unsigned long  __res;                        \
  263.                                     \
  264.     __asm__ __volatile__(                        \
  265.     "    .set    push                    \n"    \
  266.     "    .set    mips32r2                \n"    \
  267.     "    .set    noat                    \n"    \
  268.     "    # mftc0    $1, $" #rt ", " #sel "            \n"    \
  269.     "    .word    0x41000800 | (" #rt " << 16) | " #sel "    \n"    \
  270.     "    move    %0, $1                    \n"    \
  271.     "    .set    pop                    \n"    \
  272.     : "=r" (__res));                        \
  273.                                     \
  274.     __res;                                \
  275. })
  276.  
  277. #define mftgpr(rt)                            \
  278. ({                                    \
  279.     unsigned long __res;                        \
  280.                                     \
  281.     __asm__ __volatile__(                        \
  282.     "    .set    push                    \n"    \
  283.     "    .set    noat                    \n"    \
  284.     "    .set    mips32r2                \n"    \
  285.     "    # mftgpr $1," #rt "                \n"    \
  286.     "    .word    0x41000820 | (" #rt " << 16)        \n"    \
  287.     "    move    %0, $1                    \n"    \
  288.     "    .set    pop                    \n"    \
  289.     : "=r" (__res));                        \
  290.                                     \
  291.     __res;                                \
  292. })
  293.  
  294. #define mftr(rt, u, sel)                            \
  295. ({                                    \
  296.     unsigned long __res;                        \
  297.                                     \
  298.     __asm__ __volatile__(                        \
  299.     "    mftr    %0, " #rt ", " #u ", " #sel "        \n"    \
  300.     : "=r" (__res));                        \
  301.                                     \
  302.     __res;                                \
  303. })
  304.  
  305. #define mttgpr(rd,v)                            \
  306. do {                                    \
  307.     __asm__ __volatile__(                        \
  308.     "    .set    push                    \n"    \
  309.     "    .set    mips32r2                \n"    \
  310.     "    .set    noat                    \n"    \
  311.     "    move    $1, %0                    \n"    \
  312.     "    # mttgpr $1, " #rd "                \n"    \
  313.     "    .word    0x41810020 | (" #rd " << 11)        \n"    \
  314.     "    .set    pop                    \n"    \
  315.     : : "r" (v));                            \
  316. } while (0)
  317.  
  318. #define mttc0(rd, sel, v)                            \
  319. ({                                    \
  320.     __asm__ __volatile__(                        \
  321.     "    .set    push                    \n"    \
  322.     "    .set    mips32r2                \n"    \
  323.     "    .set    noat                    \n"    \
  324.     "    move    $1, %0                    \n"    \
  325.     "    # mttc0 %0," #rd ", " #sel "            \n"    \
  326.     "    .word    0x41810000 | (" #rd " << 11) | " #sel "    \n"    \
  327.     "    .set    pop                    \n"    \
  328.     :                                \
  329.     : "r" (v));                            \
  330. })
  331.  
  332.  
  333. #define mttr(rd, u, sel, v)                        \
  334. ({                                    \
  335.     __asm__ __volatile__(                        \
  336.     "mttr    %0," #rd ", " #u ", " #sel                \
  337.     : : "r" (v));                            \
  338. })
  339.  
  340.  
  341. #define settc(tc)                            \
  342. do {                                    \
  343.     write_c0_vpecontrol((read_c0_vpecontrol()&~VPECONTROL_TARGTC) | (tc)); \
  344.     ehb();                                \
  345. } while (0)
  346.  
  347.  
  348. /* you *must* set the target tc (settc) before trying to use these */
  349. #define read_vpe_c0_vpecontrol()    mftc0(1, 1)
  350. #define write_vpe_c0_vpecontrol(val)    mttc0(1, 1, val)
  351. #define read_vpe_c0_vpeconf0()        mftc0(1, 2)
  352. #define write_vpe_c0_vpeconf0(val)    mttc0(1, 2, val)
  353. #define read_vpe_c0_count()        mftc0(9, 0)
  354. #define write_vpe_c0_count(val)        mttc0(9, 0, val)
  355. #define read_vpe_c0_status()        mftc0(12, 0)
  356. #define write_vpe_c0_status(val)    mttc0(12, 0, val)
  357. #define read_vpe_c0_cause()        mftc0(13, 0)
  358. #define write_vpe_c0_cause(val)        mttc0(13, 0, val)
  359. #define read_vpe_c0_config()        mftc0(16, 0)
  360. #define write_vpe_c0_config(val)    mttc0(16, 0, val)
  361. #define read_vpe_c0_config1()        mftc0(16, 1)
  362. #define write_vpe_c0_config1(val)    mttc0(16, 1, val)
  363. #define read_vpe_c0_config7()        mftc0(16, 7)
  364. #define write_vpe_c0_config7(val)    mttc0(16, 7, val)
  365. #define read_vpe_c0_ebase()        mftc0(15, 1)
  366. #define write_vpe_c0_ebase(val)        mttc0(15, 1, val)
  367. #define write_vpe_c0_compare(val)    mttc0(11, 0, val)
  368. #define read_vpe_c0_badvaddr()        mftc0(8, 0)
  369. #define read_vpe_c0_epc()        mftc0(14, 0)
  370. #define write_vpe_c0_epc(val)        mttc0(14, 0, val)
  371.  
  372.  
  373. /* TC */
  374. #define read_tc_c0_tcstatus()        mftc0(2, 1)
  375. #define write_tc_c0_tcstatus(val)    mttc0(2, 1, val)
  376. #define read_tc_c0_tcbind()        mftc0(2, 2)
  377. #define write_tc_c0_tcbind(val)        mttc0(2, 2, val)
  378. #define read_tc_c0_tcrestart()        mftc0(2, 3)
  379. #define write_tc_c0_tcrestart(val)    mttc0(2, 3, val)
  380. #define read_tc_c0_tchalt()        mftc0(2, 4)
  381. #define write_tc_c0_tchalt(val)        mttc0(2, 4, val)
  382. #define read_tc_c0_tccontext()        mftc0(2, 5)
  383. #define write_tc_c0_tccontext(val)    mttc0(2, 5, val)
  384.  
  385. /* GPR */
  386. #define read_tc_gpr_sp()        mftgpr(29)
  387. #define write_tc_gpr_sp(val)        mttgpr(29, val)
  388. #define read_tc_gpr_gp()        mftgpr(28)
  389. #define write_tc_gpr_gp(val)        mttgpr(28, val)
  390.  
  391. __BUILD_SET_C0(mvpcontrol)
  392.  
  393. #endif /* Not __ASSEMBLY__ */
  394.  
  395. #endif
  396.