5 * THIS FILE IS GENERATED -- DO NOT MODIFY BY HAND
7 * include/asm-xtensa/xtensa/hal.h -- contains a definition of the
10 * All definitions in this header file are independent of any specific
11 * Xtensa processor configuration. Thus an OS or other software can
12 * include this header file and be compiled into configuration-
13 * independent objects that can be distributed and eventually linked
14 * to the HAL library (libhal.a) to create a configuration-specific
17 * Certain definitions, however, are release-specific -- such as the
18 * XTHAL_RELEASE_xxx macros (or additions made in later releases).
20 * This file is subject to the terms and conditions of the GNU General Public
21 * License. See the file "COPYING" in the main directory of this archive
24 * Copyright (C) 2002 Tensilica Inc.
28 /*----------------------------------------------------------------------
30 (shared with assembly)
31 ----------------------------------------------------------------------*/
33 /* Software release information (not configuration-specific!): */
34 #define XTHAL_RELEASE_MAJOR 1050
35 #define XTHAL_RELEASE_MINOR 0
36 #define XTHAL_RELEASE_NAME "T1050.0-2002-08-06-eng0"
37 #define XTHAL_RELEASE_INTERNAL "2002-08-06-eng0"
38 #define XTHAL_REL_T1050 1
39 #define XTHAL_REL_T1050_0 1
40 #define XTHAL_REL_T1050_0_2002 1
41 #define XTHAL_REL_T1050_0_2002_08 1
42 #define XTHAL_REL_T1050_0_2002_08_06 1
43 #define XTHAL_REL_T1050_0_2002_08_06_ENG0 1
45 /* HAL version numbers (these names are for backward compatibility): */
46 #define XTHAL_MAJOR_REV XTHAL_RELEASE_MAJOR
47 #define XTHAL_MINOR_REV XTHAL_RELEASE_MINOR
49 * A bit of software release history on values of XTHAL_{MAJOR,MINOR}_REV:
51 * Release MAJOR MINOR Comment
52 * ======= ===== ===== =======
53 * T1015.n n/a n/a (HAL not yet available)
54 * T1020.{0,1,2} 0 1 (HAL beta)
55 * T1020.{3,4} 0 2 First release.
56 * T1020.n (n>4) 0 2 or >3 (TBD)
57 * T1030.0 0 1 (HAL beta)
58 * T1030.{1,2} 0 3 Equivalent to first release.
59 * T1030.n (n>=3) 0 >= 3 (TBD)
60 * T1040.n 1040 n Full CHAL available from T1040.2
61 * T1050.n 1050 n Current release.
64 * Note: there is a distinction between the software release with
65 * which something is compiled (accessible using XTHAL_RELEASE_* macros)
66 * and the software release with which the HAL library was compiled
67 * (accessible using Xthal_release_* global variables). This
68 * distinction is particularly relevant for vendors that distribute
69 * configuration-independent binaries (eg. an OS), where their customer
70 * might link it with a HAL of a different Xtensa software release.
71 * In this case, it may be appropriate for the OS to verify at run-time
72 * whether XTHAL_RELEASE_* and Xthal_release_* are compatible.
73 * [Guidelines as to which release is compatible with which are not
74 * currently provided explicitly, but might be inferred from reading
75 * OSKit documentation for all releases -- compatibility is also highly
76 * dependent on which HAL features are used. Each release is usually
77 * backward compatible, with very few exceptions if any.]
80 * Tornado 2.0 supported in T1020.3+, T1030.1+, and T1040.{0,1} only.
81 * Tornado 2.0.2 supported in T1040.2+, and T1050.
82 * Compile-time HAL port of NucleusPlus supported by T1040.2+ and T1050.
87 * Architectural limits, independent of configuration.
88 * Note that these are ISA-defined limits, not micro-architecture implementation
89 * limits enforced by the Xtensa Processor Generator (which may be stricter than
92 #define XTHAL_MAX_CPS 8 /* max number of coprocessors (0..7) */
93 #define XTHAL_MAX_INTERRUPTS 32 /* max number of interrupts (0..31) */
94 #define XTHAL_MAX_INTLEVELS 16 /* max number of interrupt levels (0..15) */
95 /* (as of T1040, implementation limit is 7: 0..6) */
96 #define XTHAL_MAX_TIMERS 4 /* max number of timers (CCOMPARE0..CCOMPARE3) */
97 /* (as of T1040, implementation limit is 3: 0..2) */
100 #define XTHAL_LITTLEENDIAN 0
101 #define XTHAL_BIGENDIAN 1
104 /* Interrupt types: */
105 #define XTHAL_INTTYPE_UNCONFIGURED 0
106 #define XTHAL_INTTYPE_SOFTWARE 1
107 #define XTHAL_INTTYPE_EXTERN_EDGE 2
108 #define XTHAL_INTTYPE_EXTERN_LEVEL 3
109 #define XTHAL_INTTYPE_TIMER 4
110 #define XTHAL_INTTYPE_NMI 5
111 #define XTHAL_MAX_INTTYPES 6 /* number of interrupt types */
114 #define XTHAL_TIMER_UNCONFIGURED -1 /* Xthal_timer_interrupt[] value for non-existent timers */
115 #define XTHAL_TIMER_UNASSIGNED XTHAL_TIMER_UNCONFIGURED /* (for backwards compatibility only) */
118 /* Access Mode bits (tentative): */ /* bit abbr unit short_name PPC equ - Description */
119 #define XTHAL_AMB_EXCEPTION 0 /* 001 E EX fls: EXception none - generate exception on any access (aka "illegal") */
120 #define XTHAL_AMB_HITCACHE 1 /* 002 C CH fls: use Cache on Hit ~(I CI) - use cache on hit -- way from tag match [or H HC, or U UC] (ISA: same, except for Isolate case) */
121 #define XTHAL_AMB_ALLOCATE 2 /* 004 A AL fl?: ALlocate none - refill cache on miss -- way from LRU [or F FI fill] (ISA: Read/Write Miss Refill) */
122 #define XTHAL_AMB_WRITETHRU 3 /* 008 W WT --s: WriteThrough W WT - store immediately to memory (ISA: same) */
123 #define XTHAL_AMB_ISOLATE 4 /* 010 I IS fls: ISolate none - use cache regardless of hit-vs-miss -- way from vaddr (ISA: use-cache-on-miss+hit) */
124 #define XTHAL_AMB_GUARD 5 /* 020 G GU ?l?: GUard G * - non-speculative; spec/replay refs not permitted */
126 #define XTHAL_AMB_ORDERED x /* 000 O OR fls: ORdered G * - mem accesses cannot be out of order */
127 #define XTHAL_AMB_FUSEWRITES x /* 000 F FW --s: FuseWrites none - allow combining/merging multiple writes (to same datapath data unit) into one (implied by writeback) */
128 #define XTHAL_AMB_COHERENT x /* 000 M MC fl?: Mem/MP Coherent M - on reads, other CPUs/bus-masters may need to supply data */
129 #define XTHAL_AMB_TRUSTED x /* 000 T TR ?l?: TRusted none - memory will not bus error (if it does, handle as fatal imprecise interrupt) */
130 #define XTHAL_AMB_PREFETCH x /* 000 P PR fl?: PRefetch none - on refill, read line+1 into prefetch buffers */
131 #define XTHAL_AMB_STREAM x /* 000 S ST ???: STreaming none - access one of N stream buffers */
134 #define XTHAL_AM_EXCEPTION (1<<XTHAL_AMB_EXCEPTION)
135 #define XTHAL_AM_HITCACHE (1<<XTHAL_AMB_HITCACHE)
136 #define XTHAL_AM_ALLOCATE (1<<XTHAL_AMB_ALLOCATE)
137 #define XTHAL_AM_WRITETHRU (1<<XTHAL_AMB_WRITETHRU)
138 #define XTHAL_AM_ISOLATE (1<<XTHAL_AMB_ISOLATE)
139 #define XTHAL_AM_GUARD (1<<XTHAL_AMB_GUARD)
141 #define XTHAL_AM_ORDERED (1<<XTHAL_AMB_ORDERED)
142 #define XTHAL_AM_FUSEWRITES (1<<XTHAL_AMB_FUSEWRITES)
143 #define XTHAL_AM_COHERENT (1<<XTHAL_AMB_COHERENT)
144 #define XTHAL_AM_TRUSTED (1<<XTHAL_AMB_TRUSTED)
145 #define XTHAL_AM_PREFETCH (1<<XTHAL_AMB_PREFETCH)
146 #define XTHAL_AM_STREAM (1<<XTHAL_AMB_STREAM)
150 * Allowed Access Modes (bit combinations).
154 * Access mode bits (see XTHAL_AMB_xxx above).
155 * <letter> = bit is set
157 * '.' = bit is irrelevant / don't care, as follows:
158 * E=1 makes all others irrelevant
159 * W,F relevant only for stores
161 * Indicates which Xtensa releases support the corresponding
162 * access mode. Releases for each character column are:
163 * 2 = prior to T1020.2: T1015 (V1.5), T1020.0, T1020.1
164 * 3 = T1020.2 and later: T1020.2+, T1030
167 * And the character column contents are:
168 * <number> = support by release(s)
169 * "." = unsupported by release(s)
170 * "?" = support unknown
173 /* For instruction fetch: */
174 #define XTHAL_FAM_EXCEPTION 0x001 /* .......E 2345 exception */
175 #define XTHAL_FAM_ISOLATE 0x012 /* .--I.-C- .... isolate */
176 #define XTHAL_FAM_BYPASS 0x000 /* .---.--- 2345 bypass */
177 #define XTHAL_FAM_NACACHED 0x002 /* .---.-C- .... cached no-allocate (frozen) */
178 #define XTHAL_FAM_CACHED 0x006 /* .---.AC- 2345 cached */
180 #define XTHAL_LAM_EXCEPTION 0x001 /* .......E 2345 exception */
181 #define XTHAL_LAM_ISOLATE 0x012 /* .--I.-C- 2345 isolate */
182 #define XTHAL_LAM_BYPASS 0x000 /* .O--.--- 2... bypass speculative */
183 #define XTHAL_LAM_BYPASSG 0x020 /* .OG-.--- .345 bypass guarded */
184 #define XTHAL_LAM_NACACHED 0x002 /* .O--.-C- 2... cached no-allocate speculative */
185 #define XTHAL_LAM_NACACHEDG 0x022 /* .OG-.-C- .345 cached no-allocate guarded */
186 #define XTHAL_LAM_CACHED 0x006 /* .---.AC- 2345 cached speculative */
187 #define XTHAL_LAM_CACHEDG 0x026 /* .?G-.AC- .... cached guarded */
188 /* For data store: */
189 #define XTHAL_SAM_EXCEPTION 0x001 /* .......E 2345 exception */
190 #define XTHAL_SAM_ISOLATE 0x032 /* .-GI--C- 2345 isolate */
191 #define XTHAL_SAM_BYPASS 0x028 /* -OG-W--- 2345 bypass */
192 /*efine XTHAL_SAM_BYPASSF 0x028*/ /* F-G-W--- ...? bypass write-combined */
193 #define XTHAL_SAM_WRITETHRU 0x02A /* -OG-W-C- 234? writethrough */
194 /*efine XTHAL_SAM_WRITETHRUF 0x02A*/ /* F-G-W-C- ...5 writethrough write-combined */
195 #define XTHAL_SAM_WRITEALLOC 0x02E /* -OG-WAC- ...? writethrough-allocate */
196 /*efine XTHAL_SAM_WRITEALLOCF 0x02E*/ /* F-G-WAC- ...? writethrough-allocate write-combined */
197 #define XTHAL_SAM_WRITEBACK 0x026 /* F-G--AC- ...5 writeback */
201 Cache attribute encoding for CACHEATTR (per ISA):
202 (Note: if this differs from ISA Ref Manual, ISA has precedence)
204 Inst-fetches Loads Stores
205 ------------- ------------ -------------
206 0x0 FCA_EXCEPTION ?LCA_NACACHED_G* SCA_WRITETHRU "uncached"
207 0x1 FCA_CACHED LCA_CACHED SCA_WRITETHRU cached
208 0x2 FCA_BYPASS LCA_BYPASS_G* SCA_BYPASS bypass
209 0x3 FCA_CACHED LCA_CACHED SCA_WRITEALLOCF write-allocate
210 or LCA_EXCEPTION SCA_EXCEPTION (if unimplemented)
211 0x4 FCA_CACHED LCA_CACHED SCA_WRITEBACK write-back
212 or LCA_EXCEPTION SCA_EXCEPTION (if unimplemented)
213 0x5..D FCA_EXCEPTION LCA_EXCEPTION SCA_EXCEPTION (reserved)
214 0xE FCA_EXCEPTION LCA_ISOLATE SCA_ISOLATE isolate
215 0xF FCA_EXCEPTION LCA_EXCEPTION SCA_EXCEPTION illegal
216 * Prior to T1020.2?, guard feature not supported, this defaulted to speculative (no _G)
221 #if !defined(__ASSEMBLY__) && !defined(_NOCLANGUAGE)
226 /*----------------------------------------------------------------------
228 ----------------------------------------------------------------------*/
230 /* Constant to be checked in build = (XTHAL_MAJOR_REV<<16)|XTHAL_MINOR_REV */
231 extern const unsigned int Xthal_rev_no
;
234 /*----------------------------------------------------------------------
236 ----------------------------------------------------------------------*/
237 /* save & restore the extra processor state */
238 extern void xthal_save_extra(void *base
);
239 extern void xthal_restore_extra(void *base
);
241 extern void xthal_save_cpregs(void *base
, int);
242 extern void xthal_restore_cpregs(void *base
, int);
244 /*extern void xthal_save_all_extra(void *base);*/
245 /*extern void xthal_restore_all_extra(void *base);*/
247 /* space for processor state */
248 extern const unsigned int Xthal_extra_size
;
249 extern const unsigned int Xthal_extra_align
;
250 /* space for TIE register files */
251 extern const unsigned int Xthal_cpregs_size
[XTHAL_MAX_CPS
];
252 extern const unsigned int Xthal_cpregs_align
[XTHAL_MAX_CPS
];
254 /* total of space for the processor state (for Tor2) */
255 extern const unsigned int Xthal_all_extra_size
;
256 extern const unsigned int Xthal_all_extra_align
;
258 /* initialize the extra processor */
259 /*extern void xthal_init_extra(void);*/
260 /* initialize the TIE coprocessor */
261 /*extern void xthal_init_cp(int);*/
263 /* initialize the extra processor */
264 extern void xthal_init_mem_extra(void *);
265 /* initialize the TIE coprocessor */
266 extern void xthal_init_mem_cp(void *, int);
268 /* validate & invalidate the TIE register file */
269 extern void xthal_validate_cp(int);
270 extern void xthal_invalidate_cp(int);
272 /* the number of TIE coprocessors contiguous from zero (for Tor2) */
273 extern const unsigned int Xthal_num_coprocessors
;
275 /* actual number of coprocessors */
276 extern const unsigned char Xthal_cp_num
;
277 /* index of highest numbered coprocessor, plus one */
278 extern const unsigned char Xthal_cp_max
;
279 /* index of highest allowed coprocessor number, per cfg, plus one */
280 /*extern const unsigned char Xthal_cp_maxcfg;*/
281 /* bitmask of which coprocessors are present */
282 extern const unsigned int Xthal_cp_mask
;
284 /* read and write cpenable register */
285 extern void xthal_set_cpenable(unsigned);
286 extern unsigned xthal_get_cpenable(void);
288 /* read & write extra state register */
289 /*extern int xthal_read_extra(void *base, unsigned reg, unsigned *value);*/
290 /*extern int xthal_write_extra(void *base, unsigned reg, unsigned value);*/
292 /* read & write a TIE coprocessor register */
293 /*extern int xthal_read_cpreg(void *base, int cp, unsigned reg, unsigned *value);*/
294 /*extern int xthal_write_cpreg(void *base, int cp, unsigned reg, unsigned value);*/
296 /* return coprocessor number based on register */
297 /*extern int xthal_which_cp(unsigned reg);*/
299 /*----------------------------------------------------------------------
301 ----------------------------------------------------------------------*/
303 /* the number of interrupt levels */
304 extern const unsigned char Xthal_num_intlevels
;
305 /* the number of interrupts */
306 extern const unsigned char Xthal_num_interrupts
;
308 /* mask for level of interrupts */
309 extern const unsigned int Xthal_intlevel_mask
[XTHAL_MAX_INTLEVELS
];
310 /* mask for level 0 to N interrupts */
311 extern const unsigned int Xthal_intlevel_andbelow_mask
[XTHAL_MAX_INTLEVELS
];
313 /* level of each interrupt */
314 extern const unsigned char Xthal_intlevel
[XTHAL_MAX_INTERRUPTS
];
316 /* type per interrupt */
317 extern const unsigned char Xthal_inttype
[XTHAL_MAX_INTERRUPTS
];
319 /* masks of each type of interrupt */
320 extern const unsigned int Xthal_inttype_mask
[XTHAL_MAX_INTTYPES
];
322 /* interrupt numbers assigned to each timer interrupt */
323 extern const int Xthal_timer_interrupt
[XTHAL_MAX_TIMERS
];
325 /*** Virtual interrupt prioritization: ***/
327 /* Convert between interrupt levels (as per PS.INTLEVEL) and virtual interrupt priorities: */
328 extern unsigned xthal_vpri_to_intlevel(unsigned vpri
);
329 extern unsigned xthal_intlevel_to_vpri(unsigned intlevel
);
331 /* Enables/disables given set (mask) of interrupts; returns previous enabled-mask of all ints: */
332 extern unsigned xthal_int_enable(unsigned);
333 extern unsigned xthal_int_disable(unsigned);
335 /* Set/get virtual priority of an interrupt: */
336 extern int xthal_set_int_vpri(int intnum
, int vpri
);
337 extern int xthal_get_int_vpri(int intnum
);
339 /* Set/get interrupt lockout level for exclusive access to virtual priority data structures: */
340 extern void xthal_set_vpri_locklevel(unsigned intlevel
);
341 extern unsigned xthal_get_vpri_locklevel(void);
343 /* Set/get current virtual interrupt priority: */
344 extern unsigned xthal_set_vpri(unsigned vpri
);
345 extern unsigned xthal_get_vpri(unsigned vpri
);
346 extern unsigned xthal_set_vpri_intlevel(unsigned intlevel
);
347 extern unsigned xthal_set_vpri_lock(void);
351 /*----------------------------------------------------------------------
352 Generic Interrupt Trampolining Support
353 ----------------------------------------------------------------------*/
355 typedef void (XtHalVoidFunc
)(void);
358 * Bitmask of interrupts currently trampolining down:
360 extern unsigned Xthal_tram_pending
;
363 * Bitmask of which interrupts currently trampolining down
364 * synchronously are actually enabled; this bitmask is necessary
365 * because INTENABLE cannot hold that state (sync-trampolining
366 * interrupts must be kept disabled while trampolining);
367 * in the current implementation, any bit set here is not set
368 * in INTENABLE, and vice-versa; once a sync-trampoline is
369 * handled (at level one), its enable bit must be moved from
372 extern unsigned Xthal_tram_enabled
;
375 * Bitmask of interrupts configured for sync trampolining:
377 extern unsigned Xthal_tram_sync
;
380 /* Trampoline support functions: */
381 extern unsigned xthal_tram_pending_to_service( void );
382 extern void xthal_tram_done( unsigned serviced_mask
);
383 extern int xthal_tram_set_sync( int intnum
, int sync
);
384 extern XtHalVoidFunc
* xthal_set_tram_trigger_func( XtHalVoidFunc
*trigger_fn
);
386 /* INTENABLE,INTREAD,INTSET,INTCLEAR register access functions: */
387 extern unsigned xthal_get_intenable( void );
388 extern void xthal_set_intenable( unsigned );
389 extern unsigned xthal_get_intread( void );
390 extern void xthal_set_intset( unsigned );
391 extern void xthal_set_intclear( unsigned );
394 /*----------------------------------------------------------------------
396 ----------------------------------------------------------------------*/
398 /* number of registers in register window */
399 extern const unsigned int Xthal_num_aregs
;
400 extern const unsigned char Xthal_num_aregs_log2
;
402 /* This spill any live register windows (other than the caller's): */
403 extern void xthal_window_spill( void );
406 /*----------------------------------------------------------------------
408 ----------------------------------------------------------------------*/
410 /* size of the cache lines in log2(bytes) */
411 extern const unsigned char Xthal_icache_linewidth
;
412 extern const unsigned char Xthal_dcache_linewidth
;
413 /* size of the cache lines in bytes */
414 extern const unsigned short Xthal_icache_linesize
;
415 extern const unsigned short Xthal_dcache_linesize
;
416 /* number of cache sets in log2(lines per way) */
417 extern const unsigned char Xthal_icache_setwidth
;
418 extern const unsigned char Xthal_dcache_setwidth
;
419 /* cache set associativity (number of ways) */
420 extern const unsigned int Xthal_icache_ways
;
421 extern const unsigned int Xthal_dcache_ways
;
422 /* size of the caches in bytes (ways * 2^(linewidth + setwidth)) */
423 extern const unsigned int Xthal_icache_size
;
424 extern const unsigned int Xthal_dcache_size
;
426 extern const unsigned char Xthal_dcache_is_writeback
;
427 extern const unsigned char Xthal_icache_line_lockable
;
428 extern const unsigned char Xthal_dcache_line_lockable
;
430 /* cache attribute register control (used by other HAL routines) */
431 extern unsigned xthal_get_cacheattr( void );
432 extern unsigned xthal_get_icacheattr( void );
433 extern unsigned xthal_get_dcacheattr( void );
434 extern void xthal_set_cacheattr( unsigned );
435 extern void xthal_set_icacheattr( unsigned );
436 extern void xthal_set_dcacheattr( unsigned );
438 /* initialize cache support (must be called once at startup, before all other cache calls) */
439 /*extern void xthal_cache_startinit( void );*/
441 /*extern void xthal_icache_reset( void );*/
442 /*extern void xthal_dcache_reset( void );*/
444 extern void xthal_icache_enable( void ); /* DEPRECATED */
445 extern void xthal_dcache_enable( void ); /* DEPRECATED */
447 extern void xthal_icache_disable( void ); /* DEPRECATED */
448 extern void xthal_dcache_disable( void ); /* DEPRECATED */
450 /* invalidate the caches */
451 extern void xthal_icache_all_invalidate( void );
452 extern void xthal_dcache_all_invalidate( void );
453 extern void xthal_icache_region_invalidate( void *addr
, unsigned size
);
454 extern void xthal_dcache_region_invalidate( void *addr
, unsigned size
);
455 extern void xthal_icache_line_invalidate(void *addr
);
456 extern void xthal_dcache_line_invalidate(void *addr
);
457 /* write dirty data back */
458 extern void xthal_dcache_all_writeback( void );
459 extern void xthal_dcache_region_writeback( void *addr
, unsigned size
);
460 extern void xthal_dcache_line_writeback(void *addr
);
461 /* write dirty data back and invalidate */
462 extern void xthal_dcache_all_writeback_inv( void );
463 extern void xthal_dcache_region_writeback_inv( void *addr
, unsigned size
);
464 extern void xthal_dcache_line_writeback_inv(void *addr
);
465 /* prefetch and lock specified memory range into cache */
466 extern void xthal_icache_region_lock( void *addr
, unsigned size
);
467 extern void xthal_dcache_region_lock( void *addr
, unsigned size
);
468 extern void xthal_icache_line_lock(void *addr
);
469 extern void xthal_dcache_line_lock(void *addr
);
470 /* unlock from cache */
471 extern void xthal_icache_all_unlock( void );
472 extern void xthal_dcache_all_unlock( void );
473 extern void xthal_icache_region_unlock( void *addr
, unsigned size
);
474 extern void xthal_dcache_region_unlock( void *addr
, unsigned size
);
475 extern void xthal_icache_line_unlock(void *addr
);
476 extern void xthal_dcache_line_unlock(void *addr
);
479 /* sync icache and memory */
480 extern void xthal_icache_sync( void );
481 /* sync dcache and memory */
482 extern void xthal_dcache_sync( void );
484 /*----------------------------------------------------------------------
486 ----------------------------------------------------------------------*/
488 /* 1 if debug option configured, 0 if not: */
489 extern const int Xthal_debug_configured
;
491 /* Number of instruction and data break registers: */
492 extern const int Xthal_num_ibreak
;
493 extern const int Xthal_num_dbreak
;
495 /* Set (plant) and remove software breakpoint, both synchronizing cache: */
496 extern unsigned int xthal_set_soft_break(void *addr
);
497 extern void xthal_remove_soft_break(void *addr
, unsigned int);
500 /*----------------------------------------------------------------------
502 ----------------------------------------------------------------------*/
504 /* Max expected size of the return buffer for a disassembled instruction (hint only): */
505 #define XTHAL_DISASM_BUFSIZE 80
507 /* Disassembly option bits for selecting what to return: */
508 #define XTHAL_DISASM_OPT_ADDR 0x0001 /* display address */
509 #define XTHAL_DISASM_OPT_OPHEX 0x0002 /* display opcode bytes in hex */
510 #define XTHAL_DISASM_OPT_OPCODE 0x0004 /* display opcode name (mnemonic) */
511 #define XTHAL_DISASM_OPT_PARMS 0x0008 /* display parameters */
512 #define XTHAL_DISASM_OPT_ALL 0x0FFF /* display everything */
514 /* routine to get a string for the disassembled instruction */
515 extern int xthal_disassemble( unsigned char *instr_buf
, void *tgt_addr
,
516 char *buffer
, unsigned buflen
, unsigned options
);
518 /* routine to get the size of the next instruction. Returns 0 for
519 illegal instruction */
520 extern int xthal_disassemble_size( unsigned char *instr_buf
);
523 /*----------------------------------------------------------------------
525 ----------------------------------------------------------------------*/
528 extern const unsigned char Xthal_have_ccount
; /* set if CCOUNT register present */
529 extern const unsigned char Xthal_num_ccompare
; /* number of CCOMPAREn registers */
531 /* get CCOUNT register (if not present return 0) */
532 extern unsigned xthal_get_ccount(void);
534 /* set and get CCOMPAREn registers (if not present, get returns 0) */
535 extern void xthal_set_ccompare(int, unsigned);
536 extern unsigned xthal_get_ccompare(int);
539 /*----------------------------------------------------------------------
540 Instruction/Data RAM/ROM Access
541 ----------------------------------------------------------------------*/
543 extern void* xthal_memcpy(void *dst
, const void *src
, unsigned len
);
544 extern void* xthal_bcopy(const void *src
, void *dst
, unsigned len
);
546 /*----------------------------------------------------------------------
548 ----------------------------------------------------------------------*/
549 extern int xthal_compare_and_set( int *addr
, int test_val
, int compare_val
);
550 extern unsigned xthal_get_prid( void );
552 /*extern const char Xthal_have_s32c1i;*/
553 extern const unsigned char Xthal_have_prid
;
556 /*----------------------------------------------------------------------
558 ----------------------------------------------------------------------*/
560 extern const unsigned int Xthal_release_major
;
561 extern const unsigned int Xthal_release_minor
;
562 extern const char * const Xthal_release_name
;
563 extern const char * const Xthal_release_internal
;
565 extern const unsigned char Xthal_memory_order
;
566 extern const unsigned char Xthal_have_windowed
;
567 extern const unsigned char Xthal_have_density
;
568 extern const unsigned char Xthal_have_booleans
;
569 extern const unsigned char Xthal_have_loops
;
570 extern const unsigned char Xthal_have_nsa
;
571 extern const unsigned char Xthal_have_minmax
;
572 extern const unsigned char Xthal_have_sext
;
573 extern const unsigned char Xthal_have_clamps
;
574 extern const unsigned char Xthal_have_mac16
;
575 extern const unsigned char Xthal_have_mul16
;
576 extern const unsigned char Xthal_have_fp
;
577 extern const unsigned char Xthal_have_speculation
;
578 extern const unsigned char Xthal_have_exceptions
;
579 extern const unsigned char Xthal_xea_version
;
580 extern const unsigned char Xthal_have_interrupts
;
581 extern const unsigned char Xthal_have_highlevel_interrupts
;
582 extern const unsigned char Xthal_have_nmi
;
584 extern const unsigned short Xthal_num_writebuffer_entries
;
586 extern const unsigned int Xthal_build_unique_id
;
587 /* Release info for hardware targeted by software upgrades: */
588 extern const unsigned int Xthal_hw_configid0
;
589 extern const unsigned int Xthal_hw_configid1
;
590 extern const unsigned int Xthal_hw_release_major
;
591 extern const unsigned int Xthal_hw_release_minor
;
592 extern const char * const Xthal_hw_release_name
;
593 extern const char * const Xthal_hw_release_internal
;
596 /* Internal memories... */
598 extern const unsigned char Xthal_num_instrom
;
599 extern const unsigned char Xthal_num_instram
;
600 extern const unsigned char Xthal_num_datarom
;
601 extern const unsigned char Xthal_num_dataram
;
602 extern const unsigned char Xthal_num_xlmi
;
603 extern const unsigned int Xthal_instrom_vaddr
[1];
604 extern const unsigned int Xthal_instrom_paddr
[1];
605 extern const unsigned int Xthal_instrom_size
[1];
606 extern const unsigned int Xthal_instram_vaddr
[1];
607 extern const unsigned int Xthal_instram_paddr
[1];
608 extern const unsigned int Xthal_instram_size
[1];
609 extern const unsigned int Xthal_datarom_vaddr
[1];
610 extern const unsigned int Xthal_datarom_paddr
[1];
611 extern const unsigned int Xthal_datarom_size
[1];
612 extern const unsigned int Xthal_dataram_vaddr
[1];
613 extern const unsigned int Xthal_dataram_paddr
[1];
614 extern const unsigned int Xthal_dataram_size
[1];
615 extern const unsigned int Xthal_xlmi_vaddr
[1];
616 extern const unsigned int Xthal_xlmi_paddr
[1];
617 extern const unsigned int Xthal_xlmi_size
[1];
621 /*----------------------------------------------------------------------
622 Memory Management Unit
623 ----------------------------------------------------------------------*/
625 extern const unsigned char Xthal_have_spanning_way
;
626 extern const unsigned char Xthal_have_identity_map
;
627 extern const unsigned char Xthal_have_mimic_cacheattr
;
628 extern const unsigned char Xthal_have_xlt_cacheattr
;
629 extern const unsigned char Xthal_have_cacheattr
;
630 extern const unsigned char Xthal_have_tlbs
;
632 extern const unsigned char Xthal_mmu_asid_bits
; /* 0 .. 8 */
633 extern const unsigned char Xthal_mmu_asid_kernel
;
634 extern const unsigned char Xthal_mmu_rings
; /* 1 .. 4 (perhaps 0 if no MMU and/or no protection?) */
635 extern const unsigned char Xthal_mmu_ring_bits
;
636 extern const unsigned char Xthal_mmu_sr_bits
;
637 extern const unsigned char Xthal_mmu_ca_bits
;
638 extern const unsigned int Xthal_mmu_max_pte_page_size
;
639 extern const unsigned int Xthal_mmu_min_pte_page_size
;
641 extern const unsigned char Xthal_itlb_way_bits
;
642 extern const unsigned char Xthal_itlb_ways
;
643 extern const unsigned char Xthal_itlb_arf_ways
;
644 extern const unsigned char Xthal_dtlb_way_bits
;
645 extern const unsigned char Xthal_dtlb_ways
;
646 extern const unsigned char Xthal_dtlb_arf_ways
;
648 /* Convert between virtual and physical addresses (through static maps only): */
649 /*** WARNING: these two functions may go away in a future release; don't depend on them! ***/
650 extern int xthal_static_v2p( unsigned vaddr
, unsigned *paddrp
);
651 extern int xthal_static_p2v( unsigned paddr
, unsigned *vaddrp
, unsigned cached
);
654 /******************* EXPERIMENTAL AND TENTATIVE ONLY ********************/
656 #define XTHAL_MMU_PAGESZ_COUNT_MAX 8 /* maximum number of different page sizes */
657 extern const char Xthal_mmu_pagesz_count
; /* 0 .. 8 number of different page sizes configured */
659 /* Note: the following table doesn't necessarily have page sizes in increasing order: */
660 extern const char Xthal_mmu_pagesz_log2
[XTHAL_MMU_PAGESZ_COUNT_MAX
]; /* 10 .. 28 (0 past count) */
662 /* Sorted (increasing) table of page sizes, that indexes into the above table: */
663 extern const char Xthal_mmu_pagesz_sorted
[XTHAL_MMU_PAGESZ_COUNT_MAX
]; /* 0 .. 7 (0 past count) */
665 /*u32 Xthal_virtual_exceptions;*/ /* bitmask of which exceptions execute in virtual mode... */
667 extern const char Xthal_mmu_pte_pagesz_log2_min
; /* ?? minimum page size in PTEs */
668 extern const char Xthal_mmu_pte_pagesz_log2_max
; /* ?? maximum page size in PTEs */
670 /* Cache Attribute Bits Implemented by the Cache (part of the cache abstraction) */
671 extern const char Xthal_icache_fca_bits_implemented
; /* ITLB/UTLB only! */
672 extern const char Xthal_dcache_lca_bits_implemented
; /* DTLB/UTLB only! */
673 extern const char Xthal_dcache_sca_bits_implemented
; /* DTLB/UTLB only! */
675 /* Per TLB Parameters (Instruction, Data, Unified) */
676 struct XtHalMmuTlb Xthal_itlb
; /* description of MMU I-TLB generic features */
677 struct XtHalMmuTlb Xthal_dtlb
; /* description of MMU D-TLB generic features */
678 struct XtHalMmuTlb Xthal_utlb
; /* description of MMU U-TLB generic features */
680 #define XTHAL_MMU_WAYS_MAX 8 /* maximum number of ways (associativities) for each TLB */
682 /* Structure for common information described for each possible TLB (instruction, data and unified): */
683 typedef struct XtHalMmuTlb
{
684 u8 va_bits
; /* 32 (number of virtual address bits) */
685 u8 pa_bits
; /* 32 (number of physical address bits) */
686 bool tlb_va_indexed
; /* 1 (set if TLB is indexed by virtual address) */
687 bool tlb_va_tagged
; /* 0 (set if TLB is tagged by virtual address) */
688 bool cache_va_indexed
; /* 1 (set if cache is indexed by virtual address) */
689 bool cache_va_tagged
; /* 0 (set if cache is tagged by virtual address) */
690 /*bool (whether page tables are traversed in vaddr sorted order, paddr sorted order, ...) */
691 /*u8 (set of available page attribute bits, other than cache attribute bits defined above) */
692 /*u32 (various masks for pages, MMU table/TLB entries, etc.) */
693 u8 way_count
; /* 0 .. 8 (number of ways, a.k.a. associativities, for this TLB) */
694 XtHalMmuTlbWay
* ways
[XTHAL_MMU_WAYS_MAX
]; /* pointers to per-way parms for each way */
697 /* Per TLB Way (Per Associativity) Parameters */
698 typedef struct XtHalMmuTlbWay
{
699 u32 index_count_log2
; /* 0 .. 4 */
700 u32 pagesz_mask
; /* 0 .. 2^pagesz_count - 1 (each bit corresponds to a size */
701 /* defined in the Xthal_mmu_pagesz_log2[] table) */
704 u64 ppn_const_mask
; /* future may support pa_bits > 32 */
706 u32 ppn_id_mask
; /* paddr bits taken directly from vaddr */
707 bool backgnd_match
; /* 0 or 1 */
708 /* These are defined in terms of the XTHAL_CACHE_xxx bits: */
709 u8 fca_const_mask
; /* ITLB/UTLB only! */
710 u8 fca_const_value
; /* ITLB/UTLB only! */
711 u8 lca_const_mask
; /* DTLB/UTLB only! */
712 u8 lca_const_value
; /* DTLB/UTLB only! */
713 u8 sca_const_mask
; /* DTLB/UTLB only! */
714 u8 sca_const_value
; /* DTLB/UTLB only! */
715 /* These define an encoding that map 5 bits in TLB and PTE entries to */
716 /* 8 bits (FCA, ITLB), 16 bits (LCA+SCA, DTLB) or 24 bits (FCA+LCA+SCA, UTLB): */
717 /* (they may be moved to struct XtHalMmuTlb) */
718 u8 ca_bits
; /* number of bits in TLB/PTE entries for cache attributes */
719 u32
* ca_map
; /* pointer to array of 2^ca_bits entries of FCA+LCA+SCA bits */
723 * The way to determine whether protection support is present in core
724 * is to [look at Xthal_mmu_rings ???].
725 * Give info on memory requirements for MMU tables and other in-memory
726 * data structures (globally, per task, base and per page, etc.) - whatever bounds can be calculated.
730 /* Default vectors: */
731 xthal_immu_fetch_miss_vector
732 xthal_dmmu_load_miss_vector
733 xthal_dmmu_store_miss_vector
735 /* Functions called when a fault is detected: */
736 typedef void (XtHalMmuFaultFunc
)( unsigned vaddr
, ...context
... );
739 /* a? = context... */
741 XtHalMMuFaultFunc
*Xthal_immu_fetch_fault_func
;
742 XtHalMMuFaultFunc
*Xthal_dmmu_load_fault_func
;
743 XtHalMMuFaultFunc
*Xthal_dmmu_store_fault_func
;
745 /* Default Handlers: */
746 /* The user and/or kernel exception handlers may jump to these handlers to handle the relevant exceptions,
747 * according to the value of EXCCAUSE. The exact register state on entry to these handlers is TBD. */
748 /* When multiple TLB entries match (hit) on the same access: */
749 xthal_immu_fetch_multihit_handler
750 xthal_dmmu_load_multihit_handler
751 xthal_dmmu_store_multihit_handler
752 /* Protection violations according to cache attributes, and other cache attribute mismatches: */
753 xthal_immu_fetch_attr_handler
754 xthal_dmmu_load_attr_handler
755 xthal_dmmu_store_attr_handler
756 /* Protection violations due to insufficient ring level: */
757 xthal_immu_fetch_priv_handler
758 xthal_dmmu_load_priv_handler
759 xthal_dmmu_store_priv_handler
760 /* Alignment exception handlers (if supported by the particular Xtensa MMU configuration): */
761 xthal_dmmu_load_align_handler
762 xthal_dmmu_store_align_handler
764 /* Or, alternatively, the OS user and/or kernel exception handlers may simply jump to the
765 * following entry points which will handle any values of EXCCAUSE not handled by the OS: */
766 xthal_user_exc_default_handler
767 xthal_kernel_exc_default_handler
771 #ifdef INCLUDE_DEPRECATED_HAL_CODE
772 extern const unsigned char Xthal_have_old_exc_arch
;
773 extern const unsigned char Xthal_have_mmu
;
774 extern const unsigned int Xthal_num_regs
;
775 extern const unsigned char Xthal_num_iroms
;
776 extern const unsigned char Xthal_num_irams
;
777 extern const unsigned char Xthal_num_droms
;
778 extern const unsigned char Xthal_num_drams
;
779 extern const unsigned int Xthal_configid0
;
780 extern const unsigned int Xthal_configid1
;
783 #ifdef INCLUDE_DEPRECATED_HAL_DEBUG_CODE
784 #define XTHAL_24_BIT_BREAK 0x80000000
785 #define XTHAL_16_BIT_BREAK 0x40000000
786 extern const unsigned short Xthal_ill_inst_16
[16];
787 #define XTHAL_DEST_REG 0xf0000000 /* Mask for destination register */
788 #define XTHAL_DEST_REG_INST 0x08000000 /* Branch address is in register */
789 #define XTHAL_DEST_REL_INST 0x04000000 /* Branch address is relative */
790 #define XTHAL_RFW_INST 0x00000800
791 #define XTHAL_RFUE_INST 0x00000400
792 #define XTHAL_RFI_INST 0x00000200
793 #define XTHAL_RFE_INST 0x00000100
794 #define XTHAL_RET_INST 0x00000080
795 #define XTHAL_BREAK_INST 0x00000040
796 #define XTHAL_SYSCALL_INST 0x00000020
797 #define XTHAL_LOOP_END 0x00000010 /* Not set by xthal_inst_type */
798 #define XTHAL_JUMP_INST 0x00000008 /* Call or jump instruction */
799 #define XTHAL_BRANCH_INST 0x00000004 /* Branch instruction */
800 #define XTHAL_24_BIT_INST 0x00000002
801 #define XTHAL_16_BIT_INST 0x00000001
802 typedef struct xthal_state
{
809 unsigned cpregs_ptr
[XTHAL_MAX_CPS
];
811 extern unsigned int xthal_inst_type(void *addr
);
812 extern unsigned int xthal_branch_addr(void *addr
);
813 extern unsigned int xthal_get_npc(XTHAL_STATE
*user_state
);
814 #endif /* INCLUDE_DEPRECATED_HAL_DEBUG_CODE */
819 #endif /*!__ASSEMBLY__ */
821 #endif /*XTENSA_HAL_H*/