core.h 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405
  1. /*
  2. * xtensa/config/core.h -- HAL definitions dependent on CORE configuration
  3. *
  4. * This header file is sometimes referred to as the "compile-time HAL" or CHAL.
  5. * It pulls definitions tailored for a specific Xtensa processor configuration.
  6. *
  7. * Sources for binaries meant to be configuration-independent generally avoid
  8. * including this file (they may use the configuration-specific HAL library).
  9. * It is normal for the HAL library source itself to include this file.
  10. */
  11. /*
  12. * Copyright (c) 2005-2014 Cadence Design Systems, Inc.
  13. *
  14. * Permission is hereby granted, free of charge, to any person obtaining
  15. * a copy of this software and associated documentation files (the
  16. * "Software"), to deal in the Software without restriction, including
  17. * without limitation the rights to use, copy, modify, merge, publish,
  18. * distribute, sublicense, and/or sell copies of the Software, and to
  19. * permit persons to whom the Software is furnished to do so, subject to
  20. * the following conditions:
  21. *
  22. * The above copyright notice and this permission notice shall be included
  23. * in all copies or substantial portions of the Software.
  24. *
  25. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  26. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  27. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  28. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  29. * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  30. * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  31. * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  32. */
  33. #ifndef XTENSA_CONFIG_CORE_H
  34. #define XTENSA_CONFIG_CORE_H
  35. /* CONFIGURATION INDEPENDENT DEFINITIONS: */
  36. #ifdef __XTENSA__
  37. #include <xtensa/hal.h>
  38. #include <xtensa/xtensa-versions.h>
  39. #else
  40. #include "../hal.h"
  41. #include "../xtensa-versions.h"
  42. #endif
  43. /* CONFIGURATION SPECIFIC DEFINITIONS: */
  44. #ifdef __XTENSA__
  45. #include <xtensa/config/core-isa.h>
  46. #include <xtensa/config/core-matmap.h>
  47. #include <xtensa/config/tie.h>
  48. #else
  49. #include "core-isa.h"
  50. #include "core-matmap.h"
  51. #include "tie.h"
  52. #endif
  53. #if defined (_ASMLANGUAGE) || defined (__ASSEMBLER__)
  54. #ifdef __XTENSA__
  55. #include <xtensa/config/tie-asm.h>
  56. #else
  57. #include "tie-asm.h"
  58. #endif
  59. #endif /*_ASMLANGUAGE or __ASSEMBLER__*/
  60. /*----------------------------------------------------------------------
  61. GENERAL
  62. ----------------------------------------------------------------------*/
  63. /*
  64. * Separators for macros that expand into arrays.
  65. * These can be predefined by files that #include this one,
  66. * when different separators are required.
  67. */
  68. /* Element separator for macros that expand into 1-dimensional arrays: */
  69. #ifndef XCHAL_SEP
  70. #define XCHAL_SEP ,
  71. #endif
  72. /* Array separator for macros that expand into 2-dimensional arrays: */
  73. #ifndef XCHAL_SEP2
  74. #define XCHAL_SEP2 },{
  75. #endif
  76. /*----------------------------------------------------------------------
  77. ISA
  78. ----------------------------------------------------------------------*/
  79. #if XCHAL_HAVE_BE
  80. # define XCHAL_HAVE_LE 0
  81. # define XCHAL_MEMORY_ORDER XTHAL_BIGENDIAN
  82. #else
  83. # define XCHAL_HAVE_LE 1
  84. # define XCHAL_MEMORY_ORDER XTHAL_LITTLEENDIAN
  85. #endif
  86. /*----------------------------------------------------------------------
  87. INTERRUPTS
  88. ----------------------------------------------------------------------*/
  89. /* Indexing macros: */
  90. #define _XCHAL_INTLEVEL_MASK(n) XCHAL_INTLEVEL ## n ## _MASK
  91. #define XCHAL_INTLEVEL_MASK(n) _XCHAL_INTLEVEL_MASK(n) /* n = 0 .. 15 */
  92. #define _XCHAL_INTLEVEL_ANDBELOWMASK(n) XCHAL_INTLEVEL ## n ## _ANDBELOW_MASK
  93. #define XCHAL_INTLEVEL_ANDBELOW_MASK(n) _XCHAL_INTLEVEL_ANDBELOWMASK(n) /* n = 0 .. 15 */
  94. #define _XCHAL_INTLEVEL_NUM(n) XCHAL_INTLEVEL ## n ## _NUM
  95. #define XCHAL_INTLEVEL_NUM(n) _XCHAL_INTLEVEL_NUM(n) /* n = 0 .. 15 */
  96. #define _XCHAL_INT_LEVEL(n) XCHAL_INT ## n ## _LEVEL
  97. #define XCHAL_INT_LEVEL(n) _XCHAL_INT_LEVEL(n) /* n = 0 .. 31 */
  98. #define _XCHAL_INT_TYPE(n) XCHAL_INT ## n ## _TYPE
  99. #define XCHAL_INT_TYPE(n) _XCHAL_INT_TYPE(n) /* n = 0 .. 31 */
  100. #define _XCHAL_TIMER_INTERRUPT(n) XCHAL_TIMER ## n ## _INTERRUPT
  101. #define XCHAL_TIMER_INTERRUPT(n) _XCHAL_TIMER_INTERRUPT(n) /* n = 0 .. 3 */
  102. #define XCHAL_HAVE_HIGHLEVEL_INTERRUPTS XCHAL_HAVE_HIGHPRI_INTERRUPTS
  103. #define XCHAL_NUM_LOWPRI_LEVELS 1 /* number of low-priority interrupt levels (always 1) */
  104. #define XCHAL_FIRST_HIGHPRI_LEVEL (XCHAL_NUM_LOWPRI_LEVELS+1) /* level of first high-priority interrupt (always 2) */
  105. /* Note: 1 <= LOWPRI_LEVELS <= EXCM_LEVEL < DEBUGLEVEL <= NUM_INTLEVELS < NMILEVEL <= 15 */
  106. /* These values are constant for existing Xtensa processor implementations: */
  107. #define XCHAL_INTLEVEL0_MASK 0x00000000
  108. #define XCHAL_INTLEVEL8_MASK 0x00000000
  109. #define XCHAL_INTLEVEL9_MASK 0x00000000
  110. #define XCHAL_INTLEVEL10_MASK 0x00000000
  111. #define XCHAL_INTLEVEL11_MASK 0x00000000
  112. #define XCHAL_INTLEVEL12_MASK 0x00000000
  113. #define XCHAL_INTLEVEL13_MASK 0x00000000
  114. #define XCHAL_INTLEVEL14_MASK 0x00000000
  115. #define XCHAL_INTLEVEL15_MASK 0x00000000
  116. /* Array of masks of interrupts at each interrupt level: */
  117. #define XCHAL_INTLEVEL_MASKS XCHAL_INTLEVEL0_MASK \
  118. XCHAL_SEP XCHAL_INTLEVEL1_MASK \
  119. XCHAL_SEP XCHAL_INTLEVEL2_MASK \
  120. XCHAL_SEP XCHAL_INTLEVEL3_MASK \
  121. XCHAL_SEP XCHAL_INTLEVEL4_MASK \
  122. XCHAL_SEP XCHAL_INTLEVEL5_MASK \
  123. XCHAL_SEP XCHAL_INTLEVEL6_MASK \
  124. XCHAL_SEP XCHAL_INTLEVEL7_MASK \
  125. XCHAL_SEP XCHAL_INTLEVEL8_MASK \
  126. XCHAL_SEP XCHAL_INTLEVEL9_MASK \
  127. XCHAL_SEP XCHAL_INTLEVEL10_MASK \
  128. XCHAL_SEP XCHAL_INTLEVEL11_MASK \
  129. XCHAL_SEP XCHAL_INTLEVEL12_MASK \
  130. XCHAL_SEP XCHAL_INTLEVEL13_MASK \
  131. XCHAL_SEP XCHAL_INTLEVEL14_MASK \
  132. XCHAL_SEP XCHAL_INTLEVEL15_MASK
  133. /* These values are constant for existing Xtensa processor implementations: */
  134. #define XCHAL_INTLEVEL0_ANDBELOW_MASK 0x00000000
  135. #define XCHAL_INTLEVEL8_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK
  136. #define XCHAL_INTLEVEL9_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK
  137. #define XCHAL_INTLEVEL10_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK
  138. #define XCHAL_INTLEVEL11_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK
  139. #define XCHAL_INTLEVEL12_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK
  140. #define XCHAL_INTLEVEL13_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK
  141. #define XCHAL_INTLEVEL14_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK
  142. #define XCHAL_INTLEVEL15_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK
  143. /* Mask of all low-priority interrupts: */
  144. #define XCHAL_LOWPRI_MASK XCHAL_INTLEVEL1_ANDBELOW_MASK
  145. /* Mask of all interrupts masked by PS.EXCM (or CEXCM): */
  146. #define XCHAL_EXCM_MASK XCHAL_INTLEVEL_ANDBELOW_MASK(XCHAL_EXCM_LEVEL)
  147. /* Array of masks of interrupts at each range 1..n of interrupt levels: */
  148. #define XCHAL_INTLEVEL_ANDBELOW_MASKS XCHAL_INTLEVEL0_ANDBELOW_MASK \
  149. XCHAL_SEP XCHAL_INTLEVEL1_ANDBELOW_MASK \
  150. XCHAL_SEP XCHAL_INTLEVEL2_ANDBELOW_MASK \
  151. XCHAL_SEP XCHAL_INTLEVEL3_ANDBELOW_MASK \
  152. XCHAL_SEP XCHAL_INTLEVEL4_ANDBELOW_MASK \
  153. XCHAL_SEP XCHAL_INTLEVEL5_ANDBELOW_MASK \
  154. XCHAL_SEP XCHAL_INTLEVEL6_ANDBELOW_MASK \
  155. XCHAL_SEP XCHAL_INTLEVEL7_ANDBELOW_MASK \
  156. XCHAL_SEP XCHAL_INTLEVEL8_ANDBELOW_MASK \
  157. XCHAL_SEP XCHAL_INTLEVEL9_ANDBELOW_MASK \
  158. XCHAL_SEP XCHAL_INTLEVEL10_ANDBELOW_MASK \
  159. XCHAL_SEP XCHAL_INTLEVEL11_ANDBELOW_MASK \
  160. XCHAL_SEP XCHAL_INTLEVEL12_ANDBELOW_MASK \
  161. XCHAL_SEP XCHAL_INTLEVEL13_ANDBELOW_MASK \
  162. XCHAL_SEP XCHAL_INTLEVEL14_ANDBELOW_MASK \
  163. XCHAL_SEP XCHAL_INTLEVEL15_ANDBELOW_MASK
  164. #if 0 /*XCHAL_HAVE_NMI*/
  165. /* NMI "interrupt level" (for use with EXCSAVE_n, EPS_n, EPC_n, RFI n): */
  166. # define XCHAL_NMILEVEL (XCHAL_NUM_INTLEVELS+1)
  167. #endif
  168. /* Array of levels of each possible interrupt: */
  169. #define XCHAL_INT_LEVELS XCHAL_INT0_LEVEL \
  170. XCHAL_SEP XCHAL_INT1_LEVEL \
  171. XCHAL_SEP XCHAL_INT2_LEVEL \
  172. XCHAL_SEP XCHAL_INT3_LEVEL \
  173. XCHAL_SEP XCHAL_INT4_LEVEL \
  174. XCHAL_SEP XCHAL_INT5_LEVEL \
  175. XCHAL_SEP XCHAL_INT6_LEVEL \
  176. XCHAL_SEP XCHAL_INT7_LEVEL \
  177. XCHAL_SEP XCHAL_INT8_LEVEL \
  178. XCHAL_SEP XCHAL_INT9_LEVEL \
  179. XCHAL_SEP XCHAL_INT10_LEVEL \
  180. XCHAL_SEP XCHAL_INT11_LEVEL \
  181. XCHAL_SEP XCHAL_INT12_LEVEL \
  182. XCHAL_SEP XCHAL_INT13_LEVEL \
  183. XCHAL_SEP XCHAL_INT14_LEVEL \
  184. XCHAL_SEP XCHAL_INT15_LEVEL \
  185. XCHAL_SEP XCHAL_INT16_LEVEL \
  186. XCHAL_SEP XCHAL_INT17_LEVEL \
  187. XCHAL_SEP XCHAL_INT18_LEVEL \
  188. XCHAL_SEP XCHAL_INT19_LEVEL \
  189. XCHAL_SEP XCHAL_INT20_LEVEL \
  190. XCHAL_SEP XCHAL_INT21_LEVEL \
  191. XCHAL_SEP XCHAL_INT22_LEVEL \
  192. XCHAL_SEP XCHAL_INT23_LEVEL \
  193. XCHAL_SEP XCHAL_INT24_LEVEL \
  194. XCHAL_SEP XCHAL_INT25_LEVEL \
  195. XCHAL_SEP XCHAL_INT26_LEVEL \
  196. XCHAL_SEP XCHAL_INT27_LEVEL \
  197. XCHAL_SEP XCHAL_INT28_LEVEL \
  198. XCHAL_SEP XCHAL_INT29_LEVEL \
  199. XCHAL_SEP XCHAL_INT30_LEVEL \
  200. XCHAL_SEP XCHAL_INT31_LEVEL
  201. /* Array of types of each possible interrupt: */
  202. #define XCHAL_INT_TYPES XCHAL_INT0_TYPE \
  203. XCHAL_SEP XCHAL_INT1_TYPE \
  204. XCHAL_SEP XCHAL_INT2_TYPE \
  205. XCHAL_SEP XCHAL_INT3_TYPE \
  206. XCHAL_SEP XCHAL_INT4_TYPE \
  207. XCHAL_SEP XCHAL_INT5_TYPE \
  208. XCHAL_SEP XCHAL_INT6_TYPE \
  209. XCHAL_SEP XCHAL_INT7_TYPE \
  210. XCHAL_SEP XCHAL_INT8_TYPE \
  211. XCHAL_SEP XCHAL_INT9_TYPE \
  212. XCHAL_SEP XCHAL_INT10_TYPE \
  213. XCHAL_SEP XCHAL_INT11_TYPE \
  214. XCHAL_SEP XCHAL_INT12_TYPE \
  215. XCHAL_SEP XCHAL_INT13_TYPE \
  216. XCHAL_SEP XCHAL_INT14_TYPE \
  217. XCHAL_SEP XCHAL_INT15_TYPE \
  218. XCHAL_SEP XCHAL_INT16_TYPE \
  219. XCHAL_SEP XCHAL_INT17_TYPE \
  220. XCHAL_SEP XCHAL_INT18_TYPE \
  221. XCHAL_SEP XCHAL_INT19_TYPE \
  222. XCHAL_SEP XCHAL_INT20_TYPE \
  223. XCHAL_SEP XCHAL_INT21_TYPE \
  224. XCHAL_SEP XCHAL_INT22_TYPE \
  225. XCHAL_SEP XCHAL_INT23_TYPE \
  226. XCHAL_SEP XCHAL_INT24_TYPE \
  227. XCHAL_SEP XCHAL_INT25_TYPE \
  228. XCHAL_SEP XCHAL_INT26_TYPE \
  229. XCHAL_SEP XCHAL_INT27_TYPE \
  230. XCHAL_SEP XCHAL_INT28_TYPE \
  231. XCHAL_SEP XCHAL_INT29_TYPE \
  232. XCHAL_SEP XCHAL_INT30_TYPE \
  233. XCHAL_SEP XCHAL_INT31_TYPE
  234. /* Array of masks of interrupts for each type of interrupt: */
  235. #define XCHAL_INTTYPE_MASKS XCHAL_INTTYPE_MASK_UNCONFIGURED \
  236. XCHAL_SEP XCHAL_INTTYPE_MASK_SOFTWARE \
  237. XCHAL_SEP XCHAL_INTTYPE_MASK_EXTERN_EDGE \
  238. XCHAL_SEP XCHAL_INTTYPE_MASK_EXTERN_LEVEL \
  239. XCHAL_SEP XCHAL_INTTYPE_MASK_TIMER \
  240. XCHAL_SEP XCHAL_INTTYPE_MASK_NMI \
  241. XCHAL_SEP XCHAL_INTTYPE_MASK_WRITE_ERROR
  242. /* Interrupts that can be cleared using the INTCLEAR special register: */
  243. #define XCHAL_INTCLEARABLE_MASK (XCHAL_INTTYPE_MASK_SOFTWARE+XCHAL_INTTYPE_MASK_EXTERN_EDGE+XCHAL_INTTYPE_MASK_WRITE_ERROR)
  244. /* Interrupts that can be triggered using the INTSET special register: */
  245. #define XCHAL_INTSETTABLE_MASK XCHAL_INTTYPE_MASK_SOFTWARE
  246. /* Array of interrupts assigned to each timer (CCOMPARE0 to CCOMPARE3): */
  247. #define XCHAL_TIMER_INTERRUPTS XCHAL_TIMER0_INTERRUPT \
  248. XCHAL_SEP XCHAL_TIMER1_INTERRUPT \
  249. XCHAL_SEP XCHAL_TIMER2_INTERRUPT \
  250. XCHAL_SEP XCHAL_TIMER3_INTERRUPT
  251. /* For backward compatibility and for the array macros, define macros for
  252. * each unconfigured interrupt number (unfortunately, the value of
  253. * XTHAL_INTTYPE_UNCONFIGURED is not zero): */
  254. #if XCHAL_NUM_INTERRUPTS == 0
  255. # define XCHAL_INT0_LEVEL 0
  256. # define XCHAL_INT0_TYPE XTHAL_INTTYPE_UNCONFIGURED
  257. #endif
  258. #if XCHAL_NUM_INTERRUPTS <= 1
  259. # define XCHAL_INT1_LEVEL 0
  260. # define XCHAL_INT1_TYPE XTHAL_INTTYPE_UNCONFIGURED
  261. #endif
  262. #if XCHAL_NUM_INTERRUPTS <= 2
  263. # define XCHAL_INT2_LEVEL 0
  264. # define XCHAL_INT2_TYPE XTHAL_INTTYPE_UNCONFIGURED
  265. #endif
  266. #if XCHAL_NUM_INTERRUPTS <= 3
  267. # define XCHAL_INT3_LEVEL 0
  268. # define XCHAL_INT3_TYPE XTHAL_INTTYPE_UNCONFIGURED
  269. #endif
  270. #if XCHAL_NUM_INTERRUPTS <= 4
  271. # define XCHAL_INT4_LEVEL 0
  272. # define XCHAL_INT4_TYPE XTHAL_INTTYPE_UNCONFIGURED
  273. #endif
  274. #if XCHAL_NUM_INTERRUPTS <= 5
  275. # define XCHAL_INT5_LEVEL 0
  276. # define XCHAL_INT5_TYPE XTHAL_INTTYPE_UNCONFIGURED
  277. #endif
  278. #if XCHAL_NUM_INTERRUPTS <= 6
  279. # define XCHAL_INT6_LEVEL 0
  280. # define XCHAL_INT6_TYPE XTHAL_INTTYPE_UNCONFIGURED
  281. #endif
  282. #if XCHAL_NUM_INTERRUPTS <= 7
  283. # define XCHAL_INT7_LEVEL 0
  284. # define XCHAL_INT7_TYPE XTHAL_INTTYPE_UNCONFIGURED
  285. #endif
  286. #if XCHAL_NUM_INTERRUPTS <= 8
  287. # define XCHAL_INT8_LEVEL 0
  288. # define XCHAL_INT8_TYPE XTHAL_INTTYPE_UNCONFIGURED
  289. #endif
  290. #if XCHAL_NUM_INTERRUPTS <= 9
  291. # define XCHAL_INT9_LEVEL 0
  292. # define XCHAL_INT9_TYPE XTHAL_INTTYPE_UNCONFIGURED
  293. #endif
  294. #if XCHAL_NUM_INTERRUPTS <= 10
  295. # define XCHAL_INT10_LEVEL 0
  296. # define XCHAL_INT10_TYPE XTHAL_INTTYPE_UNCONFIGURED
  297. #endif
  298. #if XCHAL_NUM_INTERRUPTS <= 11
  299. # define XCHAL_INT11_LEVEL 0
  300. # define XCHAL_INT11_TYPE XTHAL_INTTYPE_UNCONFIGURED
  301. #endif
  302. #if XCHAL_NUM_INTERRUPTS <= 12
  303. # define XCHAL_INT12_LEVEL 0
  304. # define XCHAL_INT12_TYPE XTHAL_INTTYPE_UNCONFIGURED
  305. #endif
  306. #if XCHAL_NUM_INTERRUPTS <= 13
  307. # define XCHAL_INT13_LEVEL 0
  308. # define XCHAL_INT13_TYPE XTHAL_INTTYPE_UNCONFIGURED
  309. #endif
  310. #if XCHAL_NUM_INTERRUPTS <= 14
  311. # define XCHAL_INT14_LEVEL 0
  312. # define XCHAL_INT14_TYPE XTHAL_INTTYPE_UNCONFIGURED
  313. #endif
  314. #if XCHAL_NUM_INTERRUPTS <= 15
  315. # define XCHAL_INT15_LEVEL 0
  316. # define XCHAL_INT15_TYPE XTHAL_INTTYPE_UNCONFIGURED
  317. #endif
  318. #if XCHAL_NUM_INTERRUPTS <= 16
  319. # define XCHAL_INT16_LEVEL 0
  320. # define XCHAL_INT16_TYPE XTHAL_INTTYPE_UNCONFIGURED
  321. #endif
  322. #if XCHAL_NUM_INTERRUPTS <= 17
  323. # define XCHAL_INT17_LEVEL 0
  324. # define XCHAL_INT17_TYPE XTHAL_INTTYPE_UNCONFIGURED
  325. #endif
  326. #if XCHAL_NUM_INTERRUPTS <= 18
  327. # define XCHAL_INT18_LEVEL 0
  328. # define XCHAL_INT18_TYPE XTHAL_INTTYPE_UNCONFIGURED
  329. #endif
  330. #if XCHAL_NUM_INTERRUPTS <= 19
  331. # define XCHAL_INT19_LEVEL 0
  332. # define XCHAL_INT19_TYPE XTHAL_INTTYPE_UNCONFIGURED
  333. #endif
  334. #if XCHAL_NUM_INTERRUPTS <= 20
  335. # define XCHAL_INT20_LEVEL 0
  336. # define XCHAL_INT20_TYPE XTHAL_INTTYPE_UNCONFIGURED
  337. #endif
  338. #if XCHAL_NUM_INTERRUPTS <= 21
  339. # define XCHAL_INT21_LEVEL 0
  340. # define XCHAL_INT21_TYPE XTHAL_INTTYPE_UNCONFIGURED
  341. #endif
  342. #if XCHAL_NUM_INTERRUPTS <= 22
  343. # define XCHAL_INT22_LEVEL 0
  344. # define XCHAL_INT22_TYPE XTHAL_INTTYPE_UNCONFIGURED
  345. #endif
  346. #if XCHAL_NUM_INTERRUPTS <= 23
  347. # define XCHAL_INT23_LEVEL 0
  348. # define XCHAL_INT23_TYPE XTHAL_INTTYPE_UNCONFIGURED
  349. #endif
  350. #if XCHAL_NUM_INTERRUPTS <= 24
  351. # define XCHAL_INT24_LEVEL 0
  352. # define XCHAL_INT24_TYPE XTHAL_INTTYPE_UNCONFIGURED
  353. #endif
  354. #if XCHAL_NUM_INTERRUPTS <= 25
  355. # define XCHAL_INT25_LEVEL 0
  356. # define XCHAL_INT25_TYPE XTHAL_INTTYPE_UNCONFIGURED
  357. #endif
  358. #if XCHAL_NUM_INTERRUPTS <= 26
  359. # define XCHAL_INT26_LEVEL 0
  360. # define XCHAL_INT26_TYPE XTHAL_INTTYPE_UNCONFIGURED
  361. #endif
  362. #if XCHAL_NUM_INTERRUPTS <= 27
  363. # define XCHAL_INT27_LEVEL 0
  364. # define XCHAL_INT27_TYPE XTHAL_INTTYPE_UNCONFIGURED
  365. #endif
  366. #if XCHAL_NUM_INTERRUPTS <= 28
  367. # define XCHAL_INT28_LEVEL 0
  368. # define XCHAL_INT28_TYPE XTHAL_INTTYPE_UNCONFIGURED
  369. #endif
  370. #if XCHAL_NUM_INTERRUPTS <= 29
  371. # define XCHAL_INT29_LEVEL 0
  372. # define XCHAL_INT29_TYPE XTHAL_INTTYPE_UNCONFIGURED
  373. #endif
  374. #if XCHAL_NUM_INTERRUPTS <= 30
  375. # define XCHAL_INT30_LEVEL 0
  376. # define XCHAL_INT30_TYPE XTHAL_INTTYPE_UNCONFIGURED
  377. #endif
  378. #if XCHAL_NUM_INTERRUPTS <= 31
  379. # define XCHAL_INT31_LEVEL 0
  380. # define XCHAL_INT31_TYPE XTHAL_INTTYPE_UNCONFIGURED
  381. #endif
  382. /*
  383. * Masks and levels corresponding to each *external* interrupt.
  384. */
  385. #define XCHAL_EXTINT0_MASK (1 << XCHAL_EXTINT0_NUM)
  386. #define XCHAL_EXTINT0_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT0_NUM)
  387. #define XCHAL_EXTINT1_MASK (1 << XCHAL_EXTINT1_NUM)
  388. #define XCHAL_EXTINT1_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT1_NUM)
  389. #define XCHAL_EXTINT2_MASK (1 << XCHAL_EXTINT2_NUM)
  390. #define XCHAL_EXTINT2_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT2_NUM)
  391. #define XCHAL_EXTINT3_MASK (1 << XCHAL_EXTINT3_NUM)
  392. #define XCHAL_EXTINT3_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT3_NUM)
  393. #define XCHAL_EXTINT4_MASK (1 << XCHAL_EXTINT4_NUM)
  394. #define XCHAL_EXTINT4_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT4_NUM)
  395. #define XCHAL_EXTINT5_MASK (1 << XCHAL_EXTINT5_NUM)
  396. #define XCHAL_EXTINT5_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT5_NUM)
  397. #define XCHAL_EXTINT6_MASK (1 << XCHAL_EXTINT6_NUM)
  398. #define XCHAL_EXTINT6_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT6_NUM)
  399. #define XCHAL_EXTINT7_MASK (1 << XCHAL_EXTINT7_NUM)
  400. #define XCHAL_EXTINT7_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT7_NUM)
  401. #define XCHAL_EXTINT8_MASK (1 << XCHAL_EXTINT8_NUM)
  402. #define XCHAL_EXTINT8_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT8_NUM)
  403. #define XCHAL_EXTINT9_MASK (1 << XCHAL_EXTINT9_NUM)
  404. #define XCHAL_EXTINT9_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT9_NUM)
  405. #define XCHAL_EXTINT10_MASK (1 << XCHAL_EXTINT10_NUM)
  406. #define XCHAL_EXTINT10_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT10_NUM)
  407. #define XCHAL_EXTINT11_MASK (1 << XCHAL_EXTINT11_NUM)
  408. #define XCHAL_EXTINT11_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT11_NUM)
  409. #define XCHAL_EXTINT12_MASK (1 << XCHAL_EXTINT12_NUM)
  410. #define XCHAL_EXTINT12_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT12_NUM)
  411. #define XCHAL_EXTINT13_MASK (1 << XCHAL_EXTINT13_NUM)
  412. #define XCHAL_EXTINT13_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT13_NUM)
  413. #define XCHAL_EXTINT14_MASK (1 << XCHAL_EXTINT14_NUM)
  414. #define XCHAL_EXTINT14_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT14_NUM)
  415. #define XCHAL_EXTINT15_MASK (1 << XCHAL_EXTINT15_NUM)
  416. #define XCHAL_EXTINT15_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT15_NUM)
  417. #define XCHAL_EXTINT16_MASK (1 << XCHAL_EXTINT16_NUM)
  418. #define XCHAL_EXTINT16_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT16_NUM)
  419. #define XCHAL_EXTINT17_MASK (1 << XCHAL_EXTINT17_NUM)
  420. #define XCHAL_EXTINT17_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT17_NUM)
  421. #define XCHAL_EXTINT18_MASK (1 << XCHAL_EXTINT18_NUM)
  422. #define XCHAL_EXTINT18_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT18_NUM)
  423. #define XCHAL_EXTINT19_MASK (1 << XCHAL_EXTINT19_NUM)
  424. #define XCHAL_EXTINT19_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT19_NUM)
  425. #define XCHAL_EXTINT20_MASK (1 << XCHAL_EXTINT20_NUM)
  426. #define XCHAL_EXTINT20_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT20_NUM)
  427. #define XCHAL_EXTINT21_MASK (1 << XCHAL_EXTINT21_NUM)
  428. #define XCHAL_EXTINT21_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT21_NUM)
  429. #define XCHAL_EXTINT22_MASK (1 << XCHAL_EXTINT22_NUM)
  430. #define XCHAL_EXTINT22_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT22_NUM)
  431. #define XCHAL_EXTINT23_MASK (1 << XCHAL_EXTINT23_NUM)
  432. #define XCHAL_EXTINT23_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT23_NUM)
  433. #define XCHAL_EXTINT24_MASK (1 << XCHAL_EXTINT24_NUM)
  434. #define XCHAL_EXTINT24_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT24_NUM)
  435. #define XCHAL_EXTINT25_MASK (1 << XCHAL_EXTINT25_NUM)
  436. #define XCHAL_EXTINT25_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT25_NUM)
  437. #define XCHAL_EXTINT26_MASK (1 << XCHAL_EXTINT26_NUM)
  438. #define XCHAL_EXTINT26_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT26_NUM)
  439. #define XCHAL_EXTINT27_MASK (1 << XCHAL_EXTINT27_NUM)
  440. #define XCHAL_EXTINT27_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT27_NUM)
  441. #define XCHAL_EXTINT28_MASK (1 << XCHAL_EXTINT28_NUM)
  442. #define XCHAL_EXTINT28_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT28_NUM)
  443. #define XCHAL_EXTINT29_MASK (1 << XCHAL_EXTINT29_NUM)
  444. #define XCHAL_EXTINT29_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT29_NUM)
  445. #define XCHAL_EXTINT30_MASK (1 << XCHAL_EXTINT30_NUM)
  446. #define XCHAL_EXTINT30_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT30_NUM)
  447. #define XCHAL_EXTINT31_MASK (1 << XCHAL_EXTINT31_NUM)
  448. #define XCHAL_EXTINT31_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT31_NUM)
  449. /*----------------------------------------------------------------------
  450. EXCEPTIONS and VECTORS
  451. ----------------------------------------------------------------------*/
  452. /* For backward compatibility ONLY -- DO NOT USE (will be removed in future release): */
  453. #define XCHAL_HAVE_OLD_EXC_ARCH XCHAL_HAVE_XEA1 /* (DEPRECATED) 1 if old exception architecture (XEA1), 0 otherwise (eg. XEA2) */
  454. #define XCHAL_HAVE_EXCM XCHAL_HAVE_XEA2 /* (DEPRECATED) 1 if PS.EXCM bit exists (currently equals XCHAL_HAVE_TLBS) */
  455. #ifdef XCHAL_USER_VECTOR_VADDR
  456. #define XCHAL_PROGRAMEXC_VECTOR_VADDR XCHAL_USER_VECTOR_VADDR
  457. #define XCHAL_USEREXC_VECTOR_VADDR XCHAL_USER_VECTOR_VADDR
  458. #endif
  459. #ifdef XCHAL_USER_VECTOR_PADDR
  460. # define XCHAL_PROGRAMEXC_VECTOR_PADDR XCHAL_USER_VECTOR_PADDR
  461. # define XCHAL_USEREXC_VECTOR_PADDR XCHAL_USER_VECTOR_PADDR
  462. #endif
  463. #ifdef XCHAL_KERNEL_VECTOR_VADDR
  464. # define XCHAL_STACKEDEXC_VECTOR_VADDR XCHAL_KERNEL_VECTOR_VADDR
  465. # define XCHAL_KERNELEXC_VECTOR_VADDR XCHAL_KERNEL_VECTOR_VADDR
  466. #endif
  467. #ifdef XCHAL_KERNEL_VECTOR_PADDR
  468. # define XCHAL_STACKEDEXC_VECTOR_PADDR XCHAL_KERNEL_VECTOR_PADDR
  469. # define XCHAL_KERNELEXC_VECTOR_PADDR XCHAL_KERNEL_VECTOR_PADDR
  470. #endif
  471. #if 0
  472. #if XCHAL_HAVE_DEBUG
  473. # define XCHAL_DEBUG_VECTOR_VADDR XCHAL_INTLEVEL_VECTOR_VADDR(XCHAL_DEBUGLEVEL)
  474. /* This one should only get defined if the corresponding intlevel paddr macro exists: */
  475. # define XCHAL_DEBUG_VECTOR_PADDR XCHAL_INTLEVEL_VECTOR_PADDR(XCHAL_DEBUGLEVEL)
  476. #endif
  477. #endif
  478. /* Indexing macros: */
  479. #define _XCHAL_INTLEVEL_VECTOR_VADDR(n) XCHAL_INTLEVEL ## n ## _VECTOR_VADDR
  480. #define XCHAL_INTLEVEL_VECTOR_VADDR(n) _XCHAL_INTLEVEL_VECTOR_VADDR(n) /* n = 0 .. 15 */
  481. /*
  482. * General Exception Causes
  483. * (values of EXCCAUSE special register set by general exceptions,
  484. * which vector to the user, kernel, or double-exception vectors).
  485. *
  486. * DEPRECATED. Please use the equivalent EXCCAUSE_xxx macros
  487. * defined in <xtensa/corebits.h>. (Note that these have slightly
  488. * different names, they don't just have the XCHAL_ prefix removed.)
  489. */
  490. #define XCHAL_EXCCAUSE_ILLEGAL_INSTRUCTION 0 /* Illegal Instruction */
  491. #define XCHAL_EXCCAUSE_SYSTEM_CALL 1 /* System Call */
  492. #define XCHAL_EXCCAUSE_INSTRUCTION_FETCH_ERROR 2 /* Instruction Fetch Error */
  493. #define XCHAL_EXCCAUSE_LOAD_STORE_ERROR 3 /* Load Store Error */
  494. #define XCHAL_EXCCAUSE_LEVEL1_INTERRUPT 4 /* Level 1 Interrupt */
  495. #define XCHAL_EXCCAUSE_ALLOCA 5 /* Stack Extension Assist */
  496. #define XCHAL_EXCCAUSE_INTEGER_DIVIDE_BY_ZERO 6 /* Integer Divide by Zero */
  497. #define XCHAL_EXCCAUSE_SPECULATION 7 /* Speculation */
  498. #define XCHAL_EXCCAUSE_PRIVILEGED 8 /* Privileged Instruction */
  499. #define XCHAL_EXCCAUSE_UNALIGNED 9 /* Unaligned Load Store */
  500. /*10..15 reserved*/
  501. #define XCHAL_EXCCAUSE_ITLB_MISS 16 /* ITlb Miss Exception */
  502. #define XCHAL_EXCCAUSE_ITLB_MULTIHIT 17 /* ITlb Mutltihit Exception */
  503. #define XCHAL_EXCCAUSE_ITLB_PRIVILEGE 18 /* ITlb Privilege Exception */
  504. #define XCHAL_EXCCAUSE_ITLB_SIZE_RESTRICTION 19 /* ITlb Size Restriction Exception */
  505. #define XCHAL_EXCCAUSE_FETCH_CACHE_ATTRIBUTE 20 /* Fetch Cache Attribute Exception */
  506. /*21..23 reserved*/
  507. #define XCHAL_EXCCAUSE_DTLB_MISS 24 /* DTlb Miss Exception */
  508. #define XCHAL_EXCCAUSE_DTLB_MULTIHIT 25 /* DTlb Multihit Exception */
  509. #define XCHAL_EXCCAUSE_DTLB_PRIVILEGE 26 /* DTlb Privilege Exception */
  510. #define XCHAL_EXCCAUSE_DTLB_SIZE_RESTRICTION 27 /* DTlb Size Restriction Exception */
  511. #define XCHAL_EXCCAUSE_LOAD_CACHE_ATTRIBUTE 28 /* Load Cache Attribute Exception */
  512. #define XCHAL_EXCCAUSE_STORE_CACHE_ATTRIBUTE 29 /* Store Cache Attribute Exception */
  513. /*30..31 reserved*/
  514. #define XCHAL_EXCCAUSE_COPROCESSOR0_DISABLED 32 /* Coprocessor 0 disabled */
  515. #define XCHAL_EXCCAUSE_COPROCESSOR1_DISABLED 33 /* Coprocessor 1 disabled */
  516. #define XCHAL_EXCCAUSE_COPROCESSOR2_DISABLED 34 /* Coprocessor 2 disabled */
  517. #define XCHAL_EXCCAUSE_COPROCESSOR3_DISABLED 35 /* Coprocessor 3 disabled */
  518. #define XCHAL_EXCCAUSE_COPROCESSOR4_DISABLED 36 /* Coprocessor 4 disabled */
  519. #define XCHAL_EXCCAUSE_COPROCESSOR5_DISABLED 37 /* Coprocessor 5 disabled */
  520. #define XCHAL_EXCCAUSE_COPROCESSOR6_DISABLED 38 /* Coprocessor 6 disabled */
  521. #define XCHAL_EXCCAUSE_COPROCESSOR7_DISABLED 39 /* Coprocessor 7 disabled */
  522. /*40..63 reserved*/
  523. /*
  524. * Miscellaneous special register fields.
  525. *
  526. * For each special register, and each field within each register:
  527. * XCHAL_<regname>_VALIDMASK is the set of bits defined in the register.
  528. * XCHAL_<regname>_<field>_BITS is the number of bits in the field.
  529. * XCHAL_<regname>_<field>_NUM is 2^bits, the number of possible values
  530. * of the field.
  531. * XCHAL_<regname>_<field>_SHIFT is the position of the field within
  532. * the register, starting from the least significant bit.
  533. *
  534. * DEPRECATED. Please use the equivalent macros defined in
  535. * <xtensa/corebits.h>. (Note that these have different names.)
  536. */
  537. /* DBREAKC (special register number 160): */
  538. #define XCHAL_DBREAKC_VALIDMASK 0xC000003F
  539. #define XCHAL_DBREAKC_MASK_BITS 6
  540. #define XCHAL_DBREAKC_MASK_NUM 64
  541. #define XCHAL_DBREAKC_MASK_SHIFT 0
  542. #define XCHAL_DBREAKC_MASK_MASK 0x0000003F
  543. #define XCHAL_DBREAKC_LOADBREAK_BITS 1
  544. #define XCHAL_DBREAKC_LOADBREAK_NUM 2
  545. #define XCHAL_DBREAKC_LOADBREAK_SHIFT 30
  546. #define XCHAL_DBREAKC_LOADBREAK_MASK 0x40000000
  547. #define XCHAL_DBREAKC_STOREBREAK_BITS 1
  548. #define XCHAL_DBREAKC_STOREBREAK_NUM 2
  549. #define XCHAL_DBREAKC_STOREBREAK_SHIFT 31
  550. #define XCHAL_DBREAKC_STOREBREAK_MASK 0x80000000
  551. /* PS (special register number 230): */
  552. #define XCHAL_PS_VALIDMASK 0x00070F3F
  553. #define XCHAL_PS_INTLEVEL_BITS 4
  554. #define XCHAL_PS_INTLEVEL_NUM 16
  555. #define XCHAL_PS_INTLEVEL_SHIFT 0
  556. #define XCHAL_PS_INTLEVEL_MASK 0x0000000F
  557. #define XCHAL_PS_EXCM_BITS 1
  558. #define XCHAL_PS_EXCM_NUM 2
  559. #define XCHAL_PS_EXCM_SHIFT 4
  560. #define XCHAL_PS_EXCM_MASK 0x00000010
  561. #define XCHAL_PS_UM_BITS 1
  562. #define XCHAL_PS_UM_NUM 2
  563. #define XCHAL_PS_UM_SHIFT 5
  564. #define XCHAL_PS_UM_MASK 0x00000020
  565. #define XCHAL_PS_RING_BITS 2
  566. #define XCHAL_PS_RING_NUM 4
  567. #define XCHAL_PS_RING_SHIFT 6
  568. #define XCHAL_PS_RING_MASK 0x000000C0
  569. #define XCHAL_PS_OWB_BITS 4
  570. #define XCHAL_PS_OWB_NUM 16
  571. #define XCHAL_PS_OWB_SHIFT 8
  572. #define XCHAL_PS_OWB_MASK 0x00000F00
  573. #define XCHAL_PS_CALLINC_BITS 2
  574. #define XCHAL_PS_CALLINC_NUM 4
  575. #define XCHAL_PS_CALLINC_SHIFT 16
  576. #define XCHAL_PS_CALLINC_MASK 0x00030000
  577. #define XCHAL_PS_WOE_BITS 1
  578. #define XCHAL_PS_WOE_NUM 2
  579. #define XCHAL_PS_WOE_SHIFT 18
  580. #define XCHAL_PS_WOE_MASK 0x00040000
  581. /* EXCCAUSE (special register number 232): */
  582. #define XCHAL_EXCCAUSE_VALIDMASK 0x0000003F
  583. #define XCHAL_EXCCAUSE_BITS 6
  584. #define XCHAL_EXCCAUSE_NUM 64
  585. #define XCHAL_EXCCAUSE_SHIFT 0
  586. #define XCHAL_EXCCAUSE_MASK 0x0000003F
  587. /* DEBUGCAUSE (special register number 233): */
  588. #define XCHAL_DEBUGCAUSE_VALIDMASK 0x0000003F
  589. #define XCHAL_DEBUGCAUSE_ICOUNT_BITS 1
  590. #define XCHAL_DEBUGCAUSE_ICOUNT_NUM 2
  591. #define XCHAL_DEBUGCAUSE_ICOUNT_SHIFT 0
  592. #define XCHAL_DEBUGCAUSE_ICOUNT_MASK 0x00000001
  593. #define XCHAL_DEBUGCAUSE_IBREAK_BITS 1
  594. #define XCHAL_DEBUGCAUSE_IBREAK_NUM 2
  595. #define XCHAL_DEBUGCAUSE_IBREAK_SHIFT 1
  596. #define XCHAL_DEBUGCAUSE_IBREAK_MASK 0x00000002
  597. #define XCHAL_DEBUGCAUSE_DBREAK_BITS 1
  598. #define XCHAL_DEBUGCAUSE_DBREAK_NUM 2
  599. #define XCHAL_DEBUGCAUSE_DBREAK_SHIFT 2
  600. #define XCHAL_DEBUGCAUSE_DBREAK_MASK 0x00000004
  601. #define XCHAL_DEBUGCAUSE_BREAK_BITS 1
  602. #define XCHAL_DEBUGCAUSE_BREAK_NUM 2
  603. #define XCHAL_DEBUGCAUSE_BREAK_SHIFT 3
  604. #define XCHAL_DEBUGCAUSE_BREAK_MASK 0x00000008
  605. #define XCHAL_DEBUGCAUSE_BREAKN_BITS 1
  606. #define XCHAL_DEBUGCAUSE_BREAKN_NUM 2
  607. #define XCHAL_DEBUGCAUSE_BREAKN_SHIFT 4
  608. #define XCHAL_DEBUGCAUSE_BREAKN_MASK 0x00000010
  609. #define XCHAL_DEBUGCAUSE_DEBUGINT_BITS 1
  610. #define XCHAL_DEBUGCAUSE_DEBUGINT_NUM 2
  611. #define XCHAL_DEBUGCAUSE_DEBUGINT_SHIFT 5
  612. #define XCHAL_DEBUGCAUSE_DEBUGINT_MASK 0x00000020
  613. /*----------------------------------------------------------------------
  614. TIMERS
  615. ----------------------------------------------------------------------*/
  616. /*#define XCHAL_HAVE_TIMERS XCHAL_HAVE_CCOUNT*/
  617. /*----------------------------------------------------------------------
  618. INTERNAL I/D RAM/ROMs and XLMI
  619. ----------------------------------------------------------------------*/
  620. #define XCHAL_NUM_IROM XCHAL_NUM_INSTROM /* (DEPRECATED) */
  621. #define XCHAL_NUM_IRAM XCHAL_NUM_INSTRAM /* (DEPRECATED) */
  622. #define XCHAL_NUM_DROM XCHAL_NUM_DATAROM /* (DEPRECATED) */
  623. #define XCHAL_NUM_DRAM XCHAL_NUM_DATARAM /* (DEPRECATED) */
  624. #define XCHAL_IROM0_VADDR XCHAL_INSTROM0_VADDR /* (DEPRECATED) */
  625. #define XCHAL_IROM0_PADDR XCHAL_INSTROM0_PADDR /* (DEPRECATED) */
  626. #define XCHAL_IROM0_SIZE XCHAL_INSTROM0_SIZE /* (DEPRECATED) */
  627. #define XCHAL_IROM1_VADDR XCHAL_INSTROM1_VADDR /* (DEPRECATED) */
  628. #define XCHAL_IROM1_PADDR XCHAL_INSTROM1_PADDR /* (DEPRECATED) */
  629. #define XCHAL_IROM1_SIZE XCHAL_INSTROM1_SIZE /* (DEPRECATED) */
  630. #define XCHAL_IRAM0_VADDR XCHAL_INSTRAM0_VADDR /* (DEPRECATED) */
  631. #define XCHAL_IRAM0_PADDR XCHAL_INSTRAM0_PADDR /* (DEPRECATED) */
  632. #define XCHAL_IRAM0_SIZE XCHAL_INSTRAM0_SIZE /* (DEPRECATED) */
  633. #define XCHAL_IRAM1_VADDR XCHAL_INSTRAM1_VADDR /* (DEPRECATED) */
  634. #define XCHAL_IRAM1_PADDR XCHAL_INSTRAM1_PADDR /* (DEPRECATED) */
  635. #define XCHAL_IRAM1_SIZE XCHAL_INSTRAM1_SIZE /* (DEPRECATED) */
  636. #define XCHAL_DROM0_VADDR XCHAL_DATAROM0_VADDR /* (DEPRECATED) */
  637. #define XCHAL_DROM0_PADDR XCHAL_DATAROM0_PADDR /* (DEPRECATED) */
  638. #define XCHAL_DROM0_SIZE XCHAL_DATAROM0_SIZE /* (DEPRECATED) */
  639. #define XCHAL_DROM1_VADDR XCHAL_DATAROM1_VADDR /* (DEPRECATED) */
  640. #define XCHAL_DROM1_PADDR XCHAL_DATAROM1_PADDR /* (DEPRECATED) */
  641. #define XCHAL_DROM1_SIZE XCHAL_DATAROM1_SIZE /* (DEPRECATED) */
  642. #define XCHAL_DRAM0_VADDR XCHAL_DATARAM0_VADDR /* (DEPRECATED) */
  643. #define XCHAL_DRAM0_PADDR XCHAL_DATARAM0_PADDR /* (DEPRECATED) */
  644. #define XCHAL_DRAM0_SIZE XCHAL_DATARAM0_SIZE /* (DEPRECATED) */
  645. #define XCHAL_DRAM1_VADDR XCHAL_DATARAM1_VADDR /* (DEPRECATED) */
  646. #define XCHAL_DRAM1_PADDR XCHAL_DATARAM1_PADDR /* (DEPRECATED) */
  647. #define XCHAL_DRAM1_SIZE XCHAL_DATARAM1_SIZE /* (DEPRECATED) */
  648. /*----------------------------------------------------------------------
  649. CACHE
  650. ----------------------------------------------------------------------*/
  651. /* Default PREFCTL value to enable prefetch. */
  652. #if XCHAL_HW_MIN_VERSION < XTENSA_HWVERSION_RE_2012_0
  653. #define XCHAL_CACHE_PREFCTL_DEFAULT 0x00044 /* enabled, not aggressive */
  654. #elif XCHAL_HW_MIN_VERSION < XTENSA_HWVERSION_RF_2014_0
  655. #define XCHAL_CACHE_PREFCTL_DEFAULT 0x01044 /* + enable prefetch to L1 */
  656. #elif XCHAL_PREFETCH_ENTRIES >= 16
  657. #define XCHAL_CACHE_PREFCTL_DEFAULT 0x81044 /* 12 entries for block ops */
  658. #elif XCHAL_PREFETCH_ENTRIES >= 8
  659. #define XCHAL_CACHE_PREFCTL_DEFAULT 0x51044 /* 5 entries for block ops */
  660. #else
  661. #define XCHAL_CACHE_PREFCTL_DEFAULT 0x01044 /* 0 entries for block ops */
  662. #endif
  663. /* Max for both I-cache and D-cache (used for general alignment): */
  664. #if XCHAL_ICACHE_LINESIZE > XCHAL_DCACHE_LINESIZE
  665. # define XCHAL_CACHE_LINEWIDTH_MAX XCHAL_ICACHE_LINEWIDTH
  666. # define XCHAL_CACHE_LINESIZE_MAX XCHAL_ICACHE_LINESIZE
  667. #else
  668. # define XCHAL_CACHE_LINEWIDTH_MAX XCHAL_DCACHE_LINEWIDTH
  669. # define XCHAL_CACHE_LINESIZE_MAX XCHAL_DCACHE_LINESIZE
  670. #endif
  671. #define XCHAL_ICACHE_SETSIZE (1<<XCHAL_ICACHE_SETWIDTH)
  672. #define XCHAL_DCACHE_SETSIZE (1<<XCHAL_DCACHE_SETWIDTH)
  673. /* Max for both I and D caches (used for cache-coherency page alignment): */
  674. #if XCHAL_ICACHE_SETWIDTH > XCHAL_DCACHE_SETWIDTH
  675. # define XCHAL_CACHE_SETWIDTH_MAX XCHAL_ICACHE_SETWIDTH
  676. # define XCHAL_CACHE_SETSIZE_MAX XCHAL_ICACHE_SETSIZE
  677. #else
  678. # define XCHAL_CACHE_SETWIDTH_MAX XCHAL_DCACHE_SETWIDTH
  679. # define XCHAL_CACHE_SETSIZE_MAX XCHAL_DCACHE_SETSIZE
  680. #endif
  681. /* Instruction cache tag bits: */
  682. #define XCHAL_ICACHE_TAG_V_SHIFT 0
  683. #define XCHAL_ICACHE_TAG_V 0x1 /* valid bit */
  684. #if XCHAL_ICACHE_WAYS > 1
  685. # define XCHAL_ICACHE_TAG_F_SHIFT 1
  686. # define XCHAL_ICACHE_TAG_F 0x2 /* fill (LRU) bit */
  687. #else
  688. # define XCHAL_ICACHE_TAG_F_SHIFT 0
  689. # define XCHAL_ICACHE_TAG_F 0 /* no fill (LRU) bit */
  690. #endif
  691. #if XCHAL_ICACHE_LINE_LOCKABLE
  692. # define XCHAL_ICACHE_TAG_L_SHIFT (XCHAL_ICACHE_TAG_F_SHIFT+1)
  693. # define XCHAL_ICACHE_TAG_L (1 << XCHAL_ICACHE_TAG_L_SHIFT) /* lock bit */
  694. #else
  695. # define XCHAL_ICACHE_TAG_L_SHIFT XCHAL_ICACHE_TAG_F_SHIFT
  696. # define XCHAL_ICACHE_TAG_L 0 /* no lock bit */
  697. #endif
  698. /* Data cache tag bits: */
  699. #define XCHAL_DCACHE_TAG_V_SHIFT 0
  700. #define XCHAL_DCACHE_TAG_V 0x1 /* valid bit */
  701. #if XCHAL_DCACHE_WAYS > 1
  702. # define XCHAL_DCACHE_TAG_F_SHIFT 1
  703. # define XCHAL_DCACHE_TAG_F 0x2 /* fill (LRU) bit */
  704. #else
  705. # define XCHAL_DCACHE_TAG_F_SHIFT 0
  706. # define XCHAL_DCACHE_TAG_F 0 /* no fill (LRU) bit */
  707. #endif
  708. #if XCHAL_DCACHE_IS_WRITEBACK
  709. # define XCHAL_DCACHE_TAG_D_SHIFT (XCHAL_DCACHE_TAG_F_SHIFT+1)
  710. # define XCHAL_DCACHE_TAG_D (1 << XCHAL_DCACHE_TAG_D_SHIFT) /* dirty bit */
  711. #else
  712. # define XCHAL_DCACHE_TAG_D_SHIFT XCHAL_DCACHE_TAG_F_SHIFT
  713. # define XCHAL_DCACHE_TAG_D 0 /* no dirty bit */
  714. #endif
  715. #if XCHAL_DCACHE_LINE_LOCKABLE
  716. # define XCHAL_DCACHE_TAG_L_SHIFT (XCHAL_DCACHE_TAG_D_SHIFT+1)
  717. # define XCHAL_DCACHE_TAG_L (1 << XCHAL_DCACHE_TAG_L_SHIFT) /* lock bit */
  718. #else
  719. # define XCHAL_DCACHE_TAG_L_SHIFT XCHAL_DCACHE_TAG_D_SHIFT
  720. # define XCHAL_DCACHE_TAG_L 0 /* no lock bit */
  721. #endif
  722. /* Whether MEMCTL register has anything useful */
  723. #define XCHAL_USE_MEMCTL (((XCHAL_LOOP_BUFFER_SIZE > 0) || \
  724. XCHAL_DCACHE_IS_COHERENT || \
  725. XCHAL_HAVE_ICACHE_DYN_WAYS || \
  726. XCHAL_HAVE_DCACHE_DYN_WAYS) && \
  727. (XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RE_2012_0))
  728. /* Default MEMCTL values: */
  729. #if XCHAL_HAVE_ICACHE_DYN_WAYS || XCHAL_HAVE_DCACHE_DYN_WAYS
  730. /* NOTE: constant defined this way to allow movi instead of l32r in reset code. */
  731. #define XCHAL_CACHE_MEMCTL_DEFAULT 0xFFFFFF00 /* Init all possible ways */
  732. #else
  733. #define XCHAL_CACHE_MEMCTL_DEFAULT 0x00000000 /* Nothing to do */
  734. #endif
  735. #if XCHAL_DCACHE_IS_COHERENT
  736. #define _MEMCTL_SNOOP_EN 0x02 /* Enable snoop */
  737. #else
  738. #define _MEMCTL_SNOOP_EN 0x00 /* Don't enable snoop */
  739. #endif
  740. #if (XCHAL_LOOP_BUFFER_SIZE == 0) || XCHAL_ERRATUM_453
  741. #define _MEMCTL_L0IBUF_EN 0x00 /* No loop buffer or don't enable */
  742. #else
  743. #define _MEMCTL_L0IBUF_EN 0x01 /* Enable loop buffer */
  744. #endif
  745. #define XCHAL_SNOOP_LB_MEMCTL_DEFAULT (_MEMCTL_SNOOP_EN | _MEMCTL_L0IBUF_EN)
  746. /*----------------------------------------------------------------------
  747. MMU
  748. ----------------------------------------------------------------------*/
  749. /* See <xtensa/config/core-matmap.h> for more details. */
  750. /* Has different semantic in open source headers (where it means HAVE_PTP_MMU),
  751. so comment out starting with RB-2008.3 release; later, might get
  752. get reintroduced as a synonym for XCHAL_HAVE_PTP_MMU instead: */
  753. /*#define XCHAL_HAVE_MMU XCHAL_HAVE_TLBS*/ /* (DEPRECATED; use XCHAL_HAVE_TLBS instead) */
  754. /* Indexing macros: */
  755. #define _XCHAL_ITLB_SET(n,_what) XCHAL_ITLB_SET ## n ## _what
  756. #define XCHAL_ITLB_SET(n,what) _XCHAL_ITLB_SET(n, _ ## what )
  757. #define _XCHAL_ITLB_SET_E(n,i,_what) XCHAL_ITLB_SET ## n ## _E ## i ## _what
  758. #define XCHAL_ITLB_SET_E(n,i,what) _XCHAL_ITLB_SET_E(n,i, _ ## what )
  759. #define _XCHAL_DTLB_SET(n,_what) XCHAL_DTLB_SET ## n ## _what
  760. #define XCHAL_DTLB_SET(n,what) _XCHAL_DTLB_SET(n, _ ## what )
  761. #define _XCHAL_DTLB_SET_E(n,i,_what) XCHAL_DTLB_SET ## n ## _E ## i ## _what
  762. #define XCHAL_DTLB_SET_E(n,i,what) _XCHAL_DTLB_SET_E(n,i, _ ## what )
  763. /*
  764. * Example use: XCHAL_ITLB_SET(XCHAL_ITLB_ARF_SET0,ENTRIES)
  765. * to get the value of XCHAL_ITLB_SET<n>_ENTRIES where <n> is the first auto-refill set.
  766. */
  767. /* Number of entries per autorefill way: */
  768. #define XCHAL_ITLB_ARF_ENTRIES (1<<XCHAL_ITLB_ARF_ENTRIES_LOG2)
  769. #define XCHAL_DTLB_ARF_ENTRIES (1<<XCHAL_DTLB_ARF_ENTRIES_LOG2)
  770. /*
  771. * Determine whether we have a full MMU (with Page Table and Protection)
  772. * usable for an MMU-based OS:
  773. */
  774. #if 0
  775. #if XCHAL_HAVE_TLBS && !XCHAL_HAVE_SPANNING_WAY && XCHAL_ITLB_ARF_WAYS > 0 && XCHAL_DTLB_ARF_WAYS > 0 && XCHAL_MMU_RINGS >= 2
  776. # define XCHAL_HAVE_PTP_MMU 1 /* have full MMU (with page table [autorefill] and protection) */
  777. #else
  778. # define XCHAL_HAVE_PTP_MMU 0 /* don't have full MMU */
  779. #endif
  780. #endif
  781. /*
  782. * For full MMUs, report kernel RAM segment and kernel I/O segment static page mappings:
  783. */
  784. #if XCHAL_HAVE_PTP_MMU && !XCHAL_HAVE_SPANNING_WAY
  785. #define XCHAL_KSEG_CACHED_VADDR 0xD0000000 /* virt.addr of kernel RAM cached static map */
  786. #define XCHAL_KSEG_CACHED_PADDR 0x00000000 /* phys.addr of kseg_cached */
  787. #define XCHAL_KSEG_CACHED_SIZE 0x08000000 /* size in bytes of kseg_cached (assumed power of 2!!!) */
  788. #define XCHAL_KSEG_BYPASS_VADDR 0xD8000000 /* virt.addr of kernel RAM bypass (uncached) static map */
  789. #define XCHAL_KSEG_BYPASS_PADDR 0x00000000 /* phys.addr of kseg_bypass */
  790. #define XCHAL_KSEG_BYPASS_SIZE 0x08000000 /* size in bytes of kseg_bypass (assumed power of 2!!!) */
  791. #define XCHAL_KIO_CACHED_VADDR 0xE0000000 /* virt.addr of kernel I/O cached static map */
  792. #define XCHAL_KIO_CACHED_PADDR 0xF0000000 /* phys.addr of kio_cached */
  793. #define XCHAL_KIO_CACHED_SIZE 0x10000000 /* size in bytes of kio_cached (assumed power of 2!!!) */
  794. #define XCHAL_KIO_BYPASS_VADDR 0xF0000000 /* virt.addr of kernel I/O bypass (uncached) static map */
  795. #define XCHAL_KIO_BYPASS_PADDR 0xF0000000 /* phys.addr of kio_bypass */
  796. #define XCHAL_KIO_BYPASS_SIZE 0x10000000 /* size in bytes of kio_bypass (assumed power of 2!!!) */
  797. #define XCHAL_SEG_MAPPABLE_VADDR 0x00000000 /* start of largest non-static-mapped virtual addr area */
  798. #define XCHAL_SEG_MAPPABLE_SIZE 0xD0000000 /* size in bytes of " */
  799. /* define XCHAL_SEG_MAPPABLE2_xxx if more areas present, sorted in order of descending size. */
  800. #endif
  801. /*----------------------------------------------------------------------
  802. MISC
  803. ----------------------------------------------------------------------*/
  804. /* Data alignment required if used for instructions: */
  805. #if XCHAL_INST_FETCH_WIDTH > XCHAL_DATA_WIDTH
  806. # define XCHAL_ALIGN_MAX XCHAL_INST_FETCH_WIDTH
  807. #else
  808. # define XCHAL_ALIGN_MAX XCHAL_DATA_WIDTH
  809. #endif
  810. /*
  811. * Names kept for backward compatibility.
  812. * (Here "RELEASE" is now a misnomer; these are product *versions*, not the releases
  813. * under which they are released. In the T10##.# era there was no distinction.)
  814. */
  815. #define XCHAL_HW_RELEASE_MAJOR XCHAL_HW_VERSION_MAJOR
  816. #define XCHAL_HW_RELEASE_MINOR XCHAL_HW_VERSION_MINOR
  817. #define XCHAL_HW_RELEASE_NAME XCHAL_HW_VERSION_NAME
  818. /*----------------------------------------------------------------------
  819. COPROCESSORS and EXTRA STATE
  820. ----------------------------------------------------------------------*/
  821. #define XCHAL_EXTRA_SA_SIZE XCHAL_NCP_SA_SIZE
  822. #define XCHAL_EXTRA_SA_ALIGN XCHAL_NCP_SA_ALIGN
  823. #define XCHAL_CPEXTRA_SA_SIZE XCHAL_TOTAL_SA_SIZE
  824. #define XCHAL_CPEXTRA_SA_ALIGN XCHAL_TOTAL_SA_ALIGN
  825. #if defined (_ASMLANGUAGE) || defined (__ASSEMBLER__)
  826. /* Invoked at start of save area load/store sequence macro to setup macro
  827. * internal offsets. Not usually invoked directly.
  828. * continue 0 for 1st sequence, 1 for subsequent consecutive ones.
  829. * totofs offset from original ptr to next load/store location.
  830. */
  831. .macro xchal_sa_start continue totofs
  832. .ifeq \continue
  833. .set .Lxchal_pofs_, 0 /* offset from original ptr to current \ptr */
  834. .set .Lxchal_ofs_, 0 /* offset from current \ptr to next load/store location */
  835. .endif
  836. .if \totofs + 1 /* if totofs specified (not -1) */
  837. .set .Lxchal_ofs_, \totofs - .Lxchal_pofs_ /* specific offset from original ptr */
  838. .endif
  839. .endm
  840. /* Align portion of save area and bring ptr in range if necessary.
  841. * Used by save area load/store sequences. Not usually invoked directly.
  842. * Allows combining multiple (sub-)sequences arbitrarily.
  843. * ptr pointer to save area (may be off, see .Lxchal_pofs_)
  844. * minofs,maxofs range of offset from cur ptr to next load/store loc;
  845. * minofs <= 0 <= maxofs (0 must always be valid offset)
  846. * range must be within +/- 30kB or so.
  847. * ofsalign alignment granularity of minofs .. maxofs (pow of 2)
  848. * (restriction on offset from ptr to next load/store loc)
  849. * totalign align from orig ptr to next load/store loc (pow of 2)
  850. */
  851. .macro xchal_sa_align ptr minofs maxofs ofsalign totalign
  852. /* First align where we start accessing the next register
  853. * per \totalign relative to original ptr (i.e. start of the save area):
  854. */
  855. .set .Lxchal_ofs_, ((.Lxchal_pofs_ + .Lxchal_ofs_ + \totalign - 1) & -\totalign) - .Lxchal_pofs_
  856. /* If necessary, adjust \ptr to bring .Lxchal_ofs_ in acceptable range: */
  857. .if (((\maxofs) - .Lxchal_ofs_) & 0xC0000000) | ((.Lxchal_ofs_ - (\minofs)) & 0xC0000000) | (.Lxchal_ofs_ & (\ofsalign-1))
  858. .set .Ligmask, 0xFFFFFFFF /* TODO: optimize to addmi, per aligns and .Lxchal_ofs_ */
  859. addi \ptr, \ptr, (.Lxchal_ofs_ & .Ligmask)
  860. .set .Lxchal_pofs_, .Lxchal_pofs_ + (.Lxchal_ofs_ & .Ligmask)
  861. .set .Lxchal_ofs_, (.Lxchal_ofs_ & ~.Ligmask)
  862. .endif
  863. .endm
  864. /*
  865. * We could optimize for addi to expand to only addmi instead of
  866. * "addmi;addi", where possible. Here's a partial example how:
  867. * .set .Lmaxmask, -(\ofsalign) & -(\totalign)
  868. * .if (((\maxofs) + ~.Lmaxmask + 1) & 0xFFFFFF00) && ((.Lxchal_ofs_ & ~.Lmaxmask) == 0)
  869. * .set .Ligmask, 0xFFFFFF00
  870. * .elif ... ditto for negative ofs range ...
  871. * .set .Ligmask, 0xFFFFFF00
  872. * .set ... adjust per offset ...
  873. * .else
  874. * .set .Ligmask, 0xFFFFFFFF
  875. * .endif
  876. */
  877. /* Invoke this after xchal_XXX_{load,store} macros to restore \ptr. */
  878. .macro xchal_sa_ptr_restore ptr
  879. .if .Lxchal_pofs_
  880. addi \ptr, \ptr, - .Lxchal_pofs_
  881. .set .Lxchal_ofs_, .Lxchal_ofs_ + .Lxchal_pofs_
  882. .set .Lxchal_pofs_, 0
  883. .endif
  884. .endm
  885. /*
  886. * Use as eg:
  887. * xchal_atmps_store a1, SOMEOFS, XCHAL_SA_NUM_ATMPS, a4, a5
  888. * xchal_ncp_load a2, a0,a3,a4,a5
  889. * xchal_atmps_load a1, SOMEOFS, XCHAL_SA_NUM_ATMPS, a4, a5
  890. *
  891. * Specify only the ARs you *haven't* saved/restored already, up to 4.
  892. * They *must* be the *last* ARs (in same order) specified to save area
  893. * load/store sequences. In the example above, a0 and a3 were already
  894. * saved/restored and unused (thus available) but a4 and a5 were not.
  895. */
  896. #define xchal_atmps_store xchal_atmps_loadstore s32i,
  897. #define xchal_atmps_load xchal_atmps_loadstore l32i,
  898. .macro xchal_atmps_loadstore inst ptr offset nreq aa=0 ab=0 ac=0 ad=0
  899. .set .Lnsaved_, 0
  900. .irp reg,\aa,\ab,\ac,\ad
  901. .ifeq 0x\reg ; .set .Lnsaved_,.Lnsaved_+1 ; .endif
  902. .endr
  903. .set .Laofs_, 0
  904. .irp reg,\aa,\ab,\ac,\ad
  905. .ifgt (\nreq)-.Lnsaved_
  906. \inst \reg, \ptr, .Laofs_+\offset
  907. .set .Laofs_,.Laofs_+4
  908. .set .Lnsaved_,.Lnsaved_+1
  909. .endif
  910. .endr
  911. .endm
  912. /*#define xchal_ncp_load_a2 xchal_ncp_load a2,a3,a4,a5,a6*/
  913. /*#define xchal_ncp_store_a2 xchal_ncp_store a2,a3,a4,a5,a6*/
  914. #define xchal_extratie_load xchal_ncptie_load
  915. #define xchal_extratie_store xchal_ncptie_store
  916. #define xchal_extratie_load_a2 xchal_ncptie_load a2,a3,a4,a5,a6
  917. #define xchal_extratie_store_a2 xchal_ncptie_store a2,a3,a4,a5,a6
  918. #define xchal_extra_load xchal_ncp_load
  919. #define xchal_extra_store xchal_ncp_store
  920. #define xchal_extra_load_a2 xchal_ncp_load a2,a3,a4,a5,a6
  921. #define xchal_extra_store_a2 xchal_ncp_store a2,a3,a4,a5,a6
  922. #define xchal_extra_load_funcbody xchal_ncp_load a2,a3,a4,a5,a6
  923. #define xchal_extra_store_funcbody xchal_ncp_store a2,a3,a4,a5,a6
  924. #define xchal_cp0_store_a2 xchal_cp0_store a2,a3,a4,a5,a6
  925. #define xchal_cp0_load_a2 xchal_cp0_load a2,a3,a4,a5,a6
  926. #define xchal_cp1_store_a2 xchal_cp1_store a2,a3,a4,a5,a6
  927. #define xchal_cp1_load_a2 xchal_cp1_load a2,a3,a4,a5,a6
  928. #define xchal_cp2_store_a2 xchal_cp2_store a2,a3,a4,a5,a6
  929. #define xchal_cp2_load_a2 xchal_cp2_load a2,a3,a4,a5,a6
  930. #define xchal_cp3_store_a2 xchal_cp3_store a2,a3,a4,a5,a6
  931. #define xchal_cp3_load_a2 xchal_cp3_load a2,a3,a4,a5,a6
  932. #define xchal_cp4_store_a2 xchal_cp4_store a2,a3,a4,a5,a6
  933. #define xchal_cp4_load_a2 xchal_cp4_load a2,a3,a4,a5,a6
  934. #define xchal_cp5_store_a2 xchal_cp5_store a2,a3,a4,a5,a6
  935. #define xchal_cp5_load_a2 xchal_cp5_load a2,a3,a4,a5,a6
  936. #define xchal_cp6_store_a2 xchal_cp6_store a2,a3,a4,a5,a6
  937. #define xchal_cp6_load_a2 xchal_cp6_load a2,a3,a4,a5,a6
  938. #define xchal_cp7_store_a2 xchal_cp7_store a2,a3,a4,a5,a6
  939. #define xchal_cp7_load_a2 xchal_cp7_load a2,a3,a4,a5,a6
  940. /* Empty placeholder macros for undefined coprocessors: */
  941. #if (XCHAL_CP_MASK & ~XCHAL_CP_PORT_MASK) == 0
  942. # if XCHAL_CP0_SA_SIZE == 0
  943. .macro xchal_cp0_store p a b c d continue=0 ofs=-1 select=-1 ; .endm
  944. .macro xchal_cp0_load p a b c d continue=0 ofs=-1 select=-1 ; .endm
  945. # endif
  946. # if XCHAL_CP1_SA_SIZE == 0
  947. .macro xchal_cp1_store p a b c d continue=0 ofs=-1 select=-1 ; .endm
  948. .macro xchal_cp1_load p a b c d continue=0 ofs=-1 select=-1 ; .endm
  949. # endif
  950. # if XCHAL_CP2_SA_SIZE == 0
  951. .macro xchal_cp2_store p a b c d continue=0 ofs=-1 select=-1 ; .endm
  952. .macro xchal_cp2_load p a b c d continue=0 ofs=-1 select=-1 ; .endm
  953. # endif
  954. # if XCHAL_CP3_SA_SIZE == 0
  955. .macro xchal_cp3_store p a b c d continue=0 ofs=-1 select=-1 ; .endm
  956. .macro xchal_cp3_load p a b c d continue=0 ofs=-1 select=-1 ; .endm
  957. # endif
  958. # if XCHAL_CP4_SA_SIZE == 0
  959. .macro xchal_cp4_store p a b c d continue=0 ofs=-1 select=-1 ; .endm
  960. .macro xchal_cp4_load p a b c d continue=0 ofs=-1 select=-1 ; .endm
  961. # endif
  962. # if XCHAL_CP5_SA_SIZE == 0
  963. .macro xchal_cp5_store p a b c d continue=0 ofs=-1 select=-1 ; .endm
  964. .macro xchal_cp5_load p a b c d continue=0 ofs=-1 select=-1 ; .endm
  965. # endif
  966. # if XCHAL_CP6_SA_SIZE == 0
  967. .macro xchal_cp6_store p a b c d continue=0 ofs=-1 select=-1 ; .endm
  968. .macro xchal_cp6_load p a b c d continue=0 ofs=-1 select=-1 ; .endm
  969. # endif
  970. # if XCHAL_CP7_SA_SIZE == 0
  971. .macro xchal_cp7_store p a b c d continue=0 ofs=-1 select=-1 ; .endm
  972. .macro xchal_cp7_load p a b c d continue=0 ofs=-1 select=-1 ; .endm
  973. # endif
  974. #endif
  975. /********************
  976. * Macros to create functions that save and restore the state of *any* TIE
  977. * coprocessor (by dynamic index).
  978. */
  979. /*
  980. * Macro that expands to the body of a function
  981. * that stores the selected coprocessor's state (registers etc).
  982. * Entry: a2 = ptr to save area in which to save cp state
  983. * a3 = coprocessor number
  984. * Exit: any register a2-a15 (?) may have been clobbered.
  985. */
  986. .macro xchal_cpi_store_funcbody
  987. #if (XCHAL_CP_MASK & ~XCHAL_CP_PORT_MASK)
  988. # if XCHAL_CP0_SA_SIZE
  989. bnez a3, 99f
  990. xchal_cp0_store_a2
  991. j 90f
  992. 99:
  993. # endif
  994. # if XCHAL_CP1_SA_SIZE
  995. bnei a3, 1, 99f
  996. xchal_cp1_store_a2
  997. j 90f
  998. 99:
  999. # endif
  1000. # if XCHAL_CP2_SA_SIZE
  1001. bnei a3, 2, 99f
  1002. xchal_cp2_store_a2
  1003. j 90f
  1004. 99:
  1005. # endif
  1006. # if XCHAL_CP3_SA_SIZE
  1007. bnei a3, 3, 99f
  1008. xchal_cp3_store_a2
  1009. j 90f
  1010. 99:
  1011. # endif
  1012. # if XCHAL_CP4_SA_SIZE
  1013. bnei a3, 4, 99f
  1014. xchal_cp4_store_a2
  1015. j 90f
  1016. 99:
  1017. # endif
  1018. # if XCHAL_CP5_SA_SIZE
  1019. bnei a3, 5, 99f
  1020. xchal_cp5_store_a2
  1021. j 90f
  1022. 99:
  1023. # endif
  1024. # if XCHAL_CP6_SA_SIZE
  1025. bnei a3, 6, 99f
  1026. xchal_cp6_store_a2
  1027. j 90f
  1028. 99:
  1029. # endif
  1030. # if XCHAL_CP7_SA_SIZE
  1031. bnei a3, 7, 99f
  1032. xchal_cp7_store_a2
  1033. j 90f
  1034. 99:
  1035. # endif
  1036. 90:
  1037. #endif
  1038. .endm
  1039. /*
  1040. * Macro that expands to the body of a function
  1041. * that loads the selected coprocessor's state (registers etc).
  1042. * Entry: a2 = ptr to save area from which to restore cp state
  1043. * a3 = coprocessor number
  1044. * Exit: any register a2-a15 (?) may have been clobbered.
  1045. */
  1046. .macro xchal_cpi_load_funcbody
  1047. #if (XCHAL_CP_MASK & ~XCHAL_CP_PORT_MASK)
  1048. # if XCHAL_CP0_SA_SIZE
  1049. bnez a3, 99f
  1050. xchal_cp0_load_a2
  1051. j 90f
  1052. 99:
  1053. # endif
  1054. # if XCHAL_CP1_SA_SIZE
  1055. bnei a3, 1, 99f
  1056. xchal_cp1_load_a2
  1057. j 90f
  1058. 99:
  1059. # endif
  1060. # if XCHAL_CP2_SA_SIZE
  1061. bnei a3, 2, 99f
  1062. xchal_cp2_load_a2
  1063. j 90f
  1064. 99:
  1065. # endif
  1066. # if XCHAL_CP3_SA_SIZE
  1067. bnei a3, 3, 99f
  1068. xchal_cp3_load_a2
  1069. j 90f
  1070. 99:
  1071. # endif
  1072. # if XCHAL_CP4_SA_SIZE
  1073. bnei a3, 4, 99f
  1074. xchal_cp4_load_a2
  1075. j 90f
  1076. 99:
  1077. # endif
  1078. # if XCHAL_CP5_SA_SIZE
  1079. bnei a3, 5, 99f
  1080. xchal_cp5_load_a2
  1081. j 90f
  1082. 99:
  1083. # endif
  1084. # if XCHAL_CP6_SA_SIZE
  1085. bnei a3, 6, 99f
  1086. xchal_cp6_load_a2
  1087. j 90f
  1088. 99:
  1089. # endif
  1090. # if XCHAL_CP7_SA_SIZE
  1091. bnei a3, 7, 99f
  1092. xchal_cp7_load_a2
  1093. j 90f
  1094. 99:
  1095. # endif
  1096. 90:
  1097. #endif
  1098. .endm
  1099. #endif /*_ASMLANGUAGE or __ASSEMBLER__*/
  1100. /* Other default macros for undefined coprocessors: */
  1101. #ifndef XCHAL_CP0_NAME
  1102. # define XCHAL_CP0_NAME 0
  1103. # define XCHAL_CP0_SA_CONTENTS_LIBDB_NUM 0
  1104. # define XCHAL_CP0_SA_CONTENTS_LIBDB /* empty */
  1105. #endif
  1106. #ifndef XCHAL_CP1_NAME
  1107. # define XCHAL_CP1_NAME 0
  1108. # define XCHAL_CP1_SA_CONTENTS_LIBDB_NUM 0
  1109. # define XCHAL_CP1_SA_CONTENTS_LIBDB /* empty */
  1110. #endif
  1111. #ifndef XCHAL_CP2_NAME
  1112. # define XCHAL_CP2_NAME 0
  1113. # define XCHAL_CP2_SA_CONTENTS_LIBDB_NUM 0
  1114. # define XCHAL_CP2_SA_CONTENTS_LIBDB /* empty */
  1115. #endif
  1116. #ifndef XCHAL_CP3_NAME
  1117. # define XCHAL_CP3_NAME 0
  1118. # define XCHAL_CP3_SA_CONTENTS_LIBDB_NUM 0
  1119. # define XCHAL_CP3_SA_CONTENTS_LIBDB /* empty */
  1120. #endif
  1121. #ifndef XCHAL_CP4_NAME
  1122. # define XCHAL_CP4_NAME 0
  1123. # define XCHAL_CP4_SA_CONTENTS_LIBDB_NUM 0
  1124. # define XCHAL_CP4_SA_CONTENTS_LIBDB /* empty */
  1125. #endif
  1126. #ifndef XCHAL_CP5_NAME
  1127. # define XCHAL_CP5_NAME 0
  1128. # define XCHAL_CP5_SA_CONTENTS_LIBDB_NUM 0
  1129. # define XCHAL_CP5_SA_CONTENTS_LIBDB /* empty */
  1130. #endif
  1131. #ifndef XCHAL_CP6_NAME
  1132. # define XCHAL_CP6_NAME 0
  1133. # define XCHAL_CP6_SA_CONTENTS_LIBDB_NUM 0
  1134. # define XCHAL_CP6_SA_CONTENTS_LIBDB /* empty */
  1135. #endif
  1136. #ifndef XCHAL_CP7_NAME
  1137. # define XCHAL_CP7_NAME 0
  1138. # define XCHAL_CP7_SA_CONTENTS_LIBDB_NUM 0
  1139. # define XCHAL_CP7_SA_CONTENTS_LIBDB /* empty */
  1140. #endif
  1141. #if XCHAL_CP_MASK == 0
  1142. /* Filler info for unassigned coprocessors, to simplify arrays etc: */
  1143. #define XCHAL_CP0_SA_SIZE 0
  1144. #define XCHAL_CP0_SA_ALIGN 1
  1145. #define XCHAL_CP1_SA_SIZE 0
  1146. #define XCHAL_CP1_SA_ALIGN 1
  1147. #define XCHAL_CP2_SA_SIZE 0
  1148. #define XCHAL_CP2_SA_ALIGN 1
  1149. #define XCHAL_CP3_SA_SIZE 0
  1150. #define XCHAL_CP3_SA_ALIGN 1
  1151. #define XCHAL_CP4_SA_SIZE 0
  1152. #define XCHAL_CP4_SA_ALIGN 1
  1153. #define XCHAL_CP5_SA_SIZE 0
  1154. #define XCHAL_CP5_SA_ALIGN 1
  1155. #define XCHAL_CP6_SA_SIZE 0
  1156. #define XCHAL_CP6_SA_ALIGN 1
  1157. #define XCHAL_CP7_SA_SIZE 0
  1158. #define XCHAL_CP7_SA_ALIGN 1
  1159. #endif
  1160. /* Indexing macros: */
  1161. #define _XCHAL_CP_SA_SIZE(n) XCHAL_CP ## n ## _SA_SIZE
  1162. #define XCHAL_CP_SA_SIZE(n) _XCHAL_CP_SA_SIZE(n) /* n = 0 .. 7 */
  1163. #define _XCHAL_CP_SA_ALIGN(n) XCHAL_CP ## n ## _SA_ALIGN
  1164. #define XCHAL_CP_SA_ALIGN(n) _XCHAL_CP_SA_ALIGN(n) /* n = 0 .. 7 */
  1165. #define XCHAL_CPEXTRA_SA_SIZE_TOR2 XCHAL_CPEXTRA_SA_SIZE /* Tor2Beta only - do not use */
  1166. /* Link-time HAL global variables that report coprocessor numbers by name
  1167. (names are case-preserved from the original TIE): */
  1168. #if !defined(_ASMLANGUAGE) && !defined(_NOCLANGUAGE) && !defined(__ASSEMBLER__)
  1169. # define _XCJOIN(a,b) a ## b
  1170. # define XCJOIN(a,b) _XCJOIN(a,b)
  1171. # ifdef XCHAL_CP0_NAME
  1172. extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP0_IDENT);
  1173. extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP0_IDENT);
  1174. # endif
  1175. # ifdef XCHAL_CP1_NAME
  1176. extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP1_IDENT);
  1177. extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP1_IDENT);
  1178. # endif
  1179. # ifdef XCHAL_CP2_NAME
  1180. extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP2_IDENT);
  1181. extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP2_IDENT);
  1182. # endif
  1183. # ifdef XCHAL_CP3_NAME
  1184. extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP3_IDENT);
  1185. extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP3_IDENT);
  1186. # endif
  1187. # ifdef XCHAL_CP4_NAME
  1188. extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP4_IDENT);
  1189. extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP4_IDENT);
  1190. # endif
  1191. # ifdef XCHAL_CP5_NAME
  1192. extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP5_IDENT);
  1193. extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP5_IDENT);
  1194. # endif
  1195. # ifdef XCHAL_CP6_NAME
  1196. extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP6_IDENT);
  1197. extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP6_IDENT);
  1198. # endif
  1199. # ifdef XCHAL_CP7_NAME
  1200. extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP7_IDENT);
  1201. extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP7_IDENT);
  1202. # endif
  1203. #endif
  1204. /*----------------------------------------------------------------------
  1205. DERIVED
  1206. ----------------------------------------------------------------------*/
  1207. #if XCHAL_HAVE_BE
  1208. #define XCHAL_INST_ILLN 0xD60F /* 2-byte illegal instruction, msb-first */
  1209. #define XCHAL_INST_ILLN_BYTE0 0xD6 /* 2-byte illegal instruction, 1st byte */
  1210. #define XCHAL_INST_ILLN_BYTE1 0x0F /* 2-byte illegal instruction, 2nd byte */
  1211. #else
  1212. #define XCHAL_INST_ILLN 0xF06D /* 2-byte illegal instruction, lsb-first */
  1213. #define XCHAL_INST_ILLN_BYTE0 0x6D /* 2-byte illegal instruction, 1st byte */
  1214. #define XCHAL_INST_ILLN_BYTE1 0xF0 /* 2-byte illegal instruction, 2nd byte */
  1215. #endif
  1216. /* Belongs in xtensa/hal.h: */
  1217. #define XTHAL_INST_ILL 0x000000 /* 3-byte illegal instruction */
  1218. /*
  1219. * Because information as to exactly which hardware version is targeted
  1220. * by a given software build is not always available, compile-time HAL
  1221. * Hardware-Release "_AT" macros are fuzzy (return 0, 1, or XCHAL_MAYBE):
  1222. * (Here "RELEASE" is now a misnomer; these are product *versions*, not the releases
  1223. * under which they are released. In the T10##.# era there was no distinction.)
  1224. */
  1225. #if XCHAL_HW_CONFIGID_RELIABLE
  1226. # define XCHAL_HW_RELEASE_AT_OR_BELOW(major,minor) (XTHAL_REL_LE( XCHAL_HW_VERSION_MAJOR,XCHAL_HW_VERSION_MINOR, major,minor ) ? 1 : 0)
  1227. # define XCHAL_HW_RELEASE_AT_OR_ABOVE(major,minor) (XTHAL_REL_GE( XCHAL_HW_VERSION_MAJOR,XCHAL_HW_VERSION_MINOR, major,minor ) ? 1 : 0)
  1228. # define XCHAL_HW_RELEASE_AT(major,minor) (XTHAL_REL_EQ( XCHAL_HW_VERSION_MAJOR,XCHAL_HW_VERSION_MINOR, major,minor ) ? 1 : 0)
  1229. # define XCHAL_HW_RELEASE_MAJOR_AT(major) ((XCHAL_HW_VERSION_MAJOR == (major)) ? 1 : 0)
  1230. #else
  1231. # define XCHAL_HW_RELEASE_AT_OR_BELOW(major,minor) ( ((major) < 1040 && XCHAL_HAVE_XEA2) ? 0 \
  1232. : ((major) > 1050 && XCHAL_HAVE_XEA1) ? 1 \
  1233. : XTHAL_MAYBE )
  1234. # define XCHAL_HW_RELEASE_AT_OR_ABOVE(major,minor) ( ((major) >= 2000 && XCHAL_HAVE_XEA1) ? 0 \
  1235. : (XTHAL_REL_LE(major,minor, 1040,0) && XCHAL_HAVE_XEA2) ? 1 \
  1236. : XTHAL_MAYBE )
  1237. # define XCHAL_HW_RELEASE_AT(major,minor) ( (((major) < 1040 && XCHAL_HAVE_XEA2) || \
  1238. ((major) >= 2000 && XCHAL_HAVE_XEA1)) ? 0 : XTHAL_MAYBE)
  1239. # define XCHAL_HW_RELEASE_MAJOR_AT(major) XCHAL_HW_RELEASE_AT(major,0)
  1240. #endif
  1241. /*
  1242. * Specific errata:
  1243. */
  1244. /*
  1245. * Erratum T1020.H13, T1030.H7, T1040.H10, T1050.H4 (fixed in T1040.3 and T1050.1;
  1246. * relevant only in XEA1, kernel-vector mode, level-one interrupts and overflows enabled):
  1247. */
  1248. #define XCHAL_MAYHAVE_ERRATUM_XEA1KWIN (XCHAL_HAVE_XEA1 && \
  1249. (XCHAL_HW_RELEASE_AT_OR_BELOW(1040,2) != 0 \
  1250. || XCHAL_HW_RELEASE_AT(1050,0)))
  1251. /*
  1252. * Erratum 453 present in RE-2013.2 up to RF-2014.0, fixed in RF-2014.1.
  1253. * Applies to specific set of configuration options.
  1254. * Part of the workaround is to add ISYNC at certain points in the code.
  1255. * The workaround gated by this macro can be disabled if not needed, e.g. if
  1256. * zero-overhead loop buffer will be disabled, by defining _NO_ERRATUM_453.
  1257. */
  1258. #if ( XCHAL_HW_MAX_VERSION >= XTENSA_HWVERSION_RE_2013_2 && \
  1259. XCHAL_HW_MIN_VERSION <= XTENSA_HWVERSION_RF_2014_0 && \
  1260. XCHAL_ICACHE_SIZE != 0 && XCHAL_HAVE_PIF /*covers also AXI/AHB*/ && \
  1261. XCHAL_HAVE_LOOPS && XCHAL_LOOP_BUFFER_SIZE != 0 && \
  1262. XCHAL_CLOCK_GATING_GLOBAL && !defined(_NO_ERRATUM_453) )
  1263. #define XCHAL_ERRATUM_453 1
  1264. #else
  1265. #define XCHAL_ERRATUM_453 0
  1266. #endif
  1267. /*
  1268. * Erratum 497 present in RE-2012.2 up to RG/RF-2015.2
  1269. * Applies to specific set of configuration options.
  1270. * Workaround is to add MEMWs after at most 8 cache WB instructions
  1271. */
  1272. #if ( ((XCHAL_HW_MAX_VERSION >= XTENSA_HWVERSION_RE_2012_0 && \
  1273. XCHAL_HW_MIN_VERSION <= XTENSA_HWVERSION_RF_2015_2) || \
  1274. (XCHAL_HW_MAX_VERSION >= XTENSA_HWVERSION_RG_2015_0 && \
  1275. XCHAL_HW_MIN_VERSION <= XTENSA_HWVERSION_RG_2015_2) \
  1276. ) && \
  1277. XCHAL_DCACHE_IS_WRITEBACK && \
  1278. XCHAL_HAVE_AXI && \
  1279. XCHAL_HAVE_PIF_WR_RESP && \
  1280. XCHAL_HAVE_PIF_REQ_ATTR && !defined(_NO_ERRATUM_497) \
  1281. )
  1282. #define XCHAL_ERRATUM_497 1
  1283. #else
  1284. #define XCHAL_ERRATUM_497 0
  1285. #endif
  1286. #endif /*XTENSA_CONFIG_CORE_H*/