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