From 7232bc8360db983f182a08e41a6f92e294af34eb Mon Sep 17 00:00:00 2001 From: morris Date: Thu, 16 Jan 2020 17:32:17 +0800 Subject: [PATCH] xtensa: add CPU overlay files for esp32s3 --- .../esp32s3/include/xtensa/config/core-isa.h | 671 ++++++++ .../include/xtensa/config/core-matmap.h | 318 ++++ .../esp32s3/include/xtensa/config/core.h | 1407 +++++++++++++++++ .../esp32s3/include/xtensa/config/defs.h | 38 + .../esp32s3/include/xtensa/config/extreg.h | 21 + .../esp32s3/include/xtensa/config/specreg.h | 119 ++ .../esp32s3/include/xtensa/config/system.h | 276 ++++ .../esp32s3/include/xtensa/config/tie-asm.h | 421 +++++ .../esp32s3/include/xtensa/config/tie.h | 200 +++ components/xtensa/esp32s3/libhal.a | Bin 0 -> 517178 bytes components/xtensa/esp32s3/trax_init.c | 40 + 11 files changed, 3511 insertions(+) create mode 100644 components/xtensa/esp32s3/include/xtensa/config/core-isa.h create mode 100644 components/xtensa/esp32s3/include/xtensa/config/core-matmap.h create mode 100644 components/xtensa/esp32s3/include/xtensa/config/core.h create mode 100644 components/xtensa/esp32s3/include/xtensa/config/defs.h create mode 100644 components/xtensa/esp32s3/include/xtensa/config/extreg.h create mode 100644 components/xtensa/esp32s3/include/xtensa/config/specreg.h create mode 100644 components/xtensa/esp32s3/include/xtensa/config/system.h create mode 100644 components/xtensa/esp32s3/include/xtensa/config/tie-asm.h create mode 100644 components/xtensa/esp32s3/include/xtensa/config/tie.h create mode 100644 components/xtensa/esp32s3/libhal.a create mode 100644 components/xtensa/esp32s3/trax_init.c diff --git a/components/xtensa/esp32s3/include/xtensa/config/core-isa.h b/components/xtensa/esp32s3/include/xtensa/config/core-isa.h new file mode 100644 index 0000000000..6b40a47fa5 --- /dev/null +++ b/components/xtensa/esp32s3/include/xtensa/config/core-isa.h @@ -0,0 +1,671 @@ +/* + * xtensa/config/core-isa.h -- HAL definitions that are dependent on Xtensa + * processor CORE configuration + * + * See , which includes this file, for more details. + */ + +/* Xtensa processor core configuration information. + + Copyright (c) 1999-2020 Tensilica Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#ifndef _XTENSA_CORE_CONFIGURATION_H +#define _XTENSA_CORE_CONFIGURATION_H + + +/**************************************************************************** + Parameters Useful for Any Code, USER or PRIVILEGED + ****************************************************************************/ + +/* + * Note: Macros of the form XCHAL_HAVE_*** have a value of 1 if the option is + * configured, and a value of 0 otherwise. These macros are always defined. + */ + + +/*---------------------------------------------------------------------- + ISA + ----------------------------------------------------------------------*/ + +#define XCHAL_HAVE_BE 0 /* big-endian byte ordering */ +#define XCHAL_HAVE_WINDOWED 1 /* windowed registers option */ +#define XCHAL_NUM_AREGS 64 /* num of physical addr regs */ +#define XCHAL_NUM_AREGS_LOG2 6 /* log2(XCHAL_NUM_AREGS) */ +#define XCHAL_MAX_INSTRUCTION_SIZE 4 /* max instr bytes (3..8) */ +#define XCHAL_HAVE_DEBUG 1 /* debug option */ +#define XCHAL_HAVE_DENSITY 1 /* 16-bit instructions */ +#define XCHAL_HAVE_LOOPS 1 /* zero-overhead loops */ +#define XCHAL_LOOP_BUFFER_SIZE 256 /* zero-ov. loop instr buffer size */ +#define XCHAL_HAVE_NSA 1 /* NSA/NSAU instructions */ +#define XCHAL_HAVE_MINMAX 1 /* MIN/MAX instructions */ +#define XCHAL_HAVE_SEXT 1 /* SEXT instruction */ +#define XCHAL_HAVE_DEPBITS 0 /* DEPBITS instruction */ +#define XCHAL_HAVE_CLAMPS 1 /* CLAMPS instruction */ +#define XCHAL_HAVE_MUL16 1 /* MUL16S/MUL16U instructions */ +#define XCHAL_HAVE_MUL32 1 /* MULL instruction */ +#define XCHAL_HAVE_MUL32_HIGH 1 /* MULUH/MULSH instructions */ +#define XCHAL_HAVE_DIV32 1 /* QUOS/QUOU/REMS/REMU instructions */ +#define XCHAL_HAVE_L32R 1 /* L32R instruction */ +#define XCHAL_HAVE_ABSOLUTE_LITERALS 0 /* non-PC-rel (extended) L32R */ +#define XCHAL_HAVE_CONST16 0 /* CONST16 instruction */ +#define XCHAL_HAVE_ADDX 1 /* ADDX#/SUBX# instructions */ +#define XCHAL_HAVE_EXCLUSIVE 0 /* L32EX/S32EX instructions */ +#define XCHAL_HAVE_WIDE_BRANCHES 0 /* B*.W18 or B*.W15 instr's */ +#define XCHAL_HAVE_PREDICTED_BRANCHES 0 /* B[EQ/EQZ/NE/NEZ]T instr's */ +#define XCHAL_HAVE_CALL4AND12 1 /* (obsolete option) */ +#define XCHAL_HAVE_ABS 1 /* ABS instruction */ +/*#define XCHAL_HAVE_POPC 0*/ /* POPC instruction */ +/*#define XCHAL_HAVE_CRC 0*/ /* CRC instruction */ +#define XCHAL_HAVE_RELEASE_SYNC 1 /* L32AI/S32RI instructions */ +#define XCHAL_HAVE_S32C1I 1 /* S32C1I instruction */ +#define XCHAL_HAVE_SPECULATION 0 /* speculation */ +#define XCHAL_HAVE_FULL_RESET 1 /* all regs/state reset */ +#define XCHAL_NUM_CONTEXTS 1 /* */ +#define XCHAL_NUM_MISC_REGS 4 /* num of scratch regs (0..4) */ +#define XCHAL_HAVE_TAP_MASTER 0 /* JTAG TAP control instr's */ +#define XCHAL_HAVE_PRID 1 /* processor ID register */ +#define XCHAL_HAVE_EXTERN_REGS 1 /* WER/RER instructions */ +#define XCHAL_HAVE_MX 0 /* MX core (Tensilica internal) */ +#define XCHAL_HAVE_MP_INTERRUPTS 0 /* interrupt distributor port */ +#define XCHAL_HAVE_MP_RUNSTALL 0 /* core RunStall control port */ +#define XCHAL_HAVE_PSO 0 /* Power Shut-Off */ +#define XCHAL_HAVE_PSO_CDM 0 /* core/debug/mem pwr domains */ +#define XCHAL_HAVE_PSO_FULL_RETENTION 0 /* all regs preserved on PSO */ +#define XCHAL_HAVE_THREADPTR 1 /* THREADPTR register */ +#define XCHAL_HAVE_BOOLEANS 1 /* boolean registers */ +#define XCHAL_HAVE_CP 1 /* CPENABLE reg (coprocessor) */ +#define XCHAL_CP_MAXCFG 8 /* max allowed cp id plus one */ +#define XCHAL_HAVE_MAC16 1 /* MAC16 package */ + +#define XCHAL_HAVE_FUSION 0 /* Fusion*/ +#define XCHAL_HAVE_FUSION_FP 0 /* Fusion FP option */ +#define XCHAL_HAVE_FUSION_LOW_POWER 0 /* Fusion Low Power option */ +#define XCHAL_HAVE_FUSION_AES 0 /* Fusion BLE/Wifi AES-128 CCM option */ +#define XCHAL_HAVE_FUSION_CONVENC 0 /* Fusion Conv Encode option */ +#define XCHAL_HAVE_FUSION_LFSR_CRC 0 /* Fusion LFSR-CRC option */ +#define XCHAL_HAVE_FUSION_BITOPS 0 /* Fusion Bit Operations Support option */ +#define XCHAL_HAVE_FUSION_AVS 0 /* Fusion AVS option */ +#define XCHAL_HAVE_FUSION_16BIT_BASEBAND 0 /* Fusion 16-bit Baseband option */ +#define XCHAL_HAVE_FUSION_VITERBI 0 /* Fusion Viterbi option */ +#define XCHAL_HAVE_FUSION_SOFTDEMAP 0 /* Fusion Soft Bit Demap option */ +#define XCHAL_HAVE_HIFIPRO 0 /* HiFiPro Audio Engine pkg */ +#define XCHAL_HAVE_HIFI5 0 /* HiFi5 Audio Engine pkg */ +#define XCHAL_HAVE_HIFI5_NN_MAC 0 /* HiFi5 Audio Engine NN-MAC option */ +#define XCHAL_HAVE_HIFI5_VFPU 0 /* HiFi5 Audio Engine Single-Precision VFPU option */ +#define XCHAL_HAVE_HIFI5_HP_VFPU 0 /* HiFi5 Audio Engine Half-Precision VFPU option */ +#define XCHAL_HAVE_HIFI4 0 /* HiFi4 Audio Engine pkg */ +#define XCHAL_HAVE_HIFI4_VFPU 0 /* HiFi4 Audio Engine VFPU option */ +#define XCHAL_HAVE_HIFI3 0 /* HiFi3 Audio Engine pkg */ +#define XCHAL_HAVE_HIFI3_VFPU 0 /* HiFi3 Audio Engine VFPU option */ +#define XCHAL_HAVE_HIFI3Z 0 /* HiFi3Z Audio Engine pkg */ +#define XCHAL_HAVE_HIFI3Z_VFPU 0 /* HiFi3Z Audio Engine VFPU option */ +#define XCHAL_HAVE_HIFI2 0 /* HiFi2 Audio Engine pkg */ +#define XCHAL_HAVE_HIFI2EP 0 /* HiFi2EP */ +#define XCHAL_HAVE_HIFI_MINI 0 + + + +#define XCHAL_HAVE_VECTORFPU2005 0 /* vector floating-point pkg */ +#define XCHAL_HAVE_USER_DPFPU 0 /* user DP floating-point pkg */ +#define XCHAL_HAVE_USER_SPFPU 0 /* user SP floating-point pkg */ +#define XCHAL_HAVE_FP 1 /* single prec floating point */ +#define XCHAL_HAVE_FP_DIV 1 /* FP with DIV instructions */ +#define XCHAL_HAVE_FP_RECIP 1 /* FP with RECIP instructions */ +#define XCHAL_HAVE_FP_SQRT 1 /* FP with SQRT instructions */ +#define XCHAL_HAVE_FP_RSQRT 1 /* FP with RSQRT instructions */ +#define XCHAL_HAVE_DFP 0 /* double precision FP pkg */ +#define XCHAL_HAVE_DFP_DIV 0 /* DFP with DIV instructions */ +#define XCHAL_HAVE_DFP_RECIP 0 /* DFP with RECIP instructions*/ +#define XCHAL_HAVE_DFP_SQRT 0 /* DFP with SQRT instructions */ +#define XCHAL_HAVE_DFP_RSQRT 0 /* DFP with RSQRT instructions*/ +#define XCHAL_HAVE_DFP_ACCEL 0 /* double precision FP acceleration pkg */ +#define XCHAL_HAVE_DFP_accel XCHAL_HAVE_DFP_ACCEL /* for backward compatibility */ + +#define XCHAL_HAVE_DFPU_SINGLE_ONLY 1 /* DFPU Coprocessor, single precision only */ +#define XCHAL_HAVE_DFPU_SINGLE_DOUBLE 0 /* DFPU Coprocessor, single and double precision */ +#define XCHAL_HAVE_VECTRA1 0 /* Vectra I pkg */ +#define XCHAL_HAVE_VECTRALX 0 /* Vectra LX pkg */ + +#define XCHAL_HAVE_FUSIONG 0 /* FusionG */ +#define XCHAL_HAVE_FUSIONG3 0 /* FusionG3 */ +#define XCHAL_HAVE_FUSIONG6 0 /* FusionG6 */ +#define XCHAL_HAVE_FUSIONG_SP_VFPU 0 /* sp_vfpu option on FusionG */ +#define XCHAL_HAVE_FUSIONG_DP_VFPU 0 /* dp_vfpu option on FusionG */ +#define XCHAL_FUSIONG_SIMD32 0 /* simd32 for FusionG */ + +#define XCHAL_HAVE_PDX 0 /* PDX */ +#define XCHAL_PDX_SIMD32 0 /* simd32 for PDX */ +#define XCHAL_HAVE_PDX4 0 /* PDX4 */ +#define XCHAL_HAVE_PDX8 0 /* PDX8 */ +#define XCHAL_HAVE_PDX16 0 /* PDX16 */ + +#define XCHAL_HAVE_CONNXD2 0 /* ConnX D2 pkg */ +#define XCHAL_HAVE_CONNXD2_DUALLSFLIX 0 /* ConnX D2 & Dual LoadStore Flix */ +#define XCHAL_HAVE_BBE16 0 /* ConnX BBE16 pkg */ +#define XCHAL_HAVE_BBE16_RSQRT 0 /* BBE16 & vector recip sqrt */ +#define XCHAL_HAVE_BBE16_VECDIV 0 /* BBE16 & vector divide */ +#define XCHAL_HAVE_BBE16_DESPREAD 0 /* BBE16 & despread */ +#define XCHAL_HAVE_BBENEP 0 /* ConnX BBENEP pkgs */ +#define XCHAL_HAVE_BBENEP_SP_VFPU 0 /* sp_vfpu option on BBE-EP */ +#define XCHAL_HAVE_BSP3 0 /* ConnX BSP3 pkg */ +#define XCHAL_HAVE_BSP3_TRANSPOSE 0 /* BSP3 & transpose32x32 */ +#define XCHAL_HAVE_SSP16 0 /* ConnX SSP16 pkg */ +#define XCHAL_HAVE_SSP16_VITERBI 0 /* SSP16 & viterbi */ +#define XCHAL_HAVE_TURBO16 0 /* ConnX Turbo16 pkg */ +#define XCHAL_HAVE_BBP16 0 /* ConnX BBP16 pkg */ +#define XCHAL_HAVE_FLIX3 0 /* basic 3-way FLIX option */ +#define XCHAL_HAVE_GRIVPEP 0 /* General Release of IVPEP */ +#define XCHAL_HAVE_GRIVPEP_HISTOGRAM 0 /* Histogram option on GRIVPEP */ + +#define XCHAL_HAVE_VISION 0 /* Vision P5/P6 */ +#define XCHAL_VISION_SIMD16 0 /* simd16 for Vision P5/P6 */ +#define XCHAL_VISION_TYPE 0 /* Vision P5, P6, or P3 */ +#define XCHAL_VISION_QUAD_MAC_TYPE 0 /* quad_mac option on Vision P6 */ +#define XCHAL_HAVE_VISION_HISTOGRAM 0 /* histogram option on Vision P5/P6 */ +#define XCHAL_HAVE_VISION_SP_VFPU 0 /* sp_vfpu option on Vision P5/P6 */ +#define XCHAL_HAVE_VISION_HP_VFPU 0 /* hp_vfpu option on Vision P6 */ + +#define XCHAL_HAVE_VISIONC 0 /* Vision C */ + +/*---------------------------------------------------------------------- + MISC + ----------------------------------------------------------------------*/ + +#define XCHAL_NUM_LOADSTORE_UNITS 1 /* load/store units */ +#define XCHAL_NUM_WRITEBUFFER_ENTRIES 4 /* size of write buffer */ +#define XCHAL_INST_FETCH_WIDTH 4 /* instr-fetch width in bytes */ +#define XCHAL_DATA_WIDTH 16 /* data width in bytes */ +#define XCHAL_DATA_PIPE_DELAY 1 /* d-side pipeline delay (1 = 5-stage, 2 = 7-stage) */ +#define XCHAL_CLOCK_GATING_GLOBAL 1 /* global clock gating */ +#define XCHAL_CLOCK_GATING_FUNCUNIT 1 /* funct. unit clock gating */ +/* In T1050, applies to selected core load and store instructions (see ISA): */ +#define XCHAL_UNALIGNED_LOAD_EXCEPTION 0 /* unaligned loads cause exc. */ +#define XCHAL_UNALIGNED_STORE_EXCEPTION 0 /* unaligned stores cause exc.*/ +#define XCHAL_UNALIGNED_LOAD_HW 1 /* unaligned loads work in hw */ +#define XCHAL_UNALIGNED_STORE_HW 1 /* unaligned stores work in hw*/ + +#define XCHAL_SW_VERSION 1200012 /* sw version of this header */ + +#define XCHAL_CORE_ID "LX7_ESP32_S3" /* alphanum core name (CoreID) set in the Xtensa Processor Generator */ + +#define XCHAL_BUILD_UNIQUE_ID 0x00088EF1 /* 22-bit sw build ID */ + +/* + * These definitions describe the hardware targeted by this software. + */ +#define XCHAL_HW_CONFIGID0 0xC2F0FFFE /* ConfigID hi 32 bits*/ +#define XCHAL_HW_CONFIGID1 0x23088EF1 /* ConfigID lo 32 bits*/ +#define XCHAL_HW_VERSION_NAME "LX7.0.12" /* full version name */ +#define XCHAL_HW_VERSION_MAJOR 2700 /* major ver# of targeted hw */ +#define XCHAL_HW_VERSION_MINOR 12 /* minor ver# of targeted hw */ +#define XCHAL_HW_VERSION 270012 /* major*100+minor */ +#define XCHAL_HW_REL_LX7 1 +#define XCHAL_HW_REL_LX7_0 1 +#define XCHAL_HW_REL_LX7_0_12 1 +#define XCHAL_HW_CONFIGID_RELIABLE 1 +/* If software targets a *range* of hardware versions, these are the bounds: */ +#define XCHAL_HW_MIN_VERSION_MAJOR 2700 /* major v of earliest tgt hw */ +#define XCHAL_HW_MIN_VERSION_MINOR 12 /* minor v of earliest tgt hw */ +#define XCHAL_HW_MIN_VERSION 270012 /* earliest targeted hw */ +#define XCHAL_HW_MAX_VERSION_MAJOR 2700 /* major v of latest tgt hw */ +#define XCHAL_HW_MAX_VERSION_MINOR 12 /* minor v of latest tgt hw */ +#define XCHAL_HW_MAX_VERSION 270012 /* latest targeted hw */ + + +/*---------------------------------------------------------------------- + CACHE + ----------------------------------------------------------------------*/ + +#define XCHAL_ICACHE_LINESIZE 4 /* I-cache line size in bytes */ +#define XCHAL_DCACHE_LINESIZE 16 /* D-cache line size in bytes */ +#define XCHAL_ICACHE_LINEWIDTH 2 /* log2(I line size in bytes) */ +#define XCHAL_DCACHE_LINEWIDTH 4 /* log2(D line size in bytes) */ + +#define XCHAL_ICACHE_SIZE 0 /* I-cache size in bytes or 0 */ +#define XCHAL_DCACHE_SIZE 0 /* D-cache size in bytes or 0 */ + +#define XCHAL_DCACHE_IS_WRITEBACK 0 /* writeback feature */ +#define XCHAL_DCACHE_IS_COHERENT 0 /* MP coherence feature */ + +#define XCHAL_HAVE_PREFETCH 0 /* PREFCTL register */ +#define XCHAL_HAVE_PREFETCH_L1 0 /* prefetch to L1 dcache */ +#define XCHAL_PREFETCH_CASTOUT_LINES 0 /* dcache pref. castout bufsz */ +#define XCHAL_PREFETCH_ENTRIES 0 /* cache prefetch entries */ +#define XCHAL_PREFETCH_BLOCK_ENTRIES 0 /* prefetch block streams */ +#define XCHAL_HAVE_CACHE_BLOCKOPS 0 /* block prefetch for caches */ +#define XCHAL_HAVE_ICACHE_TEST 0 /* Icache test instructions */ +#define XCHAL_HAVE_DCACHE_TEST 0 /* Dcache test instructions */ +#define XCHAL_HAVE_ICACHE_DYN_WAYS 0 /* Icache dynamic way support */ +#define XCHAL_HAVE_DCACHE_DYN_WAYS 0 /* Dcache dynamic way support */ + + + + +/**************************************************************************** + Parameters Useful for PRIVILEGED (Supervisory or Non-Virtualized) Code + ****************************************************************************/ + + +#ifndef XTENSA_HAL_NON_PRIVILEGED_ONLY + +/*---------------------------------------------------------------------- + CACHE + ----------------------------------------------------------------------*/ + +#define XCHAL_HAVE_PIF 1 /* any outbound bus present */ + +#define XCHAL_HAVE_AXI 0 /* AXI bus */ +#define XCHAL_HAVE_AXI_ECC 0 /* ECC on AXI bus */ +#define XCHAL_HAVE_ACELITE 0 /* ACELite bus */ + +#define XCHAL_HAVE_PIF_WR_RESP 0 /* pif write response */ +#define XCHAL_HAVE_PIF_REQ_ATTR 1 /* pif attribute */ + +/* If present, cache size in bytes == (ways * 2^(linewidth + setwidth)). */ + +/* Number of cache sets in log2(lines per way): */ +#define XCHAL_ICACHE_SETWIDTH 0 +#define XCHAL_DCACHE_SETWIDTH 0 + +/* Cache set associativity (number of ways): */ +#define XCHAL_ICACHE_WAYS 1 +#define XCHAL_DCACHE_WAYS 1 + +/* Cache features: */ +#define XCHAL_ICACHE_LINE_LOCKABLE 0 +#define XCHAL_DCACHE_LINE_LOCKABLE 0 +#define XCHAL_ICACHE_ECC_PARITY 0 +#define XCHAL_DCACHE_ECC_PARITY 0 +#define XCHAL_ICACHE_ECC_WIDTH 1 +#define XCHAL_DCACHE_ECC_WIDTH 1 + +/* Cache access size in bytes (affects operation of SICW instruction): */ +#define XCHAL_ICACHE_ACCESS_SIZE 1 +#define XCHAL_DCACHE_ACCESS_SIZE 1 + +#define XCHAL_DCACHE_BANKS 0 /* number of banks */ + +/* Number of encoded cache attr bits (see for decoded bits): */ +#define XCHAL_CA_BITS 4 + + +/*---------------------------------------------------------------------- + INTERNAL I/D RAM/ROMs and XLMI + ----------------------------------------------------------------------*/ +#define XCHAL_NUM_INSTROM 0 /* number of core instr. ROMs */ +#define XCHAL_NUM_INSTRAM 1 /* number of core instr. RAMs */ +#define XCHAL_NUM_DATAROM 0 /* number of core data ROMs */ +#define XCHAL_NUM_DATARAM 1 /* number of core data RAMs */ +#define XCHAL_NUM_URAM 0 /* number of core unified RAMs*/ +#define XCHAL_NUM_XLMI 0 /* number of core XLMI ports */ + +/* Instruction RAM 0: */ +#define XCHAL_INSTRAM0_VADDR 0x40000000 /* virtual address */ +#define XCHAL_INSTRAM0_PADDR 0x40000000 /* physical address */ +#define XCHAL_INSTRAM0_SIZE 67108864 /* size in bytes */ +#define XCHAL_INSTRAM0_ECC_PARITY 0 /* ECC/parity type, 0=none */ +#define XCHAL_HAVE_INSTRAM0 1 +#define XCHAL_INSTRAM0_HAVE_IDMA 0 /* idma supported by this local memory */ + +/* Data RAM 0: */ +#define XCHAL_DATARAM0_VADDR 0x3C000000 /* virtual address */ +#define XCHAL_DATARAM0_PADDR 0x3C000000 /* physical address */ +#define XCHAL_DATARAM0_SIZE 67108864 /* size in bytes */ +#define XCHAL_DATARAM0_ECC_PARITY 0 /* ECC/parity type, 0=none */ +#define XCHAL_DATARAM0_BANKS 1 /* number of banks */ +#define XCHAL_HAVE_DATARAM0 1 +#define XCHAL_DATARAM0_HAVE_IDMA 0 /* idma supported by this local memory */ + +#define XCHAL_HAVE_IDMA 0 +#define XCHAL_HAVE_IDMA_TRANSPOSE 0 + +#define XCHAL_HAVE_IMEM_LOADSTORE 1 /* can load/store to IROM/IRAM*/ + + +/*---------------------------------------------------------------------- + INTERRUPTS and TIMERS + ----------------------------------------------------------------------*/ + +#define XCHAL_HAVE_INTERRUPTS 1 /* interrupt option */ +#define XCHAL_HAVE_HIGHPRI_INTERRUPTS 1 /* med/high-pri. interrupts */ +#define XCHAL_HAVE_NMI 1 /* non-maskable interrupt */ +#define XCHAL_HAVE_CCOUNT 1 /* CCOUNT reg. (timer option) */ +#define XCHAL_NUM_TIMERS 3 /* number of CCOMPAREn regs */ +#define XCHAL_NUM_INTERRUPTS 32 /* number of interrupts */ +#define XCHAL_NUM_INTERRUPTS_LOG2 5 /* ceil(log2(NUM_INTERRUPTS)) */ +#define XCHAL_NUM_EXTINTERRUPTS 26 /* num of external interrupts */ +#define XCHAL_NUM_INTLEVELS 6 /* number of interrupt levels (not including level zero) */ +#define XCHAL_EXCM_LEVEL 3 /* level masked by PS.EXCM */ +/* (always 1 in XEA1; levels 2 .. EXCM_LEVEL are "medium priority") */ + +/* Masks of interrupts at each interrupt level: */ +#define XCHAL_INTLEVEL1_MASK 0x000637FF +#define XCHAL_INTLEVEL2_MASK 0x00380000 +#define XCHAL_INTLEVEL3_MASK 0x28C08800 +#define XCHAL_INTLEVEL4_MASK 0x53000000 +#define XCHAL_INTLEVEL5_MASK 0x84010000 +#define XCHAL_INTLEVEL6_MASK 0x00000000 +#define XCHAL_INTLEVEL7_MASK 0x00004000 + +/* Masks of interrupts at each range 1..n of interrupt levels: */ +#define XCHAL_INTLEVEL1_ANDBELOW_MASK 0x000637FF +#define XCHAL_INTLEVEL2_ANDBELOW_MASK 0x003E37FF +#define XCHAL_INTLEVEL3_ANDBELOW_MASK 0x28FEBFFF +#define XCHAL_INTLEVEL4_ANDBELOW_MASK 0x7BFEBFFF +#define XCHAL_INTLEVEL5_ANDBELOW_MASK 0xFFFFBFFF +#define XCHAL_INTLEVEL6_ANDBELOW_MASK 0xFFFFBFFF +#define XCHAL_INTLEVEL7_ANDBELOW_MASK 0xFFFFFFFF + +/* Level of each interrupt: */ +#define XCHAL_INT0_LEVEL 1 +#define XCHAL_INT1_LEVEL 1 +#define XCHAL_INT2_LEVEL 1 +#define XCHAL_INT3_LEVEL 1 +#define XCHAL_INT4_LEVEL 1 +#define XCHAL_INT5_LEVEL 1 +#define XCHAL_INT6_LEVEL 1 +#define XCHAL_INT7_LEVEL 1 +#define XCHAL_INT8_LEVEL 1 +#define XCHAL_INT9_LEVEL 1 +#define XCHAL_INT10_LEVEL 1 +#define XCHAL_INT11_LEVEL 3 +#define XCHAL_INT12_LEVEL 1 +#define XCHAL_INT13_LEVEL 1 +#define XCHAL_INT14_LEVEL 7 +#define XCHAL_INT15_LEVEL 3 +#define XCHAL_INT16_LEVEL 5 +#define XCHAL_INT17_LEVEL 1 +#define XCHAL_INT18_LEVEL 1 +#define XCHAL_INT19_LEVEL 2 +#define XCHAL_INT20_LEVEL 2 +#define XCHAL_INT21_LEVEL 2 +#define XCHAL_INT22_LEVEL 3 +#define XCHAL_INT23_LEVEL 3 +#define XCHAL_INT24_LEVEL 4 +#define XCHAL_INT25_LEVEL 4 +#define XCHAL_INT26_LEVEL 5 +#define XCHAL_INT27_LEVEL 3 +#define XCHAL_INT28_LEVEL 4 +#define XCHAL_INT29_LEVEL 3 +#define XCHAL_INT30_LEVEL 4 +#define XCHAL_INT31_LEVEL 5 +#define XCHAL_DEBUGLEVEL 6 /* debug interrupt level */ +#define XCHAL_HAVE_DEBUG_EXTERN_INT 1 /* OCD external db interrupt */ +#define XCHAL_NMILEVEL 7 /* NMI "level" (for use with EXCSAVE/EPS/EPC_n, RFI n) */ + +/* Type of each interrupt: */ +#define XCHAL_INT0_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT1_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT2_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT3_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT4_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT5_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT6_TYPE XTHAL_INTTYPE_TIMER +#define XCHAL_INT7_TYPE XTHAL_INTTYPE_SOFTWARE +#define XCHAL_INT8_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT9_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT10_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT11_TYPE XTHAL_INTTYPE_PROFILING +#define XCHAL_INT12_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT13_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT14_TYPE XTHAL_INTTYPE_NMI +#define XCHAL_INT15_TYPE XTHAL_INTTYPE_TIMER +#define XCHAL_INT16_TYPE XTHAL_INTTYPE_TIMER +#define XCHAL_INT17_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT18_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT19_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT20_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT21_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT22_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT23_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT24_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT25_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT26_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT27_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT28_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT29_TYPE XTHAL_INTTYPE_SOFTWARE +#define XCHAL_INT30_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT31_TYPE XTHAL_INTTYPE_EXTERN_LEVEL + +/* Masks of interrupts for each type of interrupt: */ +#define XCHAL_INTTYPE_MASK_UNCONFIGURED 0x00000000 +#define XCHAL_INTTYPE_MASK_SOFTWARE 0x20000080 +#define XCHAL_INTTYPE_MASK_EXTERN_EDGE 0x50400400 +#define XCHAL_INTTYPE_MASK_EXTERN_LEVEL 0x8FBE333F +#define XCHAL_INTTYPE_MASK_TIMER 0x00018040 +#define XCHAL_INTTYPE_MASK_NMI 0x00004000 +#define XCHAL_INTTYPE_MASK_WRITE_ERROR 0x00000000 +#define XCHAL_INTTYPE_MASK_PROFILING 0x00000800 +#define XCHAL_INTTYPE_MASK_IDMA_DONE 0x00000000 +#define XCHAL_INTTYPE_MASK_IDMA_ERR 0x00000000 +#define XCHAL_INTTYPE_MASK_GS_ERR 0x00000000 + +/* Interrupt numbers assigned to specific interrupt sources: */ +#define XCHAL_TIMER0_INTERRUPT 6 /* CCOMPARE0 */ +#define XCHAL_TIMER1_INTERRUPT 15 /* CCOMPARE1 */ +#define XCHAL_TIMER2_INTERRUPT 16 /* CCOMPARE2 */ +#define XCHAL_TIMER3_INTERRUPT XTHAL_TIMER_UNCONFIGURED +#define XCHAL_NMI_INTERRUPT 14 /* non-maskable interrupt */ +#define XCHAL_PROFILING_INTERRUPT 11 + +/* Interrupt numbers for levels at which only one interrupt is configured: */ +#define XCHAL_INTLEVEL7_NUM 14 +/* (There are many interrupts each at level(s) 1, 2, 3, 4, 5.) */ + + +/* + * External interrupt mapping. + * These macros describe how Xtensa processor interrupt numbers + * (as numbered internally, eg. in INTERRUPT and INTENABLE registers) + * map to external BInterrupt pins, for those interrupts + * configured as external (level-triggered, edge-triggered, or NMI). + * See the Xtensa processor databook for more details. + */ + +/* Core interrupt numbers mapped to each EXTERNAL BInterrupt pin number: */ +#define XCHAL_EXTINT0_NUM 0 /* (intlevel 1) */ +#define XCHAL_EXTINT1_NUM 1 /* (intlevel 1) */ +#define XCHAL_EXTINT2_NUM 2 /* (intlevel 1) */ +#define XCHAL_EXTINT3_NUM 3 /* (intlevel 1) */ +#define XCHAL_EXTINT4_NUM 4 /* (intlevel 1) */ +#define XCHAL_EXTINT5_NUM 5 /* (intlevel 1) */ +#define XCHAL_EXTINT6_NUM 8 /* (intlevel 1) */ +#define XCHAL_EXTINT7_NUM 9 /* (intlevel 1) */ +#define XCHAL_EXTINT8_NUM 10 /* (intlevel 1) */ +#define XCHAL_EXTINT9_NUM 12 /* (intlevel 1) */ +#define XCHAL_EXTINT10_NUM 13 /* (intlevel 1) */ +#define XCHAL_EXTINT11_NUM 14 /* (intlevel 7) */ +#define XCHAL_EXTINT12_NUM 17 /* (intlevel 1) */ +#define XCHAL_EXTINT13_NUM 18 /* (intlevel 1) */ +#define XCHAL_EXTINT14_NUM 19 /* (intlevel 2) */ +#define XCHAL_EXTINT15_NUM 20 /* (intlevel 2) */ +#define XCHAL_EXTINT16_NUM 21 /* (intlevel 2) */ +#define XCHAL_EXTINT17_NUM 22 /* (intlevel 3) */ +#define XCHAL_EXTINT18_NUM 23 /* (intlevel 3) */ +#define XCHAL_EXTINT19_NUM 24 /* (intlevel 4) */ +#define XCHAL_EXTINT20_NUM 25 /* (intlevel 4) */ +#define XCHAL_EXTINT21_NUM 26 /* (intlevel 5) */ +#define XCHAL_EXTINT22_NUM 27 /* (intlevel 3) */ +#define XCHAL_EXTINT23_NUM 28 /* (intlevel 4) */ +#define XCHAL_EXTINT24_NUM 30 /* (intlevel 4) */ +#define XCHAL_EXTINT25_NUM 31 /* (intlevel 5) */ +/* EXTERNAL BInterrupt pin numbers mapped to each core interrupt number: */ +#define XCHAL_INT0_EXTNUM 0 /* (intlevel 1) */ +#define XCHAL_INT1_EXTNUM 1 /* (intlevel 1) */ +#define XCHAL_INT2_EXTNUM 2 /* (intlevel 1) */ +#define XCHAL_INT3_EXTNUM 3 /* (intlevel 1) */ +#define XCHAL_INT4_EXTNUM 4 /* (intlevel 1) */ +#define XCHAL_INT5_EXTNUM 5 /* (intlevel 1) */ +#define XCHAL_INT8_EXTNUM 6 /* (intlevel 1) */ +#define XCHAL_INT9_EXTNUM 7 /* (intlevel 1) */ +#define XCHAL_INT10_EXTNUM 8 /* (intlevel 1) */ +#define XCHAL_INT12_EXTNUM 9 /* (intlevel 1) */ +#define XCHAL_INT13_EXTNUM 10 /* (intlevel 1) */ +#define XCHAL_INT14_EXTNUM 11 /* (intlevel 7) */ +#define XCHAL_INT17_EXTNUM 12 /* (intlevel 1) */ +#define XCHAL_INT18_EXTNUM 13 /* (intlevel 1) */ +#define XCHAL_INT19_EXTNUM 14 /* (intlevel 2) */ +#define XCHAL_INT20_EXTNUM 15 /* (intlevel 2) */ +#define XCHAL_INT21_EXTNUM 16 /* (intlevel 2) */ +#define XCHAL_INT22_EXTNUM 17 /* (intlevel 3) */ +#define XCHAL_INT23_EXTNUM 18 /* (intlevel 3) */ +#define XCHAL_INT24_EXTNUM 19 /* (intlevel 4) */ +#define XCHAL_INT25_EXTNUM 20 /* (intlevel 4) */ +#define XCHAL_INT26_EXTNUM 21 /* (intlevel 5) */ +#define XCHAL_INT27_EXTNUM 22 /* (intlevel 3) */ +#define XCHAL_INT28_EXTNUM 23 /* (intlevel 4) */ +#define XCHAL_INT30_EXTNUM 24 /* (intlevel 4) */ +#define XCHAL_INT31_EXTNUM 25 /* (intlevel 5) */ + + +/*---------------------------------------------------------------------- + EXCEPTIONS and VECTORS + ----------------------------------------------------------------------*/ + +#define XCHAL_XEA_VERSION 2 /* Xtensa Exception Architecture number: 1 == XEA1 (old) 2 == XEA2 (new) 0 == XEAX (extern) or TX */ +#define XCHAL_HAVE_XEA1 0 /* Exception Architecture 1 */ +#define XCHAL_HAVE_XEA2 1 /* Exception Architecture 2 */ +#define XCHAL_HAVE_XEAX 0 /* External Exception Arch. */ +#define XCHAL_HAVE_EXCEPTIONS 1 /* exception option */ +#define XCHAL_HAVE_HALT 0 /* halt architecture option */ +#define XCHAL_HAVE_BOOTLOADER 0 /* boot loader (for TX) */ +#define XCHAL_HAVE_MEM_ECC_PARITY 0 /* local memory ECC/parity */ +#define XCHAL_HAVE_VECTOR_SELECT 1 /* relocatable vectors */ +#define XCHAL_HAVE_VECBASE 1 /* relocatable vectors */ +#define XCHAL_VECBASE_RESET_VADDR 0x40000000 /* VECBASE reset value */ +#define XCHAL_VECBASE_RESET_PADDR 0x40000000 +#define XCHAL_RESET_VECBASE_OVERLAP 0 + +#define XCHAL_RESET_VECTOR0_VADDR 0x50000000 +#define XCHAL_RESET_VECTOR0_PADDR 0x50000000 +#define XCHAL_RESET_VECTOR1_VADDR 0x40000400 +#define XCHAL_RESET_VECTOR1_PADDR 0x40000400 +#define XCHAL_RESET_VECTOR_VADDR 0x40000400 +#define XCHAL_RESET_VECTOR_PADDR 0x40000400 +#define XCHAL_USER_VECOFS 0x00000340 +#define XCHAL_USER_VECTOR_VADDR 0x40000340 +#define XCHAL_USER_VECTOR_PADDR 0x40000340 +#define XCHAL_KERNEL_VECOFS 0x00000300 +#define XCHAL_KERNEL_VECTOR_VADDR 0x40000300 +#define XCHAL_KERNEL_VECTOR_PADDR 0x40000300 +#define XCHAL_DOUBLEEXC_VECOFS 0x000003C0 +#define XCHAL_DOUBLEEXC_VECTOR_VADDR 0x400003C0 +#define XCHAL_DOUBLEEXC_VECTOR_PADDR 0x400003C0 +#define XCHAL_WINDOW_OF4_VECOFS 0x00000000 +#define XCHAL_WINDOW_UF4_VECOFS 0x00000040 +#define XCHAL_WINDOW_OF8_VECOFS 0x00000080 +#define XCHAL_WINDOW_UF8_VECOFS 0x000000C0 +#define XCHAL_WINDOW_OF12_VECOFS 0x00000100 +#define XCHAL_WINDOW_UF12_VECOFS 0x00000140 +#define XCHAL_WINDOW_VECTORS_VADDR 0x40000000 +#define XCHAL_WINDOW_VECTORS_PADDR 0x40000000 +#define XCHAL_INTLEVEL2_VECOFS 0x00000180 +#define XCHAL_INTLEVEL2_VECTOR_VADDR 0x40000180 +#define XCHAL_INTLEVEL2_VECTOR_PADDR 0x40000180 +#define XCHAL_INTLEVEL3_VECOFS 0x000001C0 +#define XCHAL_INTLEVEL3_VECTOR_VADDR 0x400001C0 +#define XCHAL_INTLEVEL3_VECTOR_PADDR 0x400001C0 +#define XCHAL_INTLEVEL4_VECOFS 0x00000200 +#define XCHAL_INTLEVEL4_VECTOR_VADDR 0x40000200 +#define XCHAL_INTLEVEL4_VECTOR_PADDR 0x40000200 +#define XCHAL_INTLEVEL5_VECOFS 0x00000240 +#define XCHAL_INTLEVEL5_VECTOR_VADDR 0x40000240 +#define XCHAL_INTLEVEL5_VECTOR_PADDR 0x40000240 +#define XCHAL_INTLEVEL6_VECOFS 0x00000280 +#define XCHAL_INTLEVEL6_VECTOR_VADDR 0x40000280 +#define XCHAL_INTLEVEL6_VECTOR_PADDR 0x40000280 +#define XCHAL_DEBUG_VECOFS XCHAL_INTLEVEL6_VECOFS +#define XCHAL_DEBUG_VECTOR_VADDR XCHAL_INTLEVEL6_VECTOR_VADDR +#define XCHAL_DEBUG_VECTOR_PADDR XCHAL_INTLEVEL6_VECTOR_PADDR +#define XCHAL_NMI_VECOFS 0x000002C0 +#define XCHAL_NMI_VECTOR_VADDR 0x400002C0 +#define XCHAL_NMI_VECTOR_PADDR 0x400002C0 +#define XCHAL_INTLEVEL7_VECOFS XCHAL_NMI_VECOFS +#define XCHAL_INTLEVEL7_VECTOR_VADDR XCHAL_NMI_VECTOR_VADDR +#define XCHAL_INTLEVEL7_VECTOR_PADDR XCHAL_NMI_VECTOR_PADDR + + +/*---------------------------------------------------------------------- + DEBUG MODULE + ----------------------------------------------------------------------*/ + +/* Misc */ +#define XCHAL_HAVE_DEBUG_ERI 1 /* ERI to debug module */ +#define XCHAL_HAVE_DEBUG_APB 0 /* APB to debug module */ +#define XCHAL_HAVE_DEBUG_JTAG 1 /* JTAG to debug module */ + +/* On-Chip Debug (OCD) */ +#define XCHAL_HAVE_OCD 1 /* OnChipDebug option */ +#define XCHAL_NUM_IBREAK 2 /* number of IBREAKn regs */ +#define XCHAL_NUM_DBREAK 2 /* number of DBREAKn regs */ +#define XCHAL_HAVE_OCD_DIR_ARRAY 0 /* faster OCD option (to LX4) */ +#define XCHAL_HAVE_OCD_LS32DDR 1 /* L32DDR/S32DDR (faster OCD) */ + +/* TRAX (in core) */ +#define XCHAL_HAVE_TRAX 1 /* TRAX in debug module */ +#define XCHAL_TRAX_MEM_SIZE 16384 /* TRAX memory size in bytes */ +#define XCHAL_TRAX_MEM_SHAREABLE 1 /* start/end regs; ready sig. */ +#define XCHAL_TRAX_ATB_WIDTH 0 /* ATB width (bits), 0=no ATB */ +#define XCHAL_TRAX_TIME_WIDTH 0 /* timestamp bitwidth, 0=none */ + +/* Perf counters */ +#define XCHAL_NUM_PERF_COUNTERS 2 /* performance counters */ + + +/*---------------------------------------------------------------------- + MMU + ----------------------------------------------------------------------*/ + +/* See core-matmap.h header file for more details. */ + +#define XCHAL_HAVE_TLBS 1 /* inverse of HAVE_CACHEATTR */ +#define XCHAL_HAVE_SPANNING_WAY 1 /* one way maps I+D 4GB vaddr */ +#define XCHAL_SPANNING_WAY 0 /* TLB spanning way number */ +#define XCHAL_HAVE_IDENTITY_MAP 1 /* vaddr == paddr always */ +#define XCHAL_HAVE_CACHEATTR 0 /* CACHEATTR register present */ +#define XCHAL_HAVE_MIMIC_CACHEATTR 1 /* region protection */ +#define XCHAL_HAVE_XLT_CACHEATTR 0 /* region prot. w/translation */ +#define XCHAL_HAVE_PTP_MMU 0 /* full MMU (with page table [autorefill] and protection) usable for an MMU-based OS */ + +/* If none of the above last 5 are set, it's a custom TLB configuration. */ + +#define XCHAL_MMU_ASID_BITS 0 /* number of bits in ASIDs */ +#define XCHAL_MMU_RINGS 1 /* number of rings (1..4) */ +#define XCHAL_MMU_RING_BITS 0 /* num of bits in RING field */ + +/*---------------------------------------------------------------------- + MPU + ----------------------------------------------------------------------*/ +#define XCHAL_HAVE_MPU 0 +#define XCHAL_MPU_ENTRIES 0 + +#define XCHAL_MPU_ALIGN_REQ 1 /* MPU requires alignment of entries to background map */ +#define XCHAL_MPU_BACKGROUND_ENTRIES 0 /* number of entries in bg map*/ +#define XCHAL_MPU_BG_CACHEADRDIS 0 /* default CACHEADRDIS for bg */ + +#define XCHAL_MPU_ALIGN_BITS 0 +#define XCHAL_MPU_ALIGN 0 + +#endif /* !XTENSA_HAL_NON_PRIVILEGED_ONLY */ + + +#endif /* _XTENSA_CORE_CONFIGURATION_H */ diff --git a/components/xtensa/esp32s3/include/xtensa/config/core-matmap.h b/components/xtensa/esp32s3/include/xtensa/config/core-matmap.h new file mode 100644 index 0000000000..d6dacf95bb --- /dev/null +++ b/components/xtensa/esp32s3/include/xtensa/config/core-matmap.h @@ -0,0 +1,318 @@ +/* + * xtensa/config/core-matmap.h -- Memory access and translation mapping + * parameters (CHAL) of the Xtensa processor core configuration. + * + * If you are using Xtensa Tools, see (which includes + * this file) for more details. + * + * In the Xtensa processor products released to date, all parameters + * defined in this file are derivable (at least in theory) from + * information contained in the core-isa.h header file. + * In particular, the following core configuration parameters are relevant: + * XCHAL_HAVE_CACHEATTR + * XCHAL_HAVE_MIMIC_CACHEATTR + * XCHAL_HAVE_XLT_CACHEATTR + * XCHAL_HAVE_PTP_MMU + * XCHAL_ITLB_ARF_ENTRIES_LOG2 + * XCHAL_DTLB_ARF_ENTRIES_LOG2 + * XCHAL_DCACHE_IS_WRITEBACK + * XCHAL_ICACHE_SIZE (presence of I-cache) + * XCHAL_DCACHE_SIZE (presence of D-cache) + * XCHAL_HW_VERSION_MAJOR + * XCHAL_HW_VERSION_MINOR + */ + +/* Customer ID=15127; Build=0x86d67; Copyright (c) 1999-2020 Tensilica Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + + +#ifndef XTENSA_CONFIG_CORE_MATMAP_H +#define XTENSA_CONFIG_CORE_MATMAP_H + + +/*---------------------------------------------------------------------- + CACHE (MEMORY ACCESS) ATTRIBUTES + ----------------------------------------------------------------------*/ + + + +/* Cache Attribute encodings -- lists of access modes for each cache attribute: */ +#define XCHAL_FCA_LIST XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_BYPASS XCHAL_SEP \ + XTHAL_FAM_BYPASS XCHAL_SEP \ + XTHAL_FAM_BYPASS XCHAL_SEP \ + XTHAL_FAM_BYPASS XCHAL_SEP \ + XTHAL_FAM_BYPASS XCHAL_SEP \ + XTHAL_FAM_BYPASS XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION +#define XCHAL_LCA_LIST XTHAL_LAM_BYPASSG XCHAL_SEP \ + XTHAL_LAM_BYPASSG XCHAL_SEP \ + XTHAL_LAM_BYPASSG XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_BYPASSG XCHAL_SEP \ + XTHAL_LAM_BYPASSG XCHAL_SEP \ + XTHAL_LAM_BYPASSG XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_EXCEPTION +#define XCHAL_SCA_LIST XTHAL_SAM_BYPASS XCHAL_SEP \ + XTHAL_SAM_BYPASS XCHAL_SEP \ + XTHAL_SAM_BYPASS XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_BYPASS XCHAL_SEP \ + XTHAL_SAM_BYPASS XCHAL_SEP \ + XTHAL_SAM_BYPASS XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_EXCEPTION + +#define XCHAL_CA_R (0xC0 | 0x40000000) +#define XCHAL_CA_RX (0xD0 | 0x40000000) +#define XCHAL_CA_RW (0xE0 | 0x40000000) +#define XCHAL_CA_RWX (0xF0 | 0x40000000) + +/* + * Specific encoded cache attribute values of general interest. + * If a specific cache mode is not available, the closest available + * one is returned instead (eg. writethru instead of writeback, + * bypass instead of writethru). + */ +#define XCHAL_CA_BYPASS 2 /* cache disabled (bypassed) mode */ +#define XCHAL_CA_BYPASSBUF 6 /* cache disabled (bypassed) bufferable mode */ +#define XCHAL_CA_WRITETHRU 1 /* cache enabled (write-through) mode */ +#define XCHAL_CA_WRITEBACK 2 /* cache enabled (write-back) mode */ +#define XCHAL_HAVE_CA_WRITEBACK_NOALLOC 0 /* write-back no-allocate availability */ +#define XCHAL_CA_WRITEBACK_NOALLOC 2 /* cache enabled (write-back no-allocate) mode */ +#define XCHAL_CA_BYPASS_RW 0 /* cache disabled (bypassed) mode (no exec) */ +#define XCHAL_CA_WRITETHRU_RW 0 /* cache enabled (write-through) mode (no exec) (FALLBACK) */ +#define XCHAL_CA_WRITEBACK_RW 0 /* cache enabled (write-back) mode (no exec) */ +#define XCHAL_CA_WRITEBACK_NOALLOC_RW 0 /* cache enabled (write-back no-allocate) mode (no exec) */ +#define XCHAL_CA_ILLEGAL 15 /* no access allowed (all cause exceptions) mode */ +#define XCHAL_CA_ISOLATE 0 /* cache isolate (accesses go to cache not memory) mode */ + +/*---------------------------------------------------------------------- + MMU + ----------------------------------------------------------------------*/ + +/* + * General notes on MMU parameters. + * + * Terminology: + * ASID = address-space ID (acts as an "extension" of virtual addresses) + * VPN = virtual page number + * PPN = physical page number + * CA = encoded cache attribute (access modes) + * TLB = translation look-aside buffer (term is stretched somewhat here) + * I = instruction (fetch accesses) + * D = data (load and store accesses) + * way = each TLB (ITLB and DTLB) consists of a number of "ways" + * that simultaneously match the virtual address of an access; + * a TLB successfully translates a virtual address if exactly + * one way matches the vaddr; if none match, it is a miss; + * if multiple match, one gets a "multihit" exception; + * each way can be independently configured in terms of number of + * entries, page sizes, which fields are writable or constant, etc. + * set = group of contiguous ways with exactly identical parameters + * ARF = auto-refill; hardware services a 1st-level miss by loading a PTE + * from the page table and storing it in one of the auto-refill ways; + * if this PTE load also misses, a miss exception is posted for s/w. + * min-wired = a "min-wired" way can be used to map a single (minimum-sized) + * page arbitrarily under program control; it has a single entry, + * is non-auto-refill (some other way(s) must be auto-refill), + * all its fields (VPN, PPN, ASID, CA) are all writable, and it + * supports the XCHAL_MMU_MIN_PTE_PAGE_SIZE page size (a current + * restriction is that this be the only page size it supports). + * + * TLB way entries are virtually indexed. + * TLB ways that support multiple page sizes: + * - must have all writable VPN and PPN fields; + * - can only use one page size at any given time (eg. setup at startup), + * selected by the respective ITLBCFG or DTLBCFG special register, + * whose bits n*4+3 .. n*4 index the list of page sizes for way n + * (XCHAL_xTLB_SETm_PAGESZ_LOG2_LIST for set m corresponding to way n); + * this list may be sparse for auto-refill ways because auto-refill + * ways have independent lists of supported page sizes sharing a + * common encoding with PTE entries; the encoding is the index into + * this list; unsupported sizes for a given way are zero in the list; + * selecting unsupported sizes results in undefine hardware behaviour; + * - is only possible for ways 0 thru 7 (due to ITLBCFG/DTLBCFG definition). + */ + +#define XCHAL_MMU_ASID_INVALID 0 /* ASID value indicating invalid address space */ +#define XCHAL_MMU_ASID_KERNEL 0 /* ASID value indicating kernel (ring 0) address space */ +#define XCHAL_MMU_SR_BITS 0 /* number of size-restriction bits supported */ +#define XCHAL_MMU_CA_BITS 4 /* number of bits needed to hold cache attribute encoding */ +#define XCHAL_MMU_MAX_PTE_PAGE_SIZE 29 /* max page size in a PTE structure (log2) */ +#define XCHAL_MMU_MIN_PTE_PAGE_SIZE 29 /* min page size in a PTE structure (log2) */ + + +/*** Instruction TLB: ***/ + +#define XCHAL_ITLB_WAY_BITS 0 /* number of bits holding the ways */ +#define XCHAL_ITLB_WAYS 1 /* number of ways (n-way set-associative TLB) */ +#define XCHAL_ITLB_ARF_WAYS 0 /* number of auto-refill ways */ +#define XCHAL_ITLB_SETS 1 /* number of sets (groups of ways with identical settings) */ + +/* Way set to which each way belongs: */ +#define XCHAL_ITLB_WAY0_SET 0 + +/* Ways sets that are used by hardware auto-refill (ARF): */ +#define XCHAL_ITLB_ARF_SETS 0 /* number of auto-refill sets */ + +/* Way sets that are "min-wired" (see terminology comment above): */ +#define XCHAL_ITLB_MINWIRED_SETS 0 /* number of "min-wired" sets */ + + +/* ITLB way set 0 (group of ways 0 thru 0): */ +#define XCHAL_ITLB_SET0_WAY 0 /* index of first way in this way set */ +#define XCHAL_ITLB_SET0_WAYS 1 /* number of (contiguous) ways in this way set */ +#define XCHAL_ITLB_SET0_ENTRIES_LOG2 3 /* log2(number of entries in this way) */ +#define XCHAL_ITLB_SET0_ENTRIES 8 /* number of entries in this way (always a power of 2) */ +#define XCHAL_ITLB_SET0_ARF 0 /* 1=autorefill by h/w, 0=non-autorefill (wired/constant/static) */ +#define XCHAL_ITLB_SET0_PAGESIZES 1 /* number of supported page sizes in this way */ +#define XCHAL_ITLB_SET0_PAGESZ_BITS 0 /* number of bits to encode the page size */ +#define XCHAL_ITLB_SET0_PAGESZ_LOG2_MIN 29 /* log2(minimum supported page size) */ +#define XCHAL_ITLB_SET0_PAGESZ_LOG2_MAX 29 /* log2(maximum supported page size) */ +#define XCHAL_ITLB_SET0_PAGESZ_LOG2_LIST 29 /* list of log2(page size)s, separated by XCHAL_SEP; + 2^PAGESZ_BITS entries in list, unsupported entries are zero */ +#define XCHAL_ITLB_SET0_ASID_CONSTMASK 0 /* constant ASID bits; 0 if all writable */ +#define XCHAL_ITLB_SET0_VPN_CONSTMASK 0x00000000 /* constant VPN bits, not including entry index bits; 0 if all writable */ +#define XCHAL_ITLB_SET0_PPN_CONSTMASK 0xE0000000 /* constant PPN bits, including entry index bits; 0 if all writable */ +#define XCHAL_ITLB_SET0_CA_CONSTMASK 0 /* constant CA bits; 0 if all writable */ +#define XCHAL_ITLB_SET0_ASID_RESET 0 /* 1 if ASID reset values defined (and all writable); 0 otherwise */ +#define XCHAL_ITLB_SET0_VPN_RESET 0 /* 1 if VPN reset values defined (and all writable); 0 otherwise */ +#define XCHAL_ITLB_SET0_PPN_RESET 0 /* 1 if PPN reset values defined (and all writable); 0 otherwise */ +#define XCHAL_ITLB_SET0_CA_RESET 1 /* 1 if CA reset values defined (and all writable); 0 otherwise */ +/* Constant VPN values for each entry of ITLB way set 0 (because VPN_CONSTMASK is non-zero): */ +#define XCHAL_ITLB_SET0_E0_VPN_CONST 0x00000000 +#define XCHAL_ITLB_SET0_E1_VPN_CONST 0x20000000 +#define XCHAL_ITLB_SET0_E2_VPN_CONST 0x40000000 +#define XCHAL_ITLB_SET0_E3_VPN_CONST 0x60000000 +#define XCHAL_ITLB_SET0_E4_VPN_CONST 0x80000000 +#define XCHAL_ITLB_SET0_E5_VPN_CONST 0xA0000000 +#define XCHAL_ITLB_SET0_E6_VPN_CONST 0xC0000000 +#define XCHAL_ITLB_SET0_E7_VPN_CONST 0xE0000000 +/* Constant PPN values for each entry of ITLB way set 0 (because PPN_CONSTMASK is non-zero): */ +#define XCHAL_ITLB_SET0_E0_PPN_CONST 0x00000000 +#define XCHAL_ITLB_SET0_E1_PPN_CONST 0x20000000 +#define XCHAL_ITLB_SET0_E2_PPN_CONST 0x40000000 +#define XCHAL_ITLB_SET0_E3_PPN_CONST 0x60000000 +#define XCHAL_ITLB_SET0_E4_PPN_CONST 0x80000000 +#define XCHAL_ITLB_SET0_E5_PPN_CONST 0xA0000000 +#define XCHAL_ITLB_SET0_E6_PPN_CONST 0xC0000000 +#define XCHAL_ITLB_SET0_E7_PPN_CONST 0xE0000000 +/* Reset CA values for each entry of ITLB way set 0 (because SET0_CA_RESET is non-zero): */ +#define XCHAL_ITLB_SET0_E0_CA_RESET 0x02 +#define XCHAL_ITLB_SET0_E1_CA_RESET 0x02 +#define XCHAL_ITLB_SET0_E2_CA_RESET 0x02 +#define XCHAL_ITLB_SET0_E3_CA_RESET 0x02 +#define XCHAL_ITLB_SET0_E4_CA_RESET 0x02 +#define XCHAL_ITLB_SET0_E5_CA_RESET 0x02 +#define XCHAL_ITLB_SET0_E6_CA_RESET 0x02 +#define XCHAL_ITLB_SET0_E7_CA_RESET 0x02 + + +/*** Data TLB: ***/ + +#define XCHAL_DTLB_WAY_BITS 0 /* number of bits holding the ways */ +#define XCHAL_DTLB_WAYS 1 /* number of ways (n-way set-associative TLB) */ +#define XCHAL_DTLB_ARF_WAYS 0 /* number of auto-refill ways */ +#define XCHAL_DTLB_SETS 1 /* number of sets (groups of ways with identical settings) */ + +/* Way set to which each way belongs: */ +#define XCHAL_DTLB_WAY0_SET 0 + +/* Ways sets that are used by hardware auto-refill (ARF): */ +#define XCHAL_DTLB_ARF_SETS 0 /* number of auto-refill sets */ + +/* Way sets that are "min-wired" (see terminology comment above): */ +#define XCHAL_DTLB_MINWIRED_SETS 0 /* number of "min-wired" sets */ + + +/* DTLB way set 0 (group of ways 0 thru 0): */ +#define XCHAL_DTLB_SET0_WAY 0 /* index of first way in this way set */ +#define XCHAL_DTLB_SET0_WAYS 1 /* number of (contiguous) ways in this way set */ +#define XCHAL_DTLB_SET0_ENTRIES_LOG2 3 /* log2(number of entries in this way) */ +#define XCHAL_DTLB_SET0_ENTRIES 8 /* number of entries in this way (always a power of 2) */ +#define XCHAL_DTLB_SET0_ARF 0 /* 1=autorefill by h/w, 0=non-autorefill (wired/constant/static) */ +#define XCHAL_DTLB_SET0_PAGESIZES 1 /* number of supported page sizes in this way */ +#define XCHAL_DTLB_SET0_PAGESZ_BITS 0 /* number of bits to encode the page size */ +#define XCHAL_DTLB_SET0_PAGESZ_LOG2_MIN 29 /* log2(minimum supported page size) */ +#define XCHAL_DTLB_SET0_PAGESZ_LOG2_MAX 29 /* log2(maximum supported page size) */ +#define XCHAL_DTLB_SET0_PAGESZ_LOG2_LIST 29 /* list of log2(page size)s, separated by XCHAL_SEP; + 2^PAGESZ_BITS entries in list, unsupported entries are zero */ +#define XCHAL_DTLB_SET0_ASID_CONSTMASK 0 /* constant ASID bits; 0 if all writable */ +#define XCHAL_DTLB_SET0_VPN_CONSTMASK 0x00000000 /* constant VPN bits, not including entry index bits; 0 if all writable */ +#define XCHAL_DTLB_SET0_PPN_CONSTMASK 0xE0000000 /* constant PPN bits, including entry index bits; 0 if all writable */ +#define XCHAL_DTLB_SET0_CA_CONSTMASK 0 /* constant CA bits; 0 if all writable */ +#define XCHAL_DTLB_SET0_ASID_RESET 0 /* 1 if ASID reset values defined (and all writable); 0 otherwise */ +#define XCHAL_DTLB_SET0_VPN_RESET 0 /* 1 if VPN reset values defined (and all writable); 0 otherwise */ +#define XCHAL_DTLB_SET0_PPN_RESET 0 /* 1 if PPN reset values defined (and all writable); 0 otherwise */ +#define XCHAL_DTLB_SET0_CA_RESET 1 /* 1 if CA reset values defined (and all writable); 0 otherwise */ +/* Constant VPN values for each entry of DTLB way set 0 (because VPN_CONSTMASK is non-zero): */ +#define XCHAL_DTLB_SET0_E0_VPN_CONST 0x00000000 +#define XCHAL_DTLB_SET0_E1_VPN_CONST 0x20000000 +#define XCHAL_DTLB_SET0_E2_VPN_CONST 0x40000000 +#define XCHAL_DTLB_SET0_E3_VPN_CONST 0x60000000 +#define XCHAL_DTLB_SET0_E4_VPN_CONST 0x80000000 +#define XCHAL_DTLB_SET0_E5_VPN_CONST 0xA0000000 +#define XCHAL_DTLB_SET0_E6_VPN_CONST 0xC0000000 +#define XCHAL_DTLB_SET0_E7_VPN_CONST 0xE0000000 +/* Constant PPN values for each entry of DTLB way set 0 (because PPN_CONSTMASK is non-zero): */ +#define XCHAL_DTLB_SET0_E0_PPN_CONST 0x00000000 +#define XCHAL_DTLB_SET0_E1_PPN_CONST 0x20000000 +#define XCHAL_DTLB_SET0_E2_PPN_CONST 0x40000000 +#define XCHAL_DTLB_SET0_E3_PPN_CONST 0x60000000 +#define XCHAL_DTLB_SET0_E4_PPN_CONST 0x80000000 +#define XCHAL_DTLB_SET0_E5_PPN_CONST 0xA0000000 +#define XCHAL_DTLB_SET0_E6_PPN_CONST 0xC0000000 +#define XCHAL_DTLB_SET0_E7_PPN_CONST 0xE0000000 +/* Reset CA values for each entry of DTLB way set 0 (because SET0_CA_RESET is non-zero): */ +#define XCHAL_DTLB_SET0_E0_CA_RESET 0x02 +#define XCHAL_DTLB_SET0_E1_CA_RESET 0x02 +#define XCHAL_DTLB_SET0_E2_CA_RESET 0x02 +#define XCHAL_DTLB_SET0_E3_CA_RESET 0x02 +#define XCHAL_DTLB_SET0_E4_CA_RESET 0x02 +#define XCHAL_DTLB_SET0_E5_CA_RESET 0x02 +#define XCHAL_DTLB_SET0_E6_CA_RESET 0x02 +#define XCHAL_DTLB_SET0_E7_CA_RESET 0x02 + +#endif /*XTENSA_CONFIG_CORE_MATMAP_H*/ diff --git a/components/xtensa/esp32s3/include/xtensa/config/core.h b/components/xtensa/esp32s3/include/xtensa/config/core.h new file mode 100644 index 0000000000..7979f0c4ad --- /dev/null +++ b/components/xtensa/esp32s3/include/xtensa/config/core.h @@ -0,0 +1,1407 @@ +/* + * xtensa/config/core.h -- HAL definitions dependent on CORE configuration + * + * This header file is sometimes referred to as the "compile-time HAL" or CHAL. + * It pulls definitions tailored for a specific Xtensa processor configuration. + * + * Sources for binaries meant to be configuration-independent generally avoid + * including this file (they may use the configuration-specific HAL library). + * It is normal for the HAL library source itself to include this file. + */ + +/* + * Copyright (c) 2005-2015 Cadence Design Systems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#ifndef XTENSA_CONFIG_CORE_H +#define XTENSA_CONFIG_CORE_H + +/* CONFIGURATION INDEPENDENT DEFINITIONS: */ +#ifdef __XTENSA__ +#include +#include +#else +#include "../hal.h" +#include "../xtensa-versions.h" +#endif + +/* CONFIGURATION SPECIFIC DEFINITIONS: */ +#ifdef __XTENSA__ +#include +#include +#include +#else +#include "core-isa.h" +#include "core-matmap.h" +#include "tie.h" +#endif + +#if defined (_ASMLANGUAGE) || defined (__ASSEMBLER__) +#ifdef __XTENSA__ +#include +#else +#include "tie-asm.h" +#endif +#endif /*_ASMLANGUAGE or __ASSEMBLER__*/ + + +/*---------------------------------------------------------------------- + GENERAL + ----------------------------------------------------------------------*/ + +/* + * Separators for macros that expand into arrays. + * These can be predefined by files that #include this one, + * when different separators are required. + */ +/* Element separator for macros that expand into 1-dimensional arrays: */ +#ifndef XCHAL_SEP +#define XCHAL_SEP , +#endif +/* Array separator for macros that expand into 2-dimensional arrays: */ +#ifndef XCHAL_SEP2 +#define XCHAL_SEP2 },{ +#endif + + +/*---------------------------------------------------------------------- + ERRATA + ----------------------------------------------------------------------*/ + +/* + * Erratum T1020.H13, T1030.H7, T1040.H10, T1050.H4 (fixed in T1040.3 and T1050.1; + * relevant only in XEA1, kernel-vector mode, level-one interrupts and overflows enabled): + */ +#define XCHAL_MAYHAVE_ERRATUM_XEA1KWIN (XCHAL_HAVE_XEA1 && \ + (XCHAL_HW_RELEASE_AT_OR_BELOW(1040,2) != 0 \ + || XCHAL_HW_RELEASE_AT(1050,0))) +/* + * Erratum 453 present in RE-2013.2 up to RF-2014.0, fixed in RF-2014.1. + * Applies to specific set of configuration options. + * Part of the workaround is to add ISYNC at certain points in the code. + * The workaround gated by this macro can be disabled if not needed, e.g. if + * zero-overhead loop buffer will be disabled, by defining _NO_ERRATUM_453. + */ +#if ( XCHAL_HW_MAX_VERSION >= XTENSA_HWVERSION_RE_2013_2 && \ + XCHAL_HW_MIN_VERSION <= XTENSA_HWVERSION_RF_2014_0 && \ + XCHAL_ICACHE_SIZE != 0 && XCHAL_HAVE_PIF /*covers also AXI/AHB*/ && \ + XCHAL_HAVE_LOOPS && XCHAL_LOOP_BUFFER_SIZE != 0 && \ + XCHAL_CLOCK_GATING_GLOBAL && !defined(_NO_ERRATUM_453) ) +#define XCHAL_ERRATUM_453 1 +#else +#define XCHAL_ERRATUM_453 0 +#endif + +/* + * Erratum 497 present in RE-2012.2 up to RG/RF-2015.2 + * Applies to specific set of configuration options. + * Workaround is to add MEMWs after at most 8 cache WB instructions + */ +#if ( ((XCHAL_HW_MAX_VERSION >= XTENSA_HWVERSION_RE_2012_0 && \ + XCHAL_HW_MIN_VERSION <= XTENSA_HWVERSION_RF_2015_2) || \ + (XCHAL_HW_MAX_VERSION >= XTENSA_HWVERSION_RG_2015_0 && \ + XCHAL_HW_MIN_VERSION <= XTENSA_HWVERSION_RG_2015_2) \ + ) && \ + XCHAL_DCACHE_IS_WRITEBACK && \ + XCHAL_HAVE_AXI && \ + XCHAL_HAVE_PIF_WR_RESP && \ + XCHAL_HAVE_PIF_REQ_ATTR && !defined(_NO_ERRATUM_497) \ + ) +#define XCHAL_ERRATUM_497 1 +#else +#define XCHAL_ERRATUM_497 0 +#endif + + +/*---------------------------------------------------------------------- + ISA + ----------------------------------------------------------------------*/ + +#if XCHAL_HAVE_BE +# define XCHAL_HAVE_LE 0 +# define XCHAL_MEMORY_ORDER XTHAL_BIGENDIAN +#else +# define XCHAL_HAVE_LE 1 +# define XCHAL_MEMORY_ORDER XTHAL_LITTLEENDIAN +#endif + + + +/*---------------------------------------------------------------------- + INTERRUPTS + ----------------------------------------------------------------------*/ + +/* Indexing macros: */ +#define _XCHAL_INTLEVEL_MASK(n) XCHAL_INTLEVEL ## n ## _MASK +#define XCHAL_INTLEVEL_MASK(n) _XCHAL_INTLEVEL_MASK(n) /* n = 0 .. 15 */ +#define _XCHAL_INTLEVEL_ANDBELOWMASK(n) XCHAL_INTLEVEL ## n ## _ANDBELOW_MASK +#define XCHAL_INTLEVEL_ANDBELOW_MASK(n) _XCHAL_INTLEVEL_ANDBELOWMASK(n) /* n = 0 .. 15 */ +#define _XCHAL_INTLEVEL_NUM(n) XCHAL_INTLEVEL ## n ## _NUM +#define XCHAL_INTLEVEL_NUM(n) _XCHAL_INTLEVEL_NUM(n) /* n = 0 .. 15 */ +#define _XCHAL_INT_LEVEL(n) XCHAL_INT ## n ## _LEVEL +#define XCHAL_INT_LEVEL(n) _XCHAL_INT_LEVEL(n) /* n = 0 .. 31 */ +#define _XCHAL_INT_TYPE(n) XCHAL_INT ## n ## _TYPE +#define XCHAL_INT_TYPE(n) _XCHAL_INT_TYPE(n) /* n = 0 .. 31 */ +#define _XCHAL_TIMER_INTERRUPT(n) XCHAL_TIMER ## n ## _INTERRUPT +#define XCHAL_TIMER_INTERRUPT(n) _XCHAL_TIMER_INTERRUPT(n) /* n = 0 .. 3 */ + + +#define XCHAL_HAVE_HIGHLEVEL_INTERRUPTS XCHAL_HAVE_HIGHPRI_INTERRUPTS +#define XCHAL_NUM_LOWPRI_LEVELS 1 /* number of low-priority interrupt levels (always 1) */ +#define XCHAL_FIRST_HIGHPRI_LEVEL (XCHAL_NUM_LOWPRI_LEVELS+1) /* level of first high-priority interrupt (always 2) */ +/* Note: 1 <= LOWPRI_LEVELS <= EXCM_LEVEL < DEBUGLEVEL <= NUM_INTLEVELS < NMILEVEL <= 15 */ + +/* These values are constant for existing Xtensa processor implementations: */ +#define XCHAL_INTLEVEL0_MASK 0x00000000 +#define XCHAL_INTLEVEL8_MASK 0x00000000 +#define XCHAL_INTLEVEL9_MASK 0x00000000 +#define XCHAL_INTLEVEL10_MASK 0x00000000 +#define XCHAL_INTLEVEL11_MASK 0x00000000 +#define XCHAL_INTLEVEL12_MASK 0x00000000 +#define XCHAL_INTLEVEL13_MASK 0x00000000 +#define XCHAL_INTLEVEL14_MASK 0x00000000 +#define XCHAL_INTLEVEL15_MASK 0x00000000 + +/* Array of masks of interrupts at each interrupt level: */ +#define XCHAL_INTLEVEL_MASKS XCHAL_INTLEVEL0_MASK \ + XCHAL_SEP XCHAL_INTLEVEL1_MASK \ + XCHAL_SEP XCHAL_INTLEVEL2_MASK \ + XCHAL_SEP XCHAL_INTLEVEL3_MASK \ + XCHAL_SEP XCHAL_INTLEVEL4_MASK \ + XCHAL_SEP XCHAL_INTLEVEL5_MASK \ + XCHAL_SEP XCHAL_INTLEVEL6_MASK \ + XCHAL_SEP XCHAL_INTLEVEL7_MASK \ + XCHAL_SEP XCHAL_INTLEVEL8_MASK \ + XCHAL_SEP XCHAL_INTLEVEL9_MASK \ + XCHAL_SEP XCHAL_INTLEVEL10_MASK \ + XCHAL_SEP XCHAL_INTLEVEL11_MASK \ + XCHAL_SEP XCHAL_INTLEVEL12_MASK \ + XCHAL_SEP XCHAL_INTLEVEL13_MASK \ + XCHAL_SEP XCHAL_INTLEVEL14_MASK \ + XCHAL_SEP XCHAL_INTLEVEL15_MASK + +/* These values are constant for existing Xtensa processor implementations: */ +#define XCHAL_INTLEVEL0_ANDBELOW_MASK 0x00000000 +#define XCHAL_INTLEVEL8_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK +#define XCHAL_INTLEVEL9_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK +#define XCHAL_INTLEVEL10_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK +#define XCHAL_INTLEVEL11_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK +#define XCHAL_INTLEVEL12_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK +#define XCHAL_INTLEVEL13_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK +#define XCHAL_INTLEVEL14_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK +#define XCHAL_INTLEVEL15_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK + +/* Mask of all low-priority interrupts: */ +#define XCHAL_LOWPRI_MASK XCHAL_INTLEVEL1_ANDBELOW_MASK + +/* Mask of all interrupts masked by PS.EXCM (or CEXCM): */ +#define XCHAL_EXCM_MASK XCHAL_INTLEVEL_ANDBELOW_MASK(XCHAL_EXCM_LEVEL) + +/* Array of masks of interrupts at each range 1..n of interrupt levels: */ +#define XCHAL_INTLEVEL_ANDBELOW_MASKS XCHAL_INTLEVEL0_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL1_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL2_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL3_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL4_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL5_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL6_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL7_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL8_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL9_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL10_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL11_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL12_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL13_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL14_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL15_ANDBELOW_MASK + +#if 0 /*XCHAL_HAVE_NMI*/ +/* NMI "interrupt level" (for use with EXCSAVE_n, EPS_n, EPC_n, RFI n): */ +# define XCHAL_NMILEVEL (XCHAL_NUM_INTLEVELS+1) +#endif + +/* Array of levels of each possible interrupt: */ +#define XCHAL_INT_LEVELS XCHAL_INT0_LEVEL \ + XCHAL_SEP XCHAL_INT1_LEVEL \ + XCHAL_SEP XCHAL_INT2_LEVEL \ + XCHAL_SEP XCHAL_INT3_LEVEL \ + XCHAL_SEP XCHAL_INT4_LEVEL \ + XCHAL_SEP XCHAL_INT5_LEVEL \ + XCHAL_SEP XCHAL_INT6_LEVEL \ + XCHAL_SEP XCHAL_INT7_LEVEL \ + XCHAL_SEP XCHAL_INT8_LEVEL \ + XCHAL_SEP XCHAL_INT9_LEVEL \ + XCHAL_SEP XCHAL_INT10_LEVEL \ + XCHAL_SEP XCHAL_INT11_LEVEL \ + XCHAL_SEP XCHAL_INT12_LEVEL \ + XCHAL_SEP XCHAL_INT13_LEVEL \ + XCHAL_SEP XCHAL_INT14_LEVEL \ + XCHAL_SEP XCHAL_INT15_LEVEL \ + XCHAL_SEP XCHAL_INT16_LEVEL \ + XCHAL_SEP XCHAL_INT17_LEVEL \ + XCHAL_SEP XCHAL_INT18_LEVEL \ + XCHAL_SEP XCHAL_INT19_LEVEL \ + XCHAL_SEP XCHAL_INT20_LEVEL \ + XCHAL_SEP XCHAL_INT21_LEVEL \ + XCHAL_SEP XCHAL_INT22_LEVEL \ + XCHAL_SEP XCHAL_INT23_LEVEL \ + XCHAL_SEP XCHAL_INT24_LEVEL \ + XCHAL_SEP XCHAL_INT25_LEVEL \ + XCHAL_SEP XCHAL_INT26_LEVEL \ + XCHAL_SEP XCHAL_INT27_LEVEL \ + XCHAL_SEP XCHAL_INT28_LEVEL \ + XCHAL_SEP XCHAL_INT29_LEVEL \ + XCHAL_SEP XCHAL_INT30_LEVEL \ + XCHAL_SEP XCHAL_INT31_LEVEL + +/* Array of types of each possible interrupt: */ +#define XCHAL_INT_TYPES XCHAL_INT0_TYPE \ + XCHAL_SEP XCHAL_INT1_TYPE \ + XCHAL_SEP XCHAL_INT2_TYPE \ + XCHAL_SEP XCHAL_INT3_TYPE \ + XCHAL_SEP XCHAL_INT4_TYPE \ + XCHAL_SEP XCHAL_INT5_TYPE \ + XCHAL_SEP XCHAL_INT6_TYPE \ + XCHAL_SEP XCHAL_INT7_TYPE \ + XCHAL_SEP XCHAL_INT8_TYPE \ + XCHAL_SEP XCHAL_INT9_TYPE \ + XCHAL_SEP XCHAL_INT10_TYPE \ + XCHAL_SEP XCHAL_INT11_TYPE \ + XCHAL_SEP XCHAL_INT12_TYPE \ + XCHAL_SEP XCHAL_INT13_TYPE \ + XCHAL_SEP XCHAL_INT14_TYPE \ + XCHAL_SEP XCHAL_INT15_TYPE \ + XCHAL_SEP XCHAL_INT16_TYPE \ + XCHAL_SEP XCHAL_INT17_TYPE \ + XCHAL_SEP XCHAL_INT18_TYPE \ + XCHAL_SEP XCHAL_INT19_TYPE \ + XCHAL_SEP XCHAL_INT20_TYPE \ + XCHAL_SEP XCHAL_INT21_TYPE \ + XCHAL_SEP XCHAL_INT22_TYPE \ + XCHAL_SEP XCHAL_INT23_TYPE \ + XCHAL_SEP XCHAL_INT24_TYPE \ + XCHAL_SEP XCHAL_INT25_TYPE \ + XCHAL_SEP XCHAL_INT26_TYPE \ + XCHAL_SEP XCHAL_INT27_TYPE \ + XCHAL_SEP XCHAL_INT28_TYPE \ + XCHAL_SEP XCHAL_INT29_TYPE \ + XCHAL_SEP XCHAL_INT30_TYPE \ + XCHAL_SEP XCHAL_INT31_TYPE + +/* Array of masks of interrupts for each type of interrupt: */ +#define XCHAL_INTTYPE_MASKS XCHAL_INTTYPE_MASK_UNCONFIGURED \ + XCHAL_SEP XCHAL_INTTYPE_MASK_SOFTWARE \ + XCHAL_SEP XCHAL_INTTYPE_MASK_EXTERN_EDGE \ + XCHAL_SEP XCHAL_INTTYPE_MASK_EXTERN_LEVEL \ + XCHAL_SEP XCHAL_INTTYPE_MASK_TIMER \ + XCHAL_SEP XCHAL_INTTYPE_MASK_NMI \ + XCHAL_SEP XCHAL_INTTYPE_MASK_WRITE_ERROR \ + XCHAL_SEP XCHAL_INTTYPE_MASK_IDMA_DONE \ + XCHAL_SEP XCHAL_INTTYPE_MASK_IDMA_ERR \ + XCHAL_SEP XCHAL_INTTYPE_MASK_GS_ERR + +/* Interrupts that can be cleared using the INTCLEAR special register: */ +#define XCHAL_INTCLEARABLE_MASK (XCHAL_INTTYPE_MASK_SOFTWARE+XCHAL_INTTYPE_MASK_EXTERN_EDGE+XCHAL_INTTYPE_MASK_WRITE_ERROR) +/* Interrupts that can be triggered using the INTSET special register: */ +#define XCHAL_INTSETTABLE_MASK XCHAL_INTTYPE_MASK_SOFTWARE + +/* Array of interrupts assigned to each timer (CCOMPARE0 to CCOMPARE3): */ +#define XCHAL_TIMER_INTERRUPTS XCHAL_TIMER0_INTERRUPT \ + XCHAL_SEP XCHAL_TIMER1_INTERRUPT \ + XCHAL_SEP XCHAL_TIMER2_INTERRUPT \ + XCHAL_SEP XCHAL_TIMER3_INTERRUPT + + + +/* For backward compatibility and for the array macros, define macros for + * each unconfigured interrupt number (unfortunately, the value of + * XTHAL_INTTYPE_UNCONFIGURED is not zero): */ +#if XCHAL_NUM_INTERRUPTS == 0 +# define XCHAL_INT0_LEVEL 0 +# define XCHAL_INT0_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 1 +# define XCHAL_INT1_LEVEL 0 +# define XCHAL_INT1_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 2 +# define XCHAL_INT2_LEVEL 0 +# define XCHAL_INT2_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 3 +# define XCHAL_INT3_LEVEL 0 +# define XCHAL_INT3_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 4 +# define XCHAL_INT4_LEVEL 0 +# define XCHAL_INT4_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 5 +# define XCHAL_INT5_LEVEL 0 +# define XCHAL_INT5_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 6 +# define XCHAL_INT6_LEVEL 0 +# define XCHAL_INT6_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 7 +# define XCHAL_INT7_LEVEL 0 +# define XCHAL_INT7_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 8 +# define XCHAL_INT8_LEVEL 0 +# define XCHAL_INT8_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 9 +# define XCHAL_INT9_LEVEL 0 +# define XCHAL_INT9_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 10 +# define XCHAL_INT10_LEVEL 0 +# define XCHAL_INT10_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 11 +# define XCHAL_INT11_LEVEL 0 +# define XCHAL_INT11_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 12 +# define XCHAL_INT12_LEVEL 0 +# define XCHAL_INT12_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 13 +# define XCHAL_INT13_LEVEL 0 +# define XCHAL_INT13_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 14 +# define XCHAL_INT14_LEVEL 0 +# define XCHAL_INT14_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 15 +# define XCHAL_INT15_LEVEL 0 +# define XCHAL_INT15_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 16 +# define XCHAL_INT16_LEVEL 0 +# define XCHAL_INT16_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 17 +# define XCHAL_INT17_LEVEL 0 +# define XCHAL_INT17_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 18 +# define XCHAL_INT18_LEVEL 0 +# define XCHAL_INT18_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 19 +# define XCHAL_INT19_LEVEL 0 +# define XCHAL_INT19_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 20 +# define XCHAL_INT20_LEVEL 0 +# define XCHAL_INT20_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 21 +# define XCHAL_INT21_LEVEL 0 +# define XCHAL_INT21_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 22 +# define XCHAL_INT22_LEVEL 0 +# define XCHAL_INT22_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 23 +# define XCHAL_INT23_LEVEL 0 +# define XCHAL_INT23_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 24 +# define XCHAL_INT24_LEVEL 0 +# define XCHAL_INT24_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 25 +# define XCHAL_INT25_LEVEL 0 +# define XCHAL_INT25_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 26 +# define XCHAL_INT26_LEVEL 0 +# define XCHAL_INT26_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 27 +# define XCHAL_INT27_LEVEL 0 +# define XCHAL_INT27_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 28 +# define XCHAL_INT28_LEVEL 0 +# define XCHAL_INT28_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 29 +# define XCHAL_INT29_LEVEL 0 +# define XCHAL_INT29_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 30 +# define XCHAL_INT30_LEVEL 0 +# define XCHAL_INT30_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 31 +# define XCHAL_INT31_LEVEL 0 +# define XCHAL_INT31_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif + + +/* + * Masks and levels corresponding to each *external* interrupt. + */ + +#define XCHAL_EXTINT0_MASK (1 << XCHAL_EXTINT0_NUM) +#define XCHAL_EXTINT0_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT0_NUM) +#define XCHAL_EXTINT1_MASK (1 << XCHAL_EXTINT1_NUM) +#define XCHAL_EXTINT1_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT1_NUM) +#define XCHAL_EXTINT2_MASK (1 << XCHAL_EXTINT2_NUM) +#define XCHAL_EXTINT2_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT2_NUM) +#define XCHAL_EXTINT3_MASK (1 << XCHAL_EXTINT3_NUM) +#define XCHAL_EXTINT3_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT3_NUM) +#define XCHAL_EXTINT4_MASK (1 << XCHAL_EXTINT4_NUM) +#define XCHAL_EXTINT4_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT4_NUM) +#define XCHAL_EXTINT5_MASK (1 << XCHAL_EXTINT5_NUM) +#define XCHAL_EXTINT5_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT5_NUM) +#define XCHAL_EXTINT6_MASK (1 << XCHAL_EXTINT6_NUM) +#define XCHAL_EXTINT6_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT6_NUM) +#define XCHAL_EXTINT7_MASK (1 << XCHAL_EXTINT7_NUM) +#define XCHAL_EXTINT7_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT7_NUM) +#define XCHAL_EXTINT8_MASK (1 << XCHAL_EXTINT8_NUM) +#define XCHAL_EXTINT8_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT8_NUM) +#define XCHAL_EXTINT9_MASK (1 << XCHAL_EXTINT9_NUM) +#define XCHAL_EXTINT9_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT9_NUM) +#define XCHAL_EXTINT10_MASK (1 << XCHAL_EXTINT10_NUM) +#define XCHAL_EXTINT10_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT10_NUM) +#define XCHAL_EXTINT11_MASK (1 << XCHAL_EXTINT11_NUM) +#define XCHAL_EXTINT11_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT11_NUM) +#define XCHAL_EXTINT12_MASK (1 << XCHAL_EXTINT12_NUM) +#define XCHAL_EXTINT12_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT12_NUM) +#define XCHAL_EXTINT13_MASK (1 << XCHAL_EXTINT13_NUM) +#define XCHAL_EXTINT13_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT13_NUM) +#define XCHAL_EXTINT14_MASK (1 << XCHAL_EXTINT14_NUM) +#define XCHAL_EXTINT14_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT14_NUM) +#define XCHAL_EXTINT15_MASK (1 << XCHAL_EXTINT15_NUM) +#define XCHAL_EXTINT15_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT15_NUM) +#define XCHAL_EXTINT16_MASK (1 << XCHAL_EXTINT16_NUM) +#define XCHAL_EXTINT16_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT16_NUM) +#define XCHAL_EXTINT17_MASK (1 << XCHAL_EXTINT17_NUM) +#define XCHAL_EXTINT17_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT17_NUM) +#define XCHAL_EXTINT18_MASK (1 << XCHAL_EXTINT18_NUM) +#define XCHAL_EXTINT18_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT18_NUM) +#define XCHAL_EXTINT19_MASK (1 << XCHAL_EXTINT19_NUM) +#define XCHAL_EXTINT19_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT19_NUM) +#define XCHAL_EXTINT20_MASK (1 << XCHAL_EXTINT20_NUM) +#define XCHAL_EXTINT20_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT20_NUM) +#define XCHAL_EXTINT21_MASK (1 << XCHAL_EXTINT21_NUM) +#define XCHAL_EXTINT21_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT21_NUM) +#define XCHAL_EXTINT22_MASK (1 << XCHAL_EXTINT22_NUM) +#define XCHAL_EXTINT22_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT22_NUM) +#define XCHAL_EXTINT23_MASK (1 << XCHAL_EXTINT23_NUM) +#define XCHAL_EXTINT23_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT23_NUM) +#define XCHAL_EXTINT24_MASK (1 << XCHAL_EXTINT24_NUM) +#define XCHAL_EXTINT24_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT24_NUM) +#define XCHAL_EXTINT25_MASK (1 << XCHAL_EXTINT25_NUM) +#define XCHAL_EXTINT25_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT25_NUM) +#define XCHAL_EXTINT26_MASK (1 << XCHAL_EXTINT26_NUM) +#define XCHAL_EXTINT26_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT26_NUM) +#define XCHAL_EXTINT27_MASK (1 << XCHAL_EXTINT27_NUM) +#define XCHAL_EXTINT27_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT27_NUM) +#define XCHAL_EXTINT28_MASK (1 << XCHAL_EXTINT28_NUM) +#define XCHAL_EXTINT28_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT28_NUM) +#define XCHAL_EXTINT29_MASK (1 << XCHAL_EXTINT29_NUM) +#define XCHAL_EXTINT29_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT29_NUM) +#define XCHAL_EXTINT30_MASK (1 << XCHAL_EXTINT30_NUM) +#define XCHAL_EXTINT30_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT30_NUM) +#define XCHAL_EXTINT31_MASK (1 << XCHAL_EXTINT31_NUM) +#define XCHAL_EXTINT31_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT31_NUM) + + +/*---------------------------------------------------------------------- + EXCEPTIONS and VECTORS + ----------------------------------------------------------------------*/ + +/* For backward compatibility ONLY -- DO NOT USE (will be removed in future release): */ +#define XCHAL_HAVE_OLD_EXC_ARCH XCHAL_HAVE_XEA1 /* (DEPRECATED) 1 if old exception architecture (XEA1), 0 otherwise (eg. XEA2) */ +#define XCHAL_HAVE_EXCM XCHAL_HAVE_XEA2 /* (DEPRECATED) 1 if PS.EXCM bit exists (currently equals XCHAL_HAVE_TLBS) */ +#ifdef XCHAL_USER_VECTOR_VADDR +#define XCHAL_PROGRAMEXC_VECTOR_VADDR XCHAL_USER_VECTOR_VADDR +#define XCHAL_USEREXC_VECTOR_VADDR XCHAL_USER_VECTOR_VADDR +#endif +#ifdef XCHAL_USER_VECTOR_PADDR +# define XCHAL_PROGRAMEXC_VECTOR_PADDR XCHAL_USER_VECTOR_PADDR +# define XCHAL_USEREXC_VECTOR_PADDR XCHAL_USER_VECTOR_PADDR +#endif +#ifdef XCHAL_KERNEL_VECTOR_VADDR +# define XCHAL_STACKEDEXC_VECTOR_VADDR XCHAL_KERNEL_VECTOR_VADDR +# define XCHAL_KERNELEXC_VECTOR_VADDR XCHAL_KERNEL_VECTOR_VADDR +#endif +#ifdef XCHAL_KERNEL_VECTOR_PADDR +# define XCHAL_STACKEDEXC_VECTOR_PADDR XCHAL_KERNEL_VECTOR_PADDR +# define XCHAL_KERNELEXC_VECTOR_PADDR XCHAL_KERNEL_VECTOR_PADDR +#endif + +#if 0 +#if XCHAL_HAVE_DEBUG +# define XCHAL_DEBUG_VECTOR_VADDR XCHAL_INTLEVEL_VECTOR_VADDR(XCHAL_DEBUGLEVEL) +/* This one should only get defined if the corresponding intlevel paddr macro exists: */ +# define XCHAL_DEBUG_VECTOR_PADDR XCHAL_INTLEVEL_VECTOR_PADDR(XCHAL_DEBUGLEVEL) +#endif +#endif + +/* Indexing macros: */ +#define _XCHAL_INTLEVEL_VECTOR_VADDR(n) XCHAL_INTLEVEL ## n ## _VECTOR_VADDR +#define XCHAL_INTLEVEL_VECTOR_VADDR(n) _XCHAL_INTLEVEL_VECTOR_VADDR(n) /* n = 0 .. 15 */ + +/* + * General Exception Causes + * (values of EXCCAUSE special register set by general exceptions, + * which vector to the user, kernel, or double-exception vectors). + * + * DEPRECATED. Please use the equivalent EXCCAUSE_xxx macros + * defined in . (Note that these have slightly + * different names, they don't just have the XCHAL_ prefix removed.) + */ +#define XCHAL_EXCCAUSE_ILLEGAL_INSTRUCTION 0 /* Illegal Instruction */ +#define XCHAL_EXCCAUSE_SYSTEM_CALL 1 /* System Call */ +#define XCHAL_EXCCAUSE_INSTRUCTION_FETCH_ERROR 2 /* Instruction Fetch Error */ +#define XCHAL_EXCCAUSE_LOAD_STORE_ERROR 3 /* Load Store Error */ +#define XCHAL_EXCCAUSE_LEVEL1_INTERRUPT 4 /* Level 1 Interrupt */ +#define XCHAL_EXCCAUSE_ALLOCA 5 /* Stack Extension Assist */ +#define XCHAL_EXCCAUSE_INTEGER_DIVIDE_BY_ZERO 6 /* Integer Divide by Zero */ +#define XCHAL_EXCCAUSE_SPECULATION 7 /* Speculation */ +#define XCHAL_EXCCAUSE_PRIVILEGED 8 /* Privileged Instruction */ +#define XCHAL_EXCCAUSE_UNALIGNED 9 /* Unaligned Load Store */ +/*10..15 reserved*/ +#define XCHAL_EXCCAUSE_ITLB_MISS 16 /* ITlb Miss Exception */ +#define XCHAL_EXCCAUSE_ITLB_MULTIHIT 17 /* ITlb Mutltihit Exception */ +#define XCHAL_EXCCAUSE_ITLB_PRIVILEGE 18 /* ITlb Privilege Exception */ +#define XCHAL_EXCCAUSE_ITLB_SIZE_RESTRICTION 19 /* ITlb Size Restriction Exception */ +#define XCHAL_EXCCAUSE_FETCH_CACHE_ATTRIBUTE 20 /* Fetch Cache Attribute Exception */ +/*21..23 reserved*/ +#define XCHAL_EXCCAUSE_DTLB_MISS 24 /* DTlb Miss Exception */ +#define XCHAL_EXCCAUSE_DTLB_MULTIHIT 25 /* DTlb Multihit Exception */ +#define XCHAL_EXCCAUSE_DTLB_PRIVILEGE 26 /* DTlb Privilege Exception */ +#define XCHAL_EXCCAUSE_DTLB_SIZE_RESTRICTION 27 /* DTlb Size Restriction Exception */ +#define XCHAL_EXCCAUSE_LOAD_CACHE_ATTRIBUTE 28 /* Load Cache Attribute Exception */ +#define XCHAL_EXCCAUSE_STORE_CACHE_ATTRIBUTE 29 /* Store Cache Attribute Exception */ +/*30..31 reserved*/ +#define XCHAL_EXCCAUSE_COPROCESSOR0_DISABLED 32 /* Coprocessor 0 disabled */ +#define XCHAL_EXCCAUSE_COPROCESSOR1_DISABLED 33 /* Coprocessor 1 disabled */ +#define XCHAL_EXCCAUSE_COPROCESSOR2_DISABLED 34 /* Coprocessor 2 disabled */ +#define XCHAL_EXCCAUSE_COPROCESSOR3_DISABLED 35 /* Coprocessor 3 disabled */ +#define XCHAL_EXCCAUSE_COPROCESSOR4_DISABLED 36 /* Coprocessor 4 disabled */ +#define XCHAL_EXCCAUSE_COPROCESSOR5_DISABLED 37 /* Coprocessor 5 disabled */ +#define XCHAL_EXCCAUSE_COPROCESSOR6_DISABLED 38 /* Coprocessor 6 disabled */ +#define XCHAL_EXCCAUSE_COPROCESSOR7_DISABLED 39 /* Coprocessor 7 disabled */ +/*40..63 reserved*/ + + +/* + * Miscellaneous special register fields. + * + * For each special register, and each field within each register: + * XCHAL__VALIDMASK is the set of bits defined in the register. + * XCHAL___BITS is the number of bits in the field. + * XCHAL___NUM is 2^bits, the number of possible values + * of the field. + * XCHAL___SHIFT is the position of the field within + * the register, starting from the least significant bit. + * + * DEPRECATED. Please use the equivalent macros defined in + * . (Note that these have different names.) + */ + +/* DBREAKC (special register number 160): */ +#define XCHAL_DBREAKC_VALIDMASK 0xC000003F +#define XCHAL_DBREAKC_MASK_BITS 6 +#define XCHAL_DBREAKC_MASK_NUM 64 +#define XCHAL_DBREAKC_MASK_SHIFT 0 +#define XCHAL_DBREAKC_MASK_MASK 0x0000003F +#define XCHAL_DBREAKC_LOADBREAK_BITS 1 +#define XCHAL_DBREAKC_LOADBREAK_NUM 2 +#define XCHAL_DBREAKC_LOADBREAK_SHIFT 30 +#define XCHAL_DBREAKC_LOADBREAK_MASK 0x40000000 +#define XCHAL_DBREAKC_STOREBREAK_BITS 1 +#define XCHAL_DBREAKC_STOREBREAK_NUM 2 +#define XCHAL_DBREAKC_STOREBREAK_SHIFT 31 +#define XCHAL_DBREAKC_STOREBREAK_MASK 0x80000000 +/* PS (special register number 230): */ +#define XCHAL_PS_VALIDMASK 0x00070F3F +#define XCHAL_PS_INTLEVEL_BITS 4 +#define XCHAL_PS_INTLEVEL_NUM 16 +#define XCHAL_PS_INTLEVEL_SHIFT 0 +#define XCHAL_PS_INTLEVEL_MASK 0x0000000F +#define XCHAL_PS_EXCM_BITS 1 +#define XCHAL_PS_EXCM_NUM 2 +#define XCHAL_PS_EXCM_SHIFT 4 +#define XCHAL_PS_EXCM_MASK 0x00000010 +#define XCHAL_PS_UM_BITS 1 +#define XCHAL_PS_UM_NUM 2 +#define XCHAL_PS_UM_SHIFT 5 +#define XCHAL_PS_UM_MASK 0x00000020 +#define XCHAL_PS_RING_BITS 2 +#define XCHAL_PS_RING_NUM 4 +#define XCHAL_PS_RING_SHIFT 6 +#define XCHAL_PS_RING_MASK 0x000000C0 +#define XCHAL_PS_OWB_BITS 4 +#define XCHAL_PS_OWB_NUM 16 +#define XCHAL_PS_OWB_SHIFT 8 +#define XCHAL_PS_OWB_MASK 0x00000F00 +#define XCHAL_PS_CALLINC_BITS 2 +#define XCHAL_PS_CALLINC_NUM 4 +#define XCHAL_PS_CALLINC_SHIFT 16 +#define XCHAL_PS_CALLINC_MASK 0x00030000 +#define XCHAL_PS_WOE_BITS 1 +#define XCHAL_PS_WOE_NUM 2 +#define XCHAL_PS_WOE_SHIFT 18 +#define XCHAL_PS_WOE_MASK 0x00040000 +/* EXCCAUSE (special register number 232): */ +#define XCHAL_EXCCAUSE_VALIDMASK 0x0000003F +#define XCHAL_EXCCAUSE_BITS 6 +#define XCHAL_EXCCAUSE_NUM 64 +#define XCHAL_EXCCAUSE_SHIFT 0 +#define XCHAL_EXCCAUSE_MASK 0x0000003F +/* DEBUGCAUSE (special register number 233): */ +#define XCHAL_DEBUGCAUSE_VALIDMASK 0x0000003F +#define XCHAL_DEBUGCAUSE_ICOUNT_BITS 1 +#define XCHAL_DEBUGCAUSE_ICOUNT_NUM 2 +#define XCHAL_DEBUGCAUSE_ICOUNT_SHIFT 0 +#define XCHAL_DEBUGCAUSE_ICOUNT_MASK 0x00000001 +#define XCHAL_DEBUGCAUSE_IBREAK_BITS 1 +#define XCHAL_DEBUGCAUSE_IBREAK_NUM 2 +#define XCHAL_DEBUGCAUSE_IBREAK_SHIFT 1 +#define XCHAL_DEBUGCAUSE_IBREAK_MASK 0x00000002 +#define XCHAL_DEBUGCAUSE_DBREAK_BITS 1 +#define XCHAL_DEBUGCAUSE_DBREAK_NUM 2 +#define XCHAL_DEBUGCAUSE_DBREAK_SHIFT 2 +#define XCHAL_DEBUGCAUSE_DBREAK_MASK 0x00000004 +#define XCHAL_DEBUGCAUSE_BREAK_BITS 1 +#define XCHAL_DEBUGCAUSE_BREAK_NUM 2 +#define XCHAL_DEBUGCAUSE_BREAK_SHIFT 3 +#define XCHAL_DEBUGCAUSE_BREAK_MASK 0x00000008 +#define XCHAL_DEBUGCAUSE_BREAKN_BITS 1 +#define XCHAL_DEBUGCAUSE_BREAKN_NUM 2 +#define XCHAL_DEBUGCAUSE_BREAKN_SHIFT 4 +#define XCHAL_DEBUGCAUSE_BREAKN_MASK 0x00000010 +#define XCHAL_DEBUGCAUSE_DEBUGINT_BITS 1 +#define XCHAL_DEBUGCAUSE_DEBUGINT_NUM 2 +#define XCHAL_DEBUGCAUSE_DEBUGINT_SHIFT 5 +#define XCHAL_DEBUGCAUSE_DEBUGINT_MASK 0x00000020 + + + + +/*---------------------------------------------------------------------- + TIMERS + ----------------------------------------------------------------------*/ + +/*#define XCHAL_HAVE_TIMERS XCHAL_HAVE_CCOUNT*/ + + + +/*---------------------------------------------------------------------- + INTERNAL I/D RAM/ROMs and XLMI + ----------------------------------------------------------------------*/ + +#define XCHAL_NUM_IROM XCHAL_NUM_INSTROM /* (DEPRECATED) */ +#define XCHAL_NUM_IRAM XCHAL_NUM_INSTRAM /* (DEPRECATED) */ +#define XCHAL_NUM_DROM XCHAL_NUM_DATAROM /* (DEPRECATED) */ +#define XCHAL_NUM_DRAM XCHAL_NUM_DATARAM /* (DEPRECATED) */ + +#define XCHAL_IROM0_VADDR XCHAL_INSTROM0_VADDR /* (DEPRECATED) */ +#define XCHAL_IROM0_PADDR XCHAL_INSTROM0_PADDR /* (DEPRECATED) */ +#define XCHAL_IROM0_SIZE XCHAL_INSTROM0_SIZE /* (DEPRECATED) */ +#define XCHAL_IROM1_VADDR XCHAL_INSTROM1_VADDR /* (DEPRECATED) */ +#define XCHAL_IROM1_PADDR XCHAL_INSTROM1_PADDR /* (DEPRECATED) */ +#define XCHAL_IROM1_SIZE XCHAL_INSTROM1_SIZE /* (DEPRECATED) */ +#define XCHAL_IRAM0_VADDR XCHAL_INSTRAM0_VADDR /* (DEPRECATED) */ +#define XCHAL_IRAM0_PADDR XCHAL_INSTRAM0_PADDR /* (DEPRECATED) */ +#define XCHAL_IRAM0_SIZE XCHAL_INSTRAM0_SIZE /* (DEPRECATED) */ +#define XCHAL_IRAM1_VADDR XCHAL_INSTRAM1_VADDR /* (DEPRECATED) */ +#define XCHAL_IRAM1_PADDR XCHAL_INSTRAM1_PADDR /* (DEPRECATED) */ +#define XCHAL_IRAM1_SIZE XCHAL_INSTRAM1_SIZE /* (DEPRECATED) */ +#define XCHAL_DROM0_VADDR XCHAL_DATAROM0_VADDR /* (DEPRECATED) */ +#define XCHAL_DROM0_PADDR XCHAL_DATAROM0_PADDR /* (DEPRECATED) */ +#define XCHAL_DROM0_SIZE XCHAL_DATAROM0_SIZE /* (DEPRECATED) */ +#define XCHAL_DROM1_VADDR XCHAL_DATAROM1_VADDR /* (DEPRECATED) */ +#define XCHAL_DROM1_PADDR XCHAL_DATAROM1_PADDR /* (DEPRECATED) */ +#define XCHAL_DROM1_SIZE XCHAL_DATAROM1_SIZE /* (DEPRECATED) */ +#define XCHAL_DRAM0_VADDR XCHAL_DATARAM0_VADDR /* (DEPRECATED) */ +#define XCHAL_DRAM0_PADDR XCHAL_DATARAM0_PADDR /* (DEPRECATED) */ +#define XCHAL_DRAM0_SIZE XCHAL_DATARAM0_SIZE /* (DEPRECATED) */ +#define XCHAL_DRAM1_VADDR XCHAL_DATARAM1_VADDR /* (DEPRECATED) */ +#define XCHAL_DRAM1_PADDR XCHAL_DATARAM1_PADDR /* (DEPRECATED) */ +#define XCHAL_DRAM1_SIZE XCHAL_DATARAM1_SIZE /* (DEPRECATED) */ + + + +/*---------------------------------------------------------------------- + CACHE + ----------------------------------------------------------------------*/ + + +/* Default PREFCTL value to enable prefetch. */ +#if XCHAL_HW_MIN_VERSION < XTENSA_HWVERSION_RE_2012_0 +#define XCHAL_CACHE_PREFCTL_DEFAULT 0x00044 /* enabled, not aggressive */ +#elif XCHAL_HW_MIN_VERSION < XTENSA_HWVERSION_RF_2014_0 +#define XCHAL_CACHE_PREFCTL_DEFAULT 0x01044 /* + enable prefetch to L1 */ +#elif ((XCHAL_PREFETCH_ENTRIES >= 16) && XCHAL_HAVE_CACHE_BLOCKOPS) +#define XCHAL_CACHE_PREFCTL_DEFAULT 0x81044 /* 12 entries for block ops */ +#elif ((XCHAL_PREFETCH_ENTRIES >= 8) && XCHAL_HAVE_CACHE_BLOCKOPS) +#define XCHAL_CACHE_PREFCTL_DEFAULT 0x51044 /* 5 entries for block ops */ +#else +#define XCHAL_CACHE_PREFCTL_DEFAULT 0x01044 /* 0 entries for block ops */ +#endif + + +/* Max for both I-cache and D-cache (used for general alignment): */ +#if XCHAL_ICACHE_LINESIZE > XCHAL_DCACHE_LINESIZE +# define XCHAL_CACHE_LINEWIDTH_MAX XCHAL_ICACHE_LINEWIDTH +# define XCHAL_CACHE_LINESIZE_MAX XCHAL_ICACHE_LINESIZE +#else +# define XCHAL_CACHE_LINEWIDTH_MAX XCHAL_DCACHE_LINEWIDTH +# define XCHAL_CACHE_LINESIZE_MAX XCHAL_DCACHE_LINESIZE +#endif + +#define XCHAL_ICACHE_SETSIZE (1< XCHAL_DCACHE_SETWIDTH +# define XCHAL_CACHE_SETWIDTH_MAX XCHAL_ICACHE_SETWIDTH +# define XCHAL_CACHE_SETSIZE_MAX XCHAL_ICACHE_SETSIZE +#else +# define XCHAL_CACHE_SETWIDTH_MAX XCHAL_DCACHE_SETWIDTH +# define XCHAL_CACHE_SETSIZE_MAX XCHAL_DCACHE_SETSIZE +#endif + +/* Instruction cache tag bits: */ +#define XCHAL_ICACHE_TAG_V_SHIFT 0 +#define XCHAL_ICACHE_TAG_V 0x1 /* valid bit */ +#if XCHAL_ICACHE_WAYS > 1 +# define XCHAL_ICACHE_TAG_F_SHIFT 1 +# define XCHAL_ICACHE_TAG_F 0x2 /* fill (LRU) bit */ +#else +# define XCHAL_ICACHE_TAG_F_SHIFT 0 +# define XCHAL_ICACHE_TAG_F 0 /* no fill (LRU) bit */ +#endif +#if XCHAL_ICACHE_LINE_LOCKABLE +# define XCHAL_ICACHE_TAG_L_SHIFT (XCHAL_ICACHE_TAG_F_SHIFT+1) +# define XCHAL_ICACHE_TAG_L (1 << XCHAL_ICACHE_TAG_L_SHIFT) /* lock bit */ +#else +# define XCHAL_ICACHE_TAG_L_SHIFT XCHAL_ICACHE_TAG_F_SHIFT +# define XCHAL_ICACHE_TAG_L 0 /* no lock bit */ +#endif +/* Data cache tag bits: */ +#define XCHAL_DCACHE_TAG_V_SHIFT 0 +#define XCHAL_DCACHE_TAG_V 0x1 /* valid bit */ +#if XCHAL_DCACHE_WAYS > 1 +# define XCHAL_DCACHE_TAG_F_SHIFT 1 +# define XCHAL_DCACHE_TAG_F 0x2 /* fill (LRU) bit */ +#else +# define XCHAL_DCACHE_TAG_F_SHIFT 0 +# define XCHAL_DCACHE_TAG_F 0 /* no fill (LRU) bit */ +#endif +#if XCHAL_DCACHE_IS_WRITEBACK +# define XCHAL_DCACHE_TAG_D_SHIFT (XCHAL_DCACHE_TAG_F_SHIFT+1) +# define XCHAL_DCACHE_TAG_D (1 << XCHAL_DCACHE_TAG_D_SHIFT) /* dirty bit */ +#else +# define XCHAL_DCACHE_TAG_D_SHIFT XCHAL_DCACHE_TAG_F_SHIFT +# define XCHAL_DCACHE_TAG_D 0 /* no dirty bit */ +#endif +#if XCHAL_DCACHE_LINE_LOCKABLE +# define XCHAL_DCACHE_TAG_L_SHIFT (XCHAL_DCACHE_TAG_D_SHIFT+1) +# define XCHAL_DCACHE_TAG_L (1 << XCHAL_DCACHE_TAG_L_SHIFT) /* lock bit */ +#else +# define XCHAL_DCACHE_TAG_L_SHIFT XCHAL_DCACHE_TAG_D_SHIFT +# define XCHAL_DCACHE_TAG_L 0 /* no lock bit */ +#endif + +/* Whether MEMCTL register has anything useful */ +#define XCHAL_USE_MEMCTL (((XCHAL_LOOP_BUFFER_SIZE > 0) || \ + XCHAL_DCACHE_IS_COHERENT || \ + XCHAL_HAVE_ICACHE_DYN_WAYS || \ + XCHAL_HAVE_DCACHE_DYN_WAYS) && \ + (XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RE_2012_0)) + +#if XCHAL_DCACHE_IS_COHERENT +#define _MEMCTL_SNOOP_EN 0x02 /* Enable snoop */ +#else +#define _MEMCTL_SNOOP_EN 0x00 /* Don't enable snoop */ +#endif + +#if (XCHAL_LOOP_BUFFER_SIZE == 0) || XCHAL_ERRATUM_453 +#define _MEMCTL_L0IBUF_EN 0x00 /* No loop buffer or don't enable */ +#else +#define _MEMCTL_L0IBUF_EN 0x01 /* Enable loop buffer */ +#endif + +/* Default MEMCTL values: */ +#if XCHAL_HAVE_ICACHE_DYN_WAYS || XCHAL_HAVE_DCACHE_DYN_WAYS +#define XCHAL_CACHE_MEMCTL_DEFAULT (0xFFFFFF00 | _MEMCTL_L0IBUF_EN) +#else +#define XCHAL_CACHE_MEMCTL_DEFAULT (0x00000000 | _MEMCTL_L0IBUF_EN) +#endif + +#define XCHAL_SNOOP_LB_MEMCTL_DEFAULT (_MEMCTL_SNOOP_EN | _MEMCTL_L0IBUF_EN) + + +/*---------------------------------------------------------------------- + MMU + ----------------------------------------------------------------------*/ + +/* See for more details. */ + +/* Has different semantic in open source headers (where it means HAVE_PTP_MMU), + so comment out starting with RB-2008.3 release; later, might get + get reintroduced as a synonym for XCHAL_HAVE_PTP_MMU instead: */ +/*#define XCHAL_HAVE_MMU XCHAL_HAVE_TLBS*/ /* (DEPRECATED; use XCHAL_HAVE_TLBS instead) */ + +/* Indexing macros: */ +#define _XCHAL_ITLB_SET(n,_what) XCHAL_ITLB_SET ## n ## _what +#define XCHAL_ITLB_SET(n,what) _XCHAL_ITLB_SET(n, _ ## what ) +#define _XCHAL_ITLB_SET_E(n,i,_what) XCHAL_ITLB_SET ## n ## _E ## i ## _what +#define XCHAL_ITLB_SET_E(n,i,what) _XCHAL_ITLB_SET_E(n,i, _ ## what ) +#define _XCHAL_DTLB_SET(n,_what) XCHAL_DTLB_SET ## n ## _what +#define XCHAL_DTLB_SET(n,what) _XCHAL_DTLB_SET(n, _ ## what ) +#define _XCHAL_DTLB_SET_E(n,i,_what) XCHAL_DTLB_SET ## n ## _E ## i ## _what +#define XCHAL_DTLB_SET_E(n,i,what) _XCHAL_DTLB_SET_E(n,i, _ ## what ) +/* + * Example use: XCHAL_ITLB_SET(XCHAL_ITLB_ARF_SET0,ENTRIES) + * to get the value of XCHAL_ITLB_SET_ENTRIES where is the first auto-refill set. + */ + +/* Number of entries per autorefill way: */ +#define XCHAL_ITLB_ARF_ENTRIES (1< 0 && XCHAL_DTLB_ARF_WAYS > 0 && XCHAL_MMU_RINGS >= 2 +# define XCHAL_HAVE_PTP_MMU 1 /* have full MMU (with page table [autorefill] and protection) */ +#else +# define XCHAL_HAVE_PTP_MMU 0 /* don't have full MMU */ +#endif +#endif + +/* + * For full MMUs, report kernel RAM segment and kernel I/O segment static page mappings: + */ +#if XCHAL_HAVE_PTP_MMU && !XCHAL_HAVE_SPANNING_WAY +#define XCHAL_KSEG_CACHED_VADDR 0xD0000000 /* virt.addr of kernel RAM cached static map */ +#define XCHAL_KSEG_CACHED_PADDR 0x00000000 /* phys.addr of kseg_cached */ +#define XCHAL_KSEG_CACHED_SIZE 0x08000000 /* size in bytes of kseg_cached (assumed power of 2!!!) */ +#define XCHAL_KSEG_BYPASS_VADDR 0xD8000000 /* virt.addr of kernel RAM bypass (uncached) static map */ +#define XCHAL_KSEG_BYPASS_PADDR 0x00000000 /* phys.addr of kseg_bypass */ +#define XCHAL_KSEG_BYPASS_SIZE 0x08000000 /* size in bytes of kseg_bypass (assumed power of 2!!!) */ + +#define XCHAL_KIO_CACHED_VADDR 0xE0000000 /* virt.addr of kernel I/O cached static map */ +#define XCHAL_KIO_CACHED_PADDR 0xF0000000 /* phys.addr of kio_cached */ +#define XCHAL_KIO_CACHED_SIZE 0x10000000 /* size in bytes of kio_cached (assumed power of 2!!!) */ +#define XCHAL_KIO_BYPASS_VADDR 0xF0000000 /* virt.addr of kernel I/O bypass (uncached) static map */ +#define XCHAL_KIO_BYPASS_PADDR 0xF0000000 /* phys.addr of kio_bypass */ +#define XCHAL_KIO_BYPASS_SIZE 0x10000000 /* size in bytes of kio_bypass (assumed power of 2!!!) */ + +#define XCHAL_SEG_MAPPABLE_VADDR 0x00000000 /* start of largest non-static-mapped virtual addr area */ +#define XCHAL_SEG_MAPPABLE_SIZE 0xD0000000 /* size in bytes of " */ +/* define XCHAL_SEG_MAPPABLE2_xxx if more areas present, sorted in order of descending size. */ +#endif + + +/*---------------------------------------------------------------------- + MISC + ----------------------------------------------------------------------*/ + +/* Data alignment required if used for instructions: */ +#if XCHAL_INST_FETCH_WIDTH > XCHAL_DATA_WIDTH +# define XCHAL_ALIGN_MAX XCHAL_INST_FETCH_WIDTH +#else +# define XCHAL_ALIGN_MAX XCHAL_DATA_WIDTH +#endif + +/* + * Names kept for backward compatibility. + * (Here "RELEASE" is now a misnomer; these are product *versions*, not the releases + * under which they are released. In the T10##.# era there was no distinction.) + */ +#define XCHAL_HW_RELEASE_MAJOR XCHAL_HW_VERSION_MAJOR +#define XCHAL_HW_RELEASE_MINOR XCHAL_HW_VERSION_MINOR +#define XCHAL_HW_RELEASE_NAME XCHAL_HW_VERSION_NAME + + + + +/*---------------------------------------------------------------------- + COPROCESSORS and EXTRA STATE + ----------------------------------------------------------------------*/ + +#define XCHAL_EXTRA_SA_SIZE XCHAL_NCP_SA_SIZE +#define XCHAL_EXTRA_SA_ALIGN XCHAL_NCP_SA_ALIGN +#define XCHAL_CPEXTRA_SA_SIZE XCHAL_TOTAL_SA_SIZE +#define XCHAL_CPEXTRA_SA_ALIGN XCHAL_TOTAL_SA_ALIGN + +#if defined (_ASMLANGUAGE) || defined (__ASSEMBLER__) + +/* Invoked at start of save area load/store sequence macro to setup macro + * internal offsets. Not usually invoked directly. + * continue 0 for 1st sequence, 1 for subsequent consecutive ones. + * totofs offset from original ptr to next load/store location. + */ +.macro xchal_sa_start continue totofs +.ifeq \continue +.set .Lxchal_pofs_, 0 /* offset from original ptr to current \ptr */ +.set .Lxchal_ofs_, 0 /* offset from current \ptr to next load/store location */ +.endif +.if \totofs + 1 /* if totofs specified (not -1) */ +.set .Lxchal_ofs_, \totofs - .Lxchal_pofs_ /* specific offset from original ptr */ +.endif +.endm + +/* Align portion of save area and bring ptr in range if necessary. + * Used by save area load/store sequences. Not usually invoked directly. + * Allows combining multiple (sub-)sequences arbitrarily. + * ptr pointer to save area (may be off, see .Lxchal_pofs_) + * minofs,maxofs range of offset from cur ptr to next load/store loc; + * minofs <= 0 <= maxofs (0 must always be valid offset) + * range must be within +/- 30kB or so. + * ofsalign alignment granularity of minofs .. maxofs (pow of 2) + * (restriction on offset from ptr to next load/store loc) + * totalign align from orig ptr to next load/store loc (pow of 2) + */ +.macro xchal_sa_align ptr minofs maxofs ofsalign totalign +/* First align where we start accessing the next register + * per \totalign relative to original ptr (i.e. start of the save area): + */ +.set .Lxchal_ofs_, ((.Lxchal_pofs_ + .Lxchal_ofs_ + \totalign - 1) & -\totalign) - .Lxchal_pofs_ +/* If necessary, adjust \ptr to bring .Lxchal_ofs_ in acceptable range: */ +.if (((\maxofs) - .Lxchal_ofs_) & 0xC0000000) | ((.Lxchal_ofs_ - (\minofs)) & 0xC0000000) | (.Lxchal_ofs_ & (\ofsalign - 1)) +.set .Ligmask, 0xFFFFFFFF /* TODO: optimize to addmi, per aligns and .Lxchal_ofs_ */ +addi \ptr, \ptr, (.Lxchal_ofs_ & .Ligmask) +.set .Lxchal_pofs_, .Lxchal_pofs_ + (.Lxchal_ofs_ & .Ligmask) +.set .Lxchal_ofs_, (.Lxchal_ofs_ & ~.Ligmask) +.endif +.endm +/* + * We could optimize for addi to expand to only addmi instead of + * "addmi;addi", where possible. Here's a partial example how: + * .set .Lmaxmask, -(\ofsalign) & -(\totalign) + * .if (((\maxofs) + ~.Lmaxmask + 1) & 0xFFFFFF00) && ((.Lxchal_ofs_ & ~.Lmaxmask) == 0) + * .set .Ligmask, 0xFFFFFF00 + * .elif ... ditto for negative ofs range ... + * .set .Ligmask, 0xFFFFFF00 + * .set ... adjust per offset ... + * .else + * .set .Ligmask, 0xFFFFFFFF + * .endif + */ + +/* Invoke this after xchal_XXX_{load,store} macros to restore \ptr. */ +.macro xchal_sa_ptr_restore ptr +.if .Lxchal_pofs_ +addi \ptr, \ptr, - .Lxchal_pofs_ +.set .Lxchal_ofs_, .Lxchal_ofs_ + .Lxchal_pofs_ +.set .Lxchal_pofs_, 0 +.endif +.endm + +/* + * Use as eg: + * xchal_atmps_store a1, SOMEOFS, XCHAL_SA_NUM_ATMPS, a4, a5 + * xchal_ncp_load a2, a0,a3,a4,a5 + * xchal_atmps_load a1, SOMEOFS, XCHAL_SA_NUM_ATMPS, a4, a5 + * + * Specify only the ARs you *haven't* saved/restored already, up to 4. + * They *must* be the *last* ARs (in same order) specified to save area + * load/store sequences. In the example above, a0 and a3 were already + * saved/restored and unused (thus available) but a4 and a5 were not. + */ +#define xchal_atmps_store xchal_atmps_loadstore s32i, +#define xchal_atmps_load xchal_atmps_loadstore l32i, +.macro xchal_atmps_loadstore inst ptr offset nreq aa = 0 ab = 0 ac = 0 ad = 0 + .set .Lnsaved_, 0 + .irp reg, \aa, \ab, \ac, \ad + .ifeq 0x\reg ; .set .Lnsaved_, .Lnsaved_ + 1 ; .endif +.endr +.set .Laofs_, 0 +.irp reg, \aa, \ab, \ac, \ad +.ifgt (\nreq) - .Lnsaved_ +\inst \reg, \ptr, .Laofs_ + \offset +.set .Laofs_, .Laofs_ + 4 +.set .Lnsaved_, .Lnsaved_ + 1 +.endif +.endr +.endm + +/*#define xchal_ncp_load_a2 xchal_ncp_load a2,a3,a4,a5,a6*/ +/*#define xchal_ncp_store_a2 xchal_ncp_store a2,a3,a4,a5,a6*/ +#define xchal_extratie_load xchal_ncptie_load +#define xchal_extratie_store xchal_ncptie_store +#define xchal_extratie_load_a2 xchal_ncptie_load a2,a3,a4,a5,a6 +#define xchal_extratie_store_a2 xchal_ncptie_store a2,a3,a4,a5,a6 +#define xchal_extra_load xchal_ncp_load +#define xchal_extra_store xchal_ncp_store +#define xchal_extra_load_a2 xchal_ncp_load a2,a3,a4,a5,a6 +#define xchal_extra_store_a2 xchal_ncp_store a2,a3,a4,a5,a6 +#define xchal_extra_load_funcbody xchal_ncp_load a2,a3,a4,a5,a6 +#define xchal_extra_store_funcbody xchal_ncp_store a2,a3,a4,a5,a6 +#define xchal_cp0_store_a2 xchal_cp0_store a2,a3,a4,a5,a6 +#define xchal_cp0_load_a2 xchal_cp0_load a2,a3,a4,a5,a6 +#define xchal_cp1_store_a2 xchal_cp1_store a2,a3,a4,a5,a6 +#define xchal_cp1_load_a2 xchal_cp1_load a2,a3,a4,a5,a6 +#define xchal_cp2_store_a2 xchal_cp2_store a2,a3,a4,a5,a6 +#define xchal_cp2_load_a2 xchal_cp2_load a2,a3,a4,a5,a6 +#define xchal_cp3_store_a2 xchal_cp3_store a2,a3,a4,a5,a6 +#define xchal_cp3_load_a2 xchal_cp3_load a2,a3,a4,a5,a6 +#define xchal_cp4_store_a2 xchal_cp4_store a2,a3,a4,a5,a6 +#define xchal_cp4_load_a2 xchal_cp4_load a2,a3,a4,a5,a6 +#define xchal_cp5_store_a2 xchal_cp5_store a2,a3,a4,a5,a6 +#define xchal_cp5_load_a2 xchal_cp5_load a2,a3,a4,a5,a6 +#define xchal_cp6_store_a2 xchal_cp6_store a2,a3,a4,a5,a6 +#define xchal_cp6_load_a2 xchal_cp6_load a2,a3,a4,a5,a6 +#define xchal_cp7_store_a2 xchal_cp7_store a2,a3,a4,a5,a6 +#define xchal_cp7_load_a2 xchal_cp7_load a2,a3,a4,a5,a6 + +/* Empty placeholder macros for undefined coprocessors: */ +#if (XCHAL_CP_MASK & ~XCHAL_CP_PORT_MASK) == 0 +# if XCHAL_CP0_SA_SIZE == 0 +.macro xchal_cp0_store p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp0_load p a b c d continue = 0 ofs = -1 select = -1 ; .endm +# endif +# if XCHAL_CP1_SA_SIZE == 0 +.macro xchal_cp1_store p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp1_load p a b c d continue = 0 ofs = -1 select = -1 ; .endm +# endif +# if XCHAL_CP2_SA_SIZE == 0 +.macro xchal_cp2_store p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp2_load p a b c d continue = 0 ofs = -1 select = -1 ; .endm +# endif +# if XCHAL_CP3_SA_SIZE == 0 +.macro xchal_cp3_store p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp3_load p a b c d continue = 0 ofs = -1 select = -1 ; .endm +# endif +# if XCHAL_CP4_SA_SIZE == 0 +.macro xchal_cp4_store p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp4_load p a b c d continue = 0 ofs = -1 select = -1 ; .endm +# endif +# if XCHAL_CP5_SA_SIZE == 0 +.macro xchal_cp5_store p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp5_load p a b c d continue = 0 ofs = -1 select = -1 ; .endm +# endif +# if XCHAL_CP6_SA_SIZE == 0 +.macro xchal_cp6_store p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp6_load p a b c d continue = 0 ofs = -1 select = -1 ; .endm +# endif +# if XCHAL_CP7_SA_SIZE == 0 +.macro xchal_cp7_store p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp7_load p a b c d continue = 0 ofs = -1 select = -1 ; .endm +# endif +#endif + +/******************** + * Macros to create functions that save and restore the state of *any* TIE + * coprocessor (by dynamic index). + */ + +/* + * Macro that expands to the body of a function + * that stores the selected coprocessor's state (registers etc). + * Entry: a2 = ptr to save area in which to save cp state + * a3 = coprocessor number + * Exit: any register a2-a15 (?) may have been clobbered. + */ +.macro xchal_cpi_store_funcbody +#if (XCHAL_CP_MASK & ~XCHAL_CP_PORT_MASK) +# if XCHAL_CP0_SA_SIZE +bnez a3, 99f +xchal_cp0_store_a2 +j 90f +99: +# endif +# if XCHAL_CP1_SA_SIZE +bnei a3, 1, 99f +xchal_cp1_store_a2 +j 90f +99: +# endif +# if XCHAL_CP2_SA_SIZE +bnei a3, 2, 99f +xchal_cp2_store_a2 +j 90f +99: +# endif +# if XCHAL_CP3_SA_SIZE +bnei a3, 3, 99f +xchal_cp3_store_a2 +j 90f +99: +# endif +# if XCHAL_CP4_SA_SIZE +bnei a3, 4, 99f +xchal_cp4_store_a2 +j 90f +99: +# endif +# if XCHAL_CP5_SA_SIZE +bnei a3, 5, 99f +xchal_cp5_store_a2 +j 90f +99: +# endif +# if XCHAL_CP6_SA_SIZE +bnei a3, 6, 99f +xchal_cp6_store_a2 +j 90f +99: +# endif +# if XCHAL_CP7_SA_SIZE +bnei a3, 7, 99f +xchal_cp7_store_a2 +j 90f +99: +# endif +90: +#endif +.endm + +/* + * Macro that expands to the body of a function + * that loads the selected coprocessor's state (registers etc). + * Entry: a2 = ptr to save area from which to restore cp state + * a3 = coprocessor number + * Exit: any register a2-a15 (?) may have been clobbered. + */ +.macro xchal_cpi_load_funcbody +#if (XCHAL_CP_MASK & ~XCHAL_CP_PORT_MASK) +# if XCHAL_CP0_SA_SIZE +bnez a3, 99f +xchal_cp0_load_a2 +j 90f +99: +# endif +# if XCHAL_CP1_SA_SIZE +bnei a3, 1, 99f +xchal_cp1_load_a2 +j 90f +99: +# endif +# if XCHAL_CP2_SA_SIZE +bnei a3, 2, 99f +xchal_cp2_load_a2 +j 90f +99: +# endif +# if XCHAL_CP3_SA_SIZE +bnei a3, 3, 99f +xchal_cp3_load_a2 +j 90f +99: +# endif +# if XCHAL_CP4_SA_SIZE +bnei a3, 4, 99f +xchal_cp4_load_a2 +j 90f +99: +# endif +# if XCHAL_CP5_SA_SIZE +bnei a3, 5, 99f +xchal_cp5_load_a2 +j 90f +99: +# endif +# if XCHAL_CP6_SA_SIZE +bnei a3, 6, 99f +xchal_cp6_load_a2 +j 90f +99: +# endif +# if XCHAL_CP7_SA_SIZE +bnei a3, 7, 99f +xchal_cp7_load_a2 +j 90f +99: +# endif +90: +#endif +.endm + +#endif /*_ASMLANGUAGE or __ASSEMBLER__*/ + + +/* Other default macros for undefined coprocessors: */ +#ifndef XCHAL_CP0_NAME +# define XCHAL_CP0_NAME 0 +# define XCHAL_CP0_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP0_SA_CONTENTS_LIBDB /* empty */ +#endif +#ifndef XCHAL_CP1_NAME +# define XCHAL_CP1_NAME 0 +# define XCHAL_CP1_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP1_SA_CONTENTS_LIBDB /* empty */ +#endif +#ifndef XCHAL_CP2_NAME +# define XCHAL_CP2_NAME 0 +# define XCHAL_CP2_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP2_SA_CONTENTS_LIBDB /* empty */ +#endif +#ifndef XCHAL_CP3_NAME +# define XCHAL_CP3_NAME 0 +# define XCHAL_CP3_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP3_SA_CONTENTS_LIBDB /* empty */ +#endif +#ifndef XCHAL_CP4_NAME +# define XCHAL_CP4_NAME 0 +# define XCHAL_CP4_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP4_SA_CONTENTS_LIBDB /* empty */ +#endif +#ifndef XCHAL_CP5_NAME +# define XCHAL_CP5_NAME 0 +# define XCHAL_CP5_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP5_SA_CONTENTS_LIBDB /* empty */ +#endif +#ifndef XCHAL_CP6_NAME +# define XCHAL_CP6_NAME 0 +# define XCHAL_CP6_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP6_SA_CONTENTS_LIBDB /* empty */ +#endif +#ifndef XCHAL_CP7_NAME +# define XCHAL_CP7_NAME 0 +# define XCHAL_CP7_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP7_SA_CONTENTS_LIBDB /* empty */ +#endif + +#if XCHAL_CP_MASK == 0 +/* Filler info for unassigned coprocessors, to simplify arrays etc: */ +#define XCHAL_CP0_SA_SIZE 0 +#define XCHAL_CP0_SA_ALIGN 1 +#define XCHAL_CP1_SA_SIZE 0 +#define XCHAL_CP1_SA_ALIGN 1 +#define XCHAL_CP2_SA_SIZE 0 +#define XCHAL_CP2_SA_ALIGN 1 +#define XCHAL_CP3_SA_SIZE 0 +#define XCHAL_CP3_SA_ALIGN 1 +#define XCHAL_CP4_SA_SIZE 0 +#define XCHAL_CP4_SA_ALIGN 1 +#define XCHAL_CP5_SA_SIZE 0 +#define XCHAL_CP5_SA_ALIGN 1 +#define XCHAL_CP6_SA_SIZE 0 +#define XCHAL_CP6_SA_ALIGN 1 +#define XCHAL_CP7_SA_SIZE 0 +#define XCHAL_CP7_SA_ALIGN 1 +#endif + + +/* Indexing macros: */ +#define _XCHAL_CP_SA_SIZE(n) XCHAL_CP ## n ## _SA_SIZE +#define XCHAL_CP_SA_SIZE(n) _XCHAL_CP_SA_SIZE(n) /* n = 0 .. 7 */ +#define _XCHAL_CP_SA_ALIGN(n) XCHAL_CP ## n ## _SA_ALIGN +#define XCHAL_CP_SA_ALIGN(n) _XCHAL_CP_SA_ALIGN(n) /* n = 0 .. 7 */ + +#define XCHAL_CPEXTRA_SA_SIZE_TOR2 XCHAL_CPEXTRA_SA_SIZE /* Tor2Beta only - do not use */ + +/* Link-time HAL global variables that report coprocessor numbers by name + (names are case-preserved from the original TIE): */ +#if !defined(_ASMLANGUAGE) && !defined(_NOCLANGUAGE) && !defined(__ASSEMBLER__) +# define _XCJOIN(a,b) a ## b +# define XCJOIN(a,b) _XCJOIN(a,b) +# ifdef XCHAL_CP0_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_, XCHAL_CP0_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_, XCHAL_CP0_IDENT); +# endif +# ifdef XCHAL_CP1_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_, XCHAL_CP1_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_, XCHAL_CP1_IDENT); +# endif +# ifdef XCHAL_CP2_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_, XCHAL_CP2_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_, XCHAL_CP2_IDENT); +# endif +# ifdef XCHAL_CP3_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_, XCHAL_CP3_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_, XCHAL_CP3_IDENT); +# endif +# ifdef XCHAL_CP4_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_, XCHAL_CP4_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_, XCHAL_CP4_IDENT); +# endif +# ifdef XCHAL_CP5_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_, XCHAL_CP5_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_, XCHAL_CP5_IDENT); +# endif +# ifdef XCHAL_CP6_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_, XCHAL_CP6_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_, XCHAL_CP6_IDENT); +# endif +# ifdef XCHAL_CP7_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_, XCHAL_CP7_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_, XCHAL_CP7_IDENT); +# endif +#endif + + + + +/*---------------------------------------------------------------------- + DERIVED + ----------------------------------------------------------------------*/ + +#if XCHAL_HAVE_BE +#define XCHAL_INST_ILLN 0xD60F /* 2-byte illegal instruction, msb-first */ +#define XCHAL_INST_ILLN_BYTE0 0xD6 /* 2-byte illegal instruction, 1st byte */ +#define XCHAL_INST_ILLN_BYTE1 0x0F /* 2-byte illegal instruction, 2nd byte */ +#else +#define XCHAL_INST_ILLN 0xF06D /* 2-byte illegal instruction, lsb-first */ +#define XCHAL_INST_ILLN_BYTE0 0x6D /* 2-byte illegal instruction, 1st byte */ +#define XCHAL_INST_ILLN_BYTE1 0xF0 /* 2-byte illegal instruction, 2nd byte */ +#endif +/* Belongs in xtensa/hal.h: */ +#define XTHAL_INST_ILL 0x000000 /* 3-byte illegal instruction */ + + +/* + * Because information as to exactly which hardware version is targeted + * by a given software build is not always available, compile-time HAL + * Hardware-Release "_AT" macros are fuzzy (return 0, 1, or XCHAL_MAYBE): + * (Here "RELEASE" is now a misnomer; these are product *versions*, not the releases + * under which they are released. In the T10##.# era there was no distinction.) + */ +#if XCHAL_HW_CONFIGID_RELIABLE +# define XCHAL_HW_RELEASE_AT_OR_BELOW(major,minor) (XTHAL_REL_LE( XCHAL_HW_VERSION_MAJOR,XCHAL_HW_VERSION_MINOR, major,minor ) ? 1 : 0) +# define XCHAL_HW_RELEASE_AT_OR_ABOVE(major,minor) (XTHAL_REL_GE( XCHAL_HW_VERSION_MAJOR,XCHAL_HW_VERSION_MINOR, major,minor ) ? 1 : 0) +# define XCHAL_HW_RELEASE_AT(major,minor) (XTHAL_REL_EQ( XCHAL_HW_VERSION_MAJOR,XCHAL_HW_VERSION_MINOR, major,minor ) ? 1 : 0) +# define XCHAL_HW_RELEASE_MAJOR_AT(major) ((XCHAL_HW_VERSION_MAJOR == (major)) ? 1 : 0) +#else +# define XCHAL_HW_RELEASE_AT_OR_BELOW(major,minor) ( ((major) < 1040 && XCHAL_HAVE_XEA2) ? 0 \ + : ((major) > 1050 && XCHAL_HAVE_XEA1) ? 1 \ + : XTHAL_MAYBE ) +# define XCHAL_HW_RELEASE_AT_OR_ABOVE(major,minor) ( ((major) >= 2000 && XCHAL_HAVE_XEA1) ? 0 \ + : (XTHAL_REL_LE(major,minor, 1040,0) && XCHAL_HAVE_XEA2) ? 1 \ + : XTHAL_MAYBE ) +# define XCHAL_HW_RELEASE_AT(major,minor) ( (((major) < 1040 && XCHAL_HAVE_XEA2) || \ + ((major) >= 2000 && XCHAL_HAVE_XEA1)) ? 0 : XTHAL_MAYBE) +# define XCHAL_HW_RELEASE_MAJOR_AT(major) XCHAL_HW_RELEASE_AT(major,0) +#endif + + +#endif /*XTENSA_CONFIG_CORE_H*/ diff --git a/components/xtensa/esp32s3/include/xtensa/config/defs.h b/components/xtensa/esp32s3/include/xtensa/config/defs.h new file mode 100644 index 0000000000..65bf2cea4f --- /dev/null +++ b/components/xtensa/esp32s3/include/xtensa/config/defs.h @@ -0,0 +1,38 @@ +/* Definitions for Xtensa instructions, types, and protos. */ + +/* Customer ID=15127; Build=0x86d67; Copyright (c) 2003-2004 Tensilica Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +/* NOTE: This file exists only for backward compatibility with T1050 + and earlier Xtensa releases. It includes only a subset of the + available header files. */ + +#ifndef _XTENSA_BASE_HEADER +#define _XTENSA_BASE_HEADER + +#ifdef __XTENSA__ + +#include +#include +#include + +#endif /* __XTENSA__ */ +#endif /* !_XTENSA_BASE_HEADER */ diff --git a/components/xtensa/esp32s3/include/xtensa/config/extreg.h b/components/xtensa/esp32s3/include/xtensa/config/extreg.h new file mode 100644 index 0000000000..3afb5651b9 --- /dev/null +++ b/components/xtensa/esp32s3/include/xtensa/config/extreg.h @@ -0,0 +1,21 @@ +/* + * ESP32-S3 External Register symbolic names + */ + +// Copyright 2020 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#define DSRSET 0x10200C \ No newline at end of file diff --git a/components/xtensa/esp32s3/include/xtensa/config/specreg.h b/components/xtensa/esp32s3/include/xtensa/config/specreg.h new file mode 100644 index 0000000000..2b40253c62 --- /dev/null +++ b/components/xtensa/esp32s3/include/xtensa/config/specreg.h @@ -0,0 +1,119 @@ +/* + * Xtensa Special Register symbolic names + */ + +/* $Id: //depot/rel/Foxhill/dot.12/Xtensa/SWConfig/hal/specreg.h.tpp#1 $ */ + +/* Customer ID=15127; Build=0x86d67; Copyright (c) 1998-2002 Tensilica Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#ifndef XTENSA_SPECREG_H +#define XTENSA_SPECREG_H + +/* Include these special register bitfield definitions, for historical reasons: */ +#include + + +/* Special registers: */ +#define LBEG 0 +#define LEND 1 +#define LCOUNT 2 +#define SAR 3 +#define BR 4 +#define SCOMPARE1 12 +#define ACCLO 16 +#define ACCHI 17 +#define MR_0 32 +#define MR_1 33 +#define MR_2 34 +#define MR_3 35 +#define WINDOWBASE 72 +#define WINDOWSTART 73 +#define IBREAKENABLE 96 +#define MEMCTL 97 +#define ATOMCTL 99 +#define DDR 104 +#define IBREAKA_0 128 +#define IBREAKA_1 129 +#define DBREAKA_0 144 +#define DBREAKA_1 145 +#define DBREAKC_0 160 +#define DBREAKC_1 161 +#define CONFIGID0 176 +#define EPC_1 177 +#define EPC_2 178 +#define EPC_3 179 +#define EPC_4 180 +#define EPC_5 181 +#define EPC_6 182 +#define EPC_7 183 +#define DEPC 192 +#define EPS_2 194 +#define EPS_3 195 +#define EPS_4 196 +#define EPS_5 197 +#define EPS_6 198 +#define EPS_7 199 +#define CONFIGID1 208 +#define EXCSAVE_1 209 +#define EXCSAVE_2 210 +#define EXCSAVE_3 211 +#define EXCSAVE_4 212 +#define EXCSAVE_5 213 +#define EXCSAVE_6 214 +#define EXCSAVE_7 215 +#define CPENABLE 224 +#define INTERRUPT 226 +#define INTENABLE 228 +#define PS 230 +#define VECBASE 231 +#define EXCCAUSE 232 +#define DEBUGCAUSE 233 +#define CCOUNT 234 +#define PRID 235 +#define ICOUNT 236 +#define ICOUNTLEVEL 237 +#define EXCVADDR 238 +#define CCOMPARE_0 240 +#define CCOMPARE_1 241 +#define CCOMPARE_2 242 +#define MISC_REG_0 244 +#define MISC_REG_1 245 +#define MISC_REG_2 246 +#define MISC_REG_3 247 + +/* Special cases (bases of special register series): */ +#define MR 32 +#define IBREAKA 128 +#define DBREAKA 144 +#define DBREAKC 160 +#define EPC 176 +#define EPS 192 +#define EXCSAVE 208 +#define CCOMPARE 240 + +/* Special names for read-only and write-only interrupt registers: */ +#define INTREAD 226 +#define INTSET 226 +#define INTCLEAR 227 + +#endif /* XTENSA_SPECREG_H */ + diff --git a/components/xtensa/esp32s3/include/xtensa/config/system.h b/components/xtensa/esp32s3/include/xtensa/config/system.h new file mode 100644 index 0000000000..ce96314d61 --- /dev/null +++ b/components/xtensa/esp32s3/include/xtensa/config/system.h @@ -0,0 +1,276 @@ +/* + * xtensa/config/system.h -- HAL definitions that are dependent on SYSTEM configuration + * + * NOTE: The location and contents of this file are highly subject to change. + * + * Source for configuration-independent binaries (which link in a + * configuration-specific HAL library) must NEVER include this file. + * The HAL itself has historically included this file in some instances, + * but this is not appropriate either, because the HAL is meant to be + * core-specific but system independent. + */ + +/* Customer ID=15127; Build=0x86d67; Copyright (c) 2000-2010 Tensilica Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + + +#ifndef XTENSA_CONFIG_SYSTEM_H +#define XTENSA_CONFIG_SYSTEM_H + +/*#include */ + + + +/*---------------------------------------------------------------------- + CONFIGURED SOFTWARE OPTIONS + ----------------------------------------------------------------------*/ + +#define XSHAL_USE_ABSOLUTE_LITERALS 0 /* (sw-only option, whether software uses absolute literals) */ +#define XSHAL_HAVE_TEXT_SECTION_LITERALS 1 /* Set if there is some memory that allows both code and literals. */ + +#define XSHAL_ABI XTHAL_ABI_WINDOWED /* (sw-only option, selected ABI) */ +/* The above maps to one of the following constants: */ +#define XTHAL_ABI_WINDOWED 0 +#define XTHAL_ABI_CALL0 1 +/* Alternatives: */ +/*#define XSHAL_WINDOWED_ABI 1*/ /* set if windowed ABI selected */ +/*#define XSHAL_CALL0_ABI 0*/ /* set if call0 ABI selected */ + +#define XSHAL_CLIB XTHAL_CLIB_NEWLIB /* (sw-only option, selected C library) */ +/* The above maps to one of the following constants: */ +#define XTHAL_CLIB_NEWLIB 0 +#define XTHAL_CLIB_UCLIBC 1 +#define XTHAL_CLIB_XCLIB 2 +/* Alternatives: */ +/*#define XSHAL_NEWLIB 1*/ /* set if newlib C library selected */ +/*#define XSHAL_UCLIBC 0*/ /* set if uCLibC C library selected */ +/*#define XSHAL_XCLIB 0*/ /* set if Xtensa C library selected */ + +#define XSHAL_USE_FLOATING_POINT 1 + +#define XSHAL_FLOATING_POINT_ABI 0 + +/* SW workarounds enabled for HW errata: */ + +/* SW options for functional safety: */ +#define XSHAL_FUNC_SAFETY_ENABLED 0 + +/*---------------------------------------------------------------------- + DEVICE ADDRESSES + ----------------------------------------------------------------------*/ + +/* + * Strange place to find these, but the configuration GUI + * allows moving these around to account for various core + * configurations. Specific boards (and their BSP software) + * will have specific meanings for these components. + */ + +/* I/O Block areas: */ +#define XSHAL_IOBLOCK_CACHED_VADDR 0x70000000 +#define XSHAL_IOBLOCK_CACHED_PADDR 0x70000000 +#define XSHAL_IOBLOCK_CACHED_SIZE 0x0E000000 + +#define XSHAL_IOBLOCK_BYPASS_VADDR 0x90000000 +#define XSHAL_IOBLOCK_BYPASS_PADDR 0x90000000 +#define XSHAL_IOBLOCK_BYPASS_SIZE 0x0E000000 + +/* System ROM: */ +#define XSHAL_ROM_VADDR 0x50000000 +#define XSHAL_ROM_PADDR 0x50000000 +#define XSHAL_ROM_SIZE 0x01000000 +/* Largest available area (free of vectors): */ +#define XSHAL_ROM_AVAIL_VADDR 0x50000000 +#define XSHAL_ROM_AVAIL_VSIZE 0x01000000 + +/* System RAM: */ +#define XSHAL_RAM_VADDR 0x60000000 +#define XSHAL_RAM_PADDR 0x60000000 +#define XSHAL_RAM_VSIZE 0x20000000 +#define XSHAL_RAM_PSIZE 0x20000000 +#define XSHAL_RAM_SIZE XSHAL_RAM_PSIZE +/* Largest available area (free of vectors): */ +#define XSHAL_RAM_AVAIL_VADDR 0x60000000 +#define XSHAL_RAM_AVAIL_VSIZE 0x20000000 + +/* + * Shadow system RAM (same device as system RAM, at different address). + * (Emulation boards need this for the SONIC Ethernet driver + * when data caches are configured for writeback mode.) + * NOTE: on full MMU configs, this points to the BYPASS virtual address + * of system RAM, ie. is the same as XSHAL_RAM_* except that virtual + * addresses are viewed through the BYPASS static map rather than + * the CACHED static map. + */ +#define XSHAL_RAM_BYPASS_VADDR 0xA0000000 +#define XSHAL_RAM_BYPASS_PADDR 0xA0000000 +#define XSHAL_RAM_BYPASS_PSIZE 0x20000000 + +/* Alternate system RAM (different device than system RAM): */ +/*#define XSHAL_ALTRAM_[VP]ADDR ...not configured...*/ +/*#define XSHAL_ALTRAM_SIZE ...not configured...*/ + +/* Some available location in which to place devices in a simulation (eg. XTMP): */ +#define XSHAL_SIMIO_CACHED_VADDR 0xC0000000 +#define XSHAL_SIMIO_BYPASS_VADDR 0xC0000000 +#define XSHAL_SIMIO_PADDR 0xC0000000 +#define XSHAL_SIMIO_SIZE 0x20000000 + + +/*---------------------------------------------------------------------- + * For use by reference testbench exit and diagnostic routines. + */ +#define XSHAL_MAGIC_EXIT 0x0 + +/*---------------------------------------------------------------------- + * DEVICE-ADDRESS DEPENDENT... + * + * Values written to CACHEATTR special register (or its equivalent) + * to enable and disable caches in various modes. + *----------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------- + BACKWARD COMPATIBILITY ... + ----------------------------------------------------------------------*/ + +/* + * NOTE: the following two macros are DEPRECATED. Use the latter + * board-specific macros instead, which are specially tuned for the + * particular target environments' memory maps. + */ +#define XSHAL_CACHEATTR_BYPASS XSHAL_XT2000_CACHEATTR_BYPASS /* disable caches in bypass mode */ +#define XSHAL_CACHEATTR_DEFAULT XSHAL_XT2000_CACHEATTR_DEFAULT /* default setting to enable caches (no writeback!) */ + +/*---------------------------------------------------------------------- + GENERIC + ----------------------------------------------------------------------*/ + +/* For the following, a 512MB region is used if it contains a system (PIF) RAM, + * system (PIF) ROM, local memory, or XLMI. */ + +/* These set any unused 512MB region to cache-BYPASS attribute: */ +#define XSHAL_ALLVALID_CACHEATTR_WRITEBACK 0x22221112 /* enable caches in write-back mode */ +#define XSHAL_ALLVALID_CACHEATTR_WRITEALLOC 0x22221112 /* enable caches in write-allocate mode */ +#define XSHAL_ALLVALID_CACHEATTR_WRITETHRU 0x22221112 /* enable caches in write-through mode */ +#define XSHAL_ALLVALID_CACHEATTR_BYPASS 0x22222222 /* disable caches in bypass mode */ +#define XSHAL_ALLVALID_CACHEATTR_DEFAULT XSHAL_ALLVALID_CACHEATTR_WRITEBACK /* default setting to enable caches */ + +/* These set any unused 512MB region to ILLEGAL attribute: */ +#define XSHAL_STRICT_CACHEATTR_WRITEBACK 0xFFFF111F /* enable caches in write-back mode */ +#define XSHAL_STRICT_CACHEATTR_WRITEALLOC 0xFFFF111F /* enable caches in write-allocate mode */ +#define XSHAL_STRICT_CACHEATTR_WRITETHRU 0xFFFF111F /* enable caches in write-through mode */ +#define XSHAL_STRICT_CACHEATTR_BYPASS 0xFFFF222F /* disable caches in bypass mode */ +#define XSHAL_STRICT_CACHEATTR_DEFAULT XSHAL_STRICT_CACHEATTR_WRITEBACK /* default setting to enable caches */ + +/* These set the first 512MB, if unused, to ILLEGAL attribute to help catch + * NULL-pointer dereference bugs; all other unused 512MB regions are set + * to cache-BYPASS attribute: */ +#define XSHAL_TRAPNULL_CACHEATTR_WRITEBACK 0x2222111F /* enable caches in write-back mode */ +#define XSHAL_TRAPNULL_CACHEATTR_WRITEALLOC 0x2222111F /* enable caches in write-allocate mode */ +#define XSHAL_TRAPNULL_CACHEATTR_WRITETHRU 0x2222111F /* enable caches in write-through mode */ +#define XSHAL_TRAPNULL_CACHEATTR_BYPASS 0x2222222F /* disable caches in bypass mode */ +#define XSHAL_TRAPNULL_CACHEATTR_DEFAULT XSHAL_TRAPNULL_CACHEATTR_WRITEBACK /* default setting to enable caches */ + +/*---------------------------------------------------------------------- + ISS (Instruction Set Simulator) SPECIFIC ... + ----------------------------------------------------------------------*/ + +/* For now, ISS defaults to the TRAPNULL settings: */ +#define XSHAL_ISS_CACHEATTR_WRITEBACK XSHAL_TRAPNULL_CACHEATTR_WRITEBACK +#define XSHAL_ISS_CACHEATTR_WRITEALLOC XSHAL_TRAPNULL_CACHEATTR_WRITEALLOC +#define XSHAL_ISS_CACHEATTR_WRITETHRU XSHAL_TRAPNULL_CACHEATTR_WRITETHRU +#define XSHAL_ISS_CACHEATTR_BYPASS XSHAL_TRAPNULL_CACHEATTR_BYPASS +#define XSHAL_ISS_CACHEATTR_DEFAULT XSHAL_TRAPNULL_CACHEATTR_WRITEBACK + +#define XSHAL_ISS_PIPE_REGIONS 0 +#define XSHAL_ISS_SDRAM_REGIONS 0 + + +/*---------------------------------------------------------------------- + XT2000 BOARD SPECIFIC ... + ----------------------------------------------------------------------*/ + +/* For the following, a 512MB region is used if it contains any system RAM, + * system ROM, local memory, XLMI, or other XT2000 board device or memory. + * Regions containing devices are forced to cache-BYPASS mode regardless + * of whether the macro is _WRITEBACK vs. _BYPASS etc. */ + +/* These set any 512MB region unused on the XT2000 to ILLEGAL attribute: */ +#define XSHAL_XT2000_CACHEATTR_WRITEBACK 0xFF22111F /* enable caches in write-back mode */ +#define XSHAL_XT2000_CACHEATTR_WRITEALLOC 0xFF22111F /* enable caches in write-allocate mode */ +#define XSHAL_XT2000_CACHEATTR_WRITETHRU 0xFF22111F /* enable caches in write-through mode */ +#define XSHAL_XT2000_CACHEATTR_BYPASS 0xFF22222F /* disable caches in bypass mode */ +#define XSHAL_XT2000_CACHEATTR_DEFAULT XSHAL_XT2000_CACHEATTR_WRITEBACK /* default setting to enable caches */ + +#define XSHAL_XT2000_PIPE_REGIONS 0x00000000 /* BusInt pipeline regions */ +#define XSHAL_XT2000_SDRAM_REGIONS 0x00000440 /* BusInt SDRAM regions */ + + +/*---------------------------------------------------------------------- + VECTOR INFO AND SIZES + ----------------------------------------------------------------------*/ + +#define XSHAL_VECTORS_PACKED 0 +#define XSHAL_STATIC_VECTOR_SELECT 1 +#define XSHAL_RESET_VECTOR_VADDR 0x40000400 +#define XSHAL_RESET_VECTOR_PADDR 0x40000400 + +/* + * Sizes allocated to vectors by the system (memory map) configuration. + * These sizes are constrained by core configuration (eg. one vector's + * code cannot overflow into another vector) but are dependent on the + * system or board (or LSP) memory map configuration. + * + * Whether or not each vector happens to be in a system ROM is also + * a system configuration matter, sometimes useful, included here also: + */ +#define XSHAL_RESET_VECTOR_SIZE 0x00000300 +#define XSHAL_RESET_VECTOR_ISROM 0 +#define XSHAL_USER_VECTOR_SIZE 0x00000038 +#define XSHAL_USER_VECTOR_ISROM 0 +#define XSHAL_PROGRAMEXC_VECTOR_SIZE XSHAL_USER_VECTOR_SIZE /* for backward compatibility */ +#define XSHAL_USEREXC_VECTOR_SIZE XSHAL_USER_VECTOR_SIZE /* for backward compatibility */ +#define XSHAL_KERNEL_VECTOR_SIZE 0x00000038 +#define XSHAL_KERNEL_VECTOR_ISROM 0 +#define XSHAL_STACKEDEXC_VECTOR_SIZE XSHAL_KERNEL_VECTOR_SIZE /* for backward compatibility */ +#define XSHAL_KERNELEXC_VECTOR_SIZE XSHAL_KERNEL_VECTOR_SIZE /* for backward compatibility */ +#define XSHAL_DOUBLEEXC_VECTOR_SIZE 0x00000040 +#define XSHAL_DOUBLEEXC_VECTOR_ISROM 0 +#define XSHAL_WINDOW_VECTORS_SIZE 0x00000178 +#define XSHAL_WINDOW_VECTORS_ISROM 0 +#define XSHAL_INTLEVEL2_VECTOR_SIZE 0x00000038 +#define XSHAL_INTLEVEL2_VECTOR_ISROM 0 +#define XSHAL_INTLEVEL3_VECTOR_SIZE 0x00000038 +#define XSHAL_INTLEVEL3_VECTOR_ISROM 0 +#define XSHAL_INTLEVEL4_VECTOR_SIZE 0x00000038 +#define XSHAL_INTLEVEL4_VECTOR_ISROM 0 +#define XSHAL_INTLEVEL5_VECTOR_SIZE 0x00000038 +#define XSHAL_INTLEVEL5_VECTOR_ISROM 0 +#define XSHAL_INTLEVEL6_VECTOR_SIZE 0x00000038 +#define XSHAL_INTLEVEL6_VECTOR_ISROM 0 +#define XSHAL_DEBUG_VECTOR_SIZE XSHAL_INTLEVEL6_VECTOR_SIZE +#define XSHAL_DEBUG_VECTOR_ISROM XSHAL_INTLEVEL6_VECTOR_ISROM +#define XSHAL_NMI_VECTOR_SIZE 0x00000038 +#define XSHAL_NMI_VECTOR_ISROM 0 +#define XSHAL_INTLEVEL7_VECTOR_SIZE XSHAL_NMI_VECTOR_SIZE + + +#endif /*XTENSA_CONFIG_SYSTEM_H*/ diff --git a/components/xtensa/esp32s3/include/xtensa/config/tie-asm.h b/components/xtensa/esp32s3/include/xtensa/config/tie-asm.h new file mode 100644 index 0000000000..aef04226ed --- /dev/null +++ b/components/xtensa/esp32s3/include/xtensa/config/tie-asm.h @@ -0,0 +1,421 @@ +/* + * tie-asm.h -- compile-time HAL assembler definitions dependent on CORE & TIE + * + * NOTE: This header file is not meant to be included directly. + */ + +/* This header file contains assembly-language definitions (assembly + macros, etc.) for this specific Xtensa processor's TIE extensions + and options. It is customized to this Xtensa processor configuration. + + Customer ID=15127; Build=0x86d67; Copyright (c) 1999-2020 Cadence Design Systems Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#ifndef _XTENSA_CORE_TIE_ASM_H +#define _XTENSA_CORE_TIE_ASM_H + +/* Selection parameter values for save-area save/restore macros: */ +/* Option vs. TIE: */ +#define XTHAL_SAS_TIE 0x0001 /* custom extension or coprocessor */ +#define XTHAL_SAS_OPT 0x0002 /* optional (and not a coprocessor) */ +#define XTHAL_SAS_ANYOT 0x0003 /* both of the above */ +/* Whether used automatically by compiler: */ +#define XTHAL_SAS_NOCC 0x0004 /* not used by compiler w/o special opts/code */ +#define XTHAL_SAS_CC 0x0008 /* used by compiler without special opts/code */ +#define XTHAL_SAS_ANYCC 0x000C /* both of the above */ +/* ABI handling across function calls: */ +#define XTHAL_SAS_CALR 0x0010 /* caller-saved */ +#define XTHAL_SAS_CALE 0x0020 /* callee-saved */ +#define XTHAL_SAS_GLOB 0x0040 /* global across function calls (in thread) */ +#define XTHAL_SAS_ANYABI 0x0070 /* all of the above three */ +/* Misc */ +#define XTHAL_SAS_ALL 0xFFFF /* include all default NCP contents */ +#define XTHAL_SAS3(optie,ccuse,abi) ( ((optie) & XTHAL_SAS_ANYOT) \ + | ((ccuse) & XTHAL_SAS_ANYCC) \ + | ((abi) & XTHAL_SAS_ANYABI) ) + + +/* + * Macro to store all non-coprocessor (extra) custom TIE and optional state + * (not including zero-overhead loop registers). + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 4 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_NCP_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters: + * continue If macro invoked as part of a larger store sequence, set to 1 + * if this is not the first in the sequence. Defaults to 0. + * ofs Offset from start of larger sequence (from value of first ptr + * in sequence) at which to store. Defaults to next available space + * (or 0 if is 0). + * select Select what category(ies) of registers to store, as a bitmask + * (see XTHAL_SAS_xxx constants). Defaults to all registers. + * alloc Select what category(ies) of registers to allocate; if any + * category is selected here that is not in , space for + * the corresponding registers is skipped without doing any load. + */ + .macro xchal_ncp_load ptr at1 at2 at3 at4 continue = 0 ofs = -1 select = XTHAL_SAS_ALL alloc = 0 + xchal_sa_start \continue, \ofs + // Optional global registers used by default by the compiler: + .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_GLOB) & ~(\select) + xchal_sa_align \ptr, 0, 1016, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_ + 0 + wur.THREADPTR \at1 // threadptr option + .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 + .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_GLOB) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 1016, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 + .endif + // Optional caller-saved registers used by default by the compiler: + .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 1012, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_ + 0 + wsr.ACCLO \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_ + 4 + wsr.ACCHI \at1 // MAC16 option + .set .Lxchal_ofs_, .Lxchal_ofs_ + 8 + .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 1012, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 8 + .endif + // Optional caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 996, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_ + 0 + wsr.BR \at1 // boolean option + l32i \at1, \ptr, .Lxchal_ofs_ + 4 + wsr.SCOMPARE1 \at1 // conditional store option + l32i \at1, \ptr, .Lxchal_ofs_ + 8 + wsr.M0 \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_ + 12 + wsr.M1 \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_ + 16 + wsr.M2 \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_ + 20 + wsr.M3 \at1 // MAC16 option + .set .Lxchal_ofs_, .Lxchal_ofs_ + 24 + .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 996, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 24 + .endif + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 1016, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_ + 0 + wur.SAR_BYTE \at1 // ureg 13 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 1016, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 + .endif + .endm // xchal_ncp_load + + +#define XCHAL_NCP_NUM_ATMPS 1 + + /* + * Macro to store the state of TIE coprocessor FPU. + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 4 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_CP0_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters are the same as for xchal_ncp_store. + */ +#define xchal_cp_FPU_store xchal_cp0_store + .macro xchal_cp0_store ptr at1 at2 at3 at4 continue = 0 ofs = -1 select = XTHAL_SAS_ALL alloc = 0 + xchal_sa_start \continue, \ofs + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 948, 4, 4 + rur.FCR \at1 // ureg 232 + s32i \at1, \ptr, .Lxchal_ofs_ + 0 + rur.FSR \at1 // ureg 233 + s32i \at1, \ptr, .Lxchal_ofs_ + 4 + ssi f0, \ptr, .Lxchal_ofs_ + 8 + ssi f1, \ptr, .Lxchal_ofs_ + 12 + ssi f2, \ptr, .Lxchal_ofs_ + 16 + ssi f3, \ptr, .Lxchal_ofs_ + 20 + ssi f4, \ptr, .Lxchal_ofs_ + 24 + ssi f5, \ptr, .Lxchal_ofs_ + 28 + ssi f6, \ptr, .Lxchal_ofs_ + 32 + ssi f7, \ptr, .Lxchal_ofs_ + 36 + ssi f8, \ptr, .Lxchal_ofs_ + 40 + ssi f9, \ptr, .Lxchal_ofs_ + 44 + ssi f10, \ptr, .Lxchal_ofs_ + 48 + ssi f11, \ptr, .Lxchal_ofs_ + 52 + ssi f12, \ptr, .Lxchal_ofs_ + 56 + ssi f13, \ptr, .Lxchal_ofs_ + 60 + ssi f14, \ptr, .Lxchal_ofs_ + 64 + ssi f15, \ptr, .Lxchal_ofs_ + 68 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 948, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .endif + .endm // xchal_cp0_store + + /* + * Macro to load the state of TIE coprocessor FPU. + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 4 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_CP0_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters are the same as for xchal_ncp_load. + */ +#define xchal_cp_FPU_load xchal_cp0_load + .macro xchal_cp0_load ptr at1 at2 at3 at4 continue = 0 ofs = -1 select = XTHAL_SAS_ALL alloc = 0 + xchal_sa_start \continue, \ofs + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 948, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_ + 0 + wur.FCR \at1 // ureg 232 + l32i \at1, \ptr, .Lxchal_ofs_ + 4 + wur.FSR \at1 // ureg 233 + lsi f0, \ptr, .Lxchal_ofs_ + 8 + lsi f1, \ptr, .Lxchal_ofs_ + 12 + lsi f2, \ptr, .Lxchal_ofs_ + 16 + lsi f3, \ptr, .Lxchal_ofs_ + 20 + lsi f4, \ptr, .Lxchal_ofs_ + 24 + lsi f5, \ptr, .Lxchal_ofs_ + 28 + lsi f6, \ptr, .Lxchal_ofs_ + 32 + lsi f7, \ptr, .Lxchal_ofs_ + 36 + lsi f8, \ptr, .Lxchal_ofs_ + 40 + lsi f9, \ptr, .Lxchal_ofs_ + 44 + lsi f10, \ptr, .Lxchal_ofs_ + 48 + lsi f11, \ptr, .Lxchal_ofs_ + 52 + lsi f12, \ptr, .Lxchal_ofs_ + 56 + lsi f13, \ptr, .Lxchal_ofs_ + 60 + lsi f14, \ptr, .Lxchal_ofs_ + 64 + lsi f15, \ptr, .Lxchal_ofs_ + 68 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 948, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .endif + .endm // xchal_cp0_load + +#define XCHAL_CP0_NUM_ATMPS 1 + /* + * Macro to store the state of TIE coprocessor cop_ai. + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 16 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_CP3_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters are the same as for xchal_ncp_store. + */ +#define xchal_cp_cop_ai_store xchal_cp3_store + .macro xchal_cp3_store ptr at1 at2 at3 at4 continue = 0 ofs = -1 select = XTHAL_SAS_ALL alloc = 0 + xchal_sa_start \continue, \ofs + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 0, 16, 16 + rur.ACCX_0 \at1 // ureg 0 + s32i \at1, \ptr, .Lxchal_ofs_ + 0 + rur.ACCX_1 \at1 // ureg 1 + s32i \at1, \ptr, .Lxchal_ofs_ + 4 + rur.QACC_H_0 \at1 // ureg 2 + s32i \at1, \ptr, .Lxchal_ofs_ + 8 + rur.QACC_H_1 \at1 // ureg 3 + s32i \at1, \ptr, .Lxchal_ofs_ + 12 + rur.QACC_H_2 \at1 // ureg 4 + s32i \at1, \ptr, .Lxchal_ofs_ + 16 + rur.QACC_H_3 \at1 // ureg 5 + s32i \at1, \ptr, .Lxchal_ofs_ + 20 + rur.QACC_H_4 \at1 // ureg 6 + s32i \at1, \ptr, .Lxchal_ofs_ + 24 + rur.QACC_L_0 \at1 // ureg 7 + s32i \at1, \ptr, .Lxchal_ofs_ + 28 + rur.QACC_L_1 \at1 // ureg 8 + s32i \at1, \ptr, .Lxchal_ofs_ + 32 + rur.QACC_L_2 \at1 // ureg 9 + s32i \at1, \ptr, .Lxchal_ofs_ + 36 + rur.QACC_L_3 \at1 // ureg 10 + s32i \at1, \ptr, .Lxchal_ofs_ + 40 + rur.QACC_L_4 \at1 // ureg 11 + s32i \at1, \ptr, .Lxchal_ofs_ + 44 + st.qr q0, \ptr, .Lxchal_ofs_ + 48 + st.qr q1, \ptr, .Lxchal_ofs_ + 64 + st.qr q2, \ptr, .Lxchal_ofs_ + 80 + st.qr q3, \ptr, .Lxchal_ofs_ + 96 + st.qr q4, \ptr, .Lxchal_ofs_ + 112 + addi \ptr, \ptr, 128 + st.qr q5, \ptr, .Lxchal_ofs_ + 0 + .set .Lxchal_pofs_, .Lxchal_pofs_ + 128 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 16 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 0, 16, 16 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 144 + .endif + .endm // xchal_cp3_store + + /* + * Macro to load the state of TIE coprocessor cop_ai. + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 16 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_CP3_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters are the same as for xchal_ncp_load. + */ +#define xchal_cp_cop_ai_load xchal_cp3_load + .macro xchal_cp3_load ptr at1 at2 at3 at4 continue = 0 ofs = -1 select = XTHAL_SAS_ALL alloc = 0 + xchal_sa_start \continue, \ofs + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 0, 16, 16 + l32i \at1, \ptr, .Lxchal_ofs_ + 0 + wur.ACCX_0 \at1 // ureg 0 + l32i \at1, \ptr, .Lxchal_ofs_ + 4 + wur.ACCX_1 \at1 // ureg 1 + l32i \at1, \ptr, .Lxchal_ofs_ + 8 + wur.QACC_H_0 \at1 // ureg 2 + l32i \at1, \ptr, .Lxchal_ofs_ + 12 + wur.QACC_H_1 \at1 // ureg 3 + l32i \at1, \ptr, .Lxchal_ofs_ + 16 + wur.QACC_H_2 \at1 // ureg 4 + l32i \at1, \ptr, .Lxchal_ofs_ + 20 + wur.QACC_H_3 \at1 // ureg 5 + l32i \at1, \ptr, .Lxchal_ofs_ + 24 + wur.QACC_H_4 \at1 // ureg 6 + l32i \at1, \ptr, .Lxchal_ofs_ + 28 + wur.QACC_L_0 \at1 // ureg 7 + l32i \at1, \ptr, .Lxchal_ofs_ + 32 + wur.QACC_L_1 \at1 // ureg 8 + l32i \at1, \ptr, .Lxchal_ofs_ + 36 + wur.QACC_L_2 \at1 // ureg 9 + l32i \at1, \ptr, .Lxchal_ofs_ + 40 + wur.QACC_L_3 \at1 // ureg 10 + l32i \at1, \ptr, .Lxchal_ofs_ + 44 + wur.QACC_L_4 \at1 // ureg 11 + ld.qr q0, \ptr, .Lxchal_ofs_ + 48 + ld.qr q1, \ptr, .Lxchal_ofs_ + 64 + ld.qr q2, \ptr, .Lxchal_ofs_ + 80 + ld.qr q3, \ptr, .Lxchal_ofs_ + 96 + ld.qr q4, \ptr, .Lxchal_ofs_ + 112 + addi \ptr, \ptr, 128 + ld.qr q5, \ptr, .Lxchal_ofs_ + 0 + .set .Lxchal_pofs_, .Lxchal_pofs_ + 128 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 16 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 0, 16, 16 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 144 + .endif + .endm // xchal_cp3_load + +#define XCHAL_CP3_NUM_ATMPS 1 +#define XCHAL_SA_NUM_ATMPS 1 + + /* Empty macros for unconfigured coprocessors: */ + .macro xchal_cp1_store p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp1_load p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp2_store p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp2_load p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp4_store p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp4_load p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp5_store p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp5_load p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp6_store p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp6_load p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp7_store p a b c d continue = 0 ofs = -1 select = -1 ; .endm +.macro xchal_cp7_load p a b c d continue = 0 ofs = -1 select = -1 ; .endm + +#endif /*_XTENSA_CORE_TIE_ASM_H*/ diff --git a/components/xtensa/esp32s3/include/xtensa/config/tie.h b/components/xtensa/esp32s3/include/xtensa/config/tie.h new file mode 100644 index 0000000000..b093065d3b --- /dev/null +++ b/components/xtensa/esp32s3/include/xtensa/config/tie.h @@ -0,0 +1,200 @@ +/* + * tie.h -- compile-time HAL definitions dependent on CORE & TIE configuration + * + * NOTE: This header file is not meant to be included directly. + */ + +/* This header file describes this specific Xtensa processor's TIE extensions + that extend basic Xtensa core functionality. It is customized to this + Xtensa processor configuration. + + Customer ID=15127; Build=0x86d67; Copyright (c) 1999-2020 Cadence Design Systems Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#ifndef _XTENSA_CORE_TIE_H +#define _XTENSA_CORE_TIE_H + +#define XCHAL_CP_NUM 2 /* number of coprocessors */ +#define XCHAL_CP_MAX 4 /* max CP ID + 1 (0 if none) */ +#define XCHAL_CP_MASK 0x09 /* bitmask of all CPs by ID */ +#define XCHAL_CP_PORT_MASK 0x00 /* bitmask of only port CPs */ + +/* Basic parameters of each coprocessor: */ +#define XCHAL_CP0_NAME "FPU" +#define XCHAL_CP0_IDENT FPU +#define XCHAL_CP0_SA_SIZE 72 /* size of state save area */ +#define XCHAL_CP0_SA_ALIGN 4 /* min alignment of save area */ +#define XCHAL_CP_ID_FPU 0 /* coprocessor ID (0..7) */ +#define XCHAL_CP3_NAME "cop_ai" +#define XCHAL_CP3_IDENT cop_ai +#define XCHAL_CP3_SA_SIZE 144 /* size of state save area */ +#define XCHAL_CP3_SA_ALIGN 16 /* min alignment of save area */ +#define XCHAL_CP_ID_COP_AI 3 /* coprocessor ID (0..7) */ + +/* Filler info for unassigned coprocessors, to simplify arrays etc: */ +#define XCHAL_CP1_SA_SIZE 0 +#define XCHAL_CP1_SA_ALIGN 1 +#define XCHAL_CP2_SA_SIZE 0 +#define XCHAL_CP2_SA_ALIGN 1 +#define XCHAL_CP4_SA_SIZE 0 +#define XCHAL_CP4_SA_ALIGN 1 +#define XCHAL_CP5_SA_SIZE 0 +#define XCHAL_CP5_SA_ALIGN 1 +#define XCHAL_CP6_SA_SIZE 0 +#define XCHAL_CP6_SA_ALIGN 1 +#define XCHAL_CP7_SA_SIZE 0 +#define XCHAL_CP7_SA_ALIGN 1 + +/* Save area for non-coprocessor optional and custom (TIE) state: */ +#define XCHAL_NCP_SA_SIZE 40 +#define XCHAL_NCP_SA_ALIGN 4 + +/* Total save area for optional and custom state (NCP + CPn): */ +#define XCHAL_TOTAL_SA_SIZE 272 /* with 16-byte align padding */ +#define XCHAL_TOTAL_SA_ALIGN 16 /* actual minimum alignment */ + +/* + * Detailed contents of save areas. + * NOTE: caller must define the XCHAL_SA_REG macro (not defined here) + * before expanding the XCHAL_xxx_SA_LIST() macros. + * + * XCHAL_SA_REG(s,ccused,abikind,kind,opt,name,galign,align,asize, + * dbnum,base,regnum,bitsz,gapsz,reset,x...) + * + * s = passed from XCHAL_*_LIST(s), eg. to select how to expand + * ccused = set if used by compiler without special options or code + * abikind = 0 (caller-saved), 1 (callee-saved), or 2 (thread-global) + * kind = 0 (special reg), 1 (TIE user reg), or 2 (TIE regfile reg) + * opt = 0 (custom TIE extension or coprocessor), or 1 (optional reg) + * name = lowercase reg name (no quotes) + * galign = group byte alignment (power of 2) (galign >= align) + * align = register byte alignment (power of 2) + * asize = allocated size in bytes (asize*8 == bitsz + gapsz + padsz) + * (not including any pad bytes required to galign this or next reg) + * dbnum = unique target number f/debug (see ) + * base = reg shortname w/o index (or sr=special, ur=TIE user reg) + * regnum = reg index in regfile, or special/TIE-user reg number + * bitsz = number of significant bits (regfile width, or ur/sr mask bits) + * gapsz = intervening bits, if bitsz bits not stored contiguously + * (padsz = pad bits at end [TIE regfile] or at msbits [ur,sr] of asize) + * reset = register reset value (or 0 if undefined at reset) + * x = reserved for future use (0 until then) + * + * To filter out certain registers, e.g. to expand only the non-global + * registers used by the compiler, you can do something like this: + * + * #define XCHAL_SA_REG(s,ccused,p...) SELCC##ccused(p) + * #define SELCC0(p...) + * #define SELCC1(abikind,p...) SELAK##abikind(p) + * #define SELAK0(p...) REG(p) + * #define SELAK1(p...) REG(p) + * #define SELAK2(p...) + * #define REG(kind,tie,name,galn,aln,asz,csz,dbnum,base,rnum,bsz,rst,x...) \ + * ...what you want to expand... + */ + +#define XCHAL_NCP_SA_NUM 10 +#define XCHAL_NCP_SA_LIST(s) \ + XCHAL_SA_REG(s,1,2,1,1, threadptr, 4, 4, 4,0x03E7, ur,231, 32,0,0,0) \ + XCHAL_SA_REG(s,1,0,0,1, acclo, 4, 4, 4,0x0210, sr,16 , 32,0,0,0) \ + XCHAL_SA_REG(s,1,0,0,1, acchi, 4, 4, 4,0x0211, sr,17 , 8,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, br, 4, 4, 4,0x0204, sr,4 , 16,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, scompare1, 4, 4, 4,0x020C, sr,12 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m0, 4, 4, 4,0x0220, sr,32 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m1, 4, 4, 4,0x0221, sr,33 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m2, 4, 4, 4,0x0222, sr,34 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m3, 4, 4, 4,0x0223, sr,35 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, sar_byte, 4, 4, 4,0x030D, ur,13 , 5,0,0,0) + +#define XCHAL_CP0_SA_NUM 18 +#define XCHAL_CP0_SA_LIST(s) \ + XCHAL_SA_REG(s,0,0,1,0, fcr, 4, 4, 4,0x03E8, ur,232, 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, fsr, 4, 4, 4,0x03E9, ur,233, 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f0, 4, 4, 4,0x0030, f,0 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f1, 4, 4, 4,0x0031, f,1 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f2, 4, 4, 4,0x0032, f,2 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f3, 4, 4, 4,0x0033, f,3 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f4, 4, 4, 4,0x0034, f,4 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f5, 4, 4, 4,0x0035, f,5 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f6, 4, 4, 4,0x0036, f,6 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f7, 4, 4, 4,0x0037, f,7 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f8, 4, 4, 4,0x0038, f,8 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f9, 4, 4, 4,0x0039, f,9 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f10, 4, 4, 4,0x003A, f,10 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f11, 4, 4, 4,0x003B, f,11 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f12, 4, 4, 4,0x003C, f,12 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f13, 4, 4, 4,0x003D, f,13 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f14, 4, 4, 4,0x003E, f,14 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f15, 4, 4, 4,0x003F, f,15 , 32,0,0,0) + +#define XCHAL_CP1_SA_NUM 0 +#define XCHAL_CP1_SA_LIST(s) /* empty */ + +#define XCHAL_CP2_SA_NUM 0 +#define XCHAL_CP2_SA_LIST(s) /* empty */ + +#define XCHAL_CP3_SA_NUM 18 +#define XCHAL_CP3_SA_LIST(s) \ + XCHAL_SA_REG(s,0,0,1,0, accx_0,16, 4, 4,0x0300, ur,0 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, accx_1, 4, 4, 4,0x0301, ur,1 , 8,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_h_0, 4, 4, 4,0x0302, ur,2 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_h_1, 4, 4, 4,0x0303, ur,3 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_h_2, 4, 4, 4,0x0304, ur,4 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_h_3, 4, 4, 4,0x0305, ur,5 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_h_4, 4, 4, 4,0x0306, ur,6 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_l_0, 4, 4, 4,0x0307, ur,7 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_l_1, 4, 4, 4,0x0308, ur,8 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_l_2, 4, 4, 4,0x0309, ur,9 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_l_3, 4, 4, 4,0x030A, ur,10 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_l_4, 4, 4, 4,0x030B, ur,11 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, q0,16,16,16,0x1008, q,0 ,128,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, q1,16,16,16,0x1009, q,1 ,128,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, q2,16,16,16,0x100A, q,2 ,128,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, q3,16,16,16,0x100B, q,3 ,128,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, q4,16,16,16,0x100C, q,4 ,128,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, q5,16,16,16,0x100D, q,5 ,128,0,0,0) + +#define XCHAL_CP4_SA_NUM 0 +#define XCHAL_CP4_SA_LIST(s) /* empty */ + +#define XCHAL_CP5_SA_NUM 0 +#define XCHAL_CP5_SA_LIST(s) /* empty */ + +#define XCHAL_CP6_SA_NUM 0 +#define XCHAL_CP6_SA_LIST(s) /* empty */ + +#define XCHAL_CP7_SA_NUM 0 +#define XCHAL_CP7_SA_LIST(s) /* empty */ + +/* Byte length of instruction from its first nibble (op0 field), per FLIX. */ +#define XCHAL_OP0_FORMAT_LENGTHS 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3 +/* Byte length of instruction from its first byte, per FLIX. */ +#define XCHAL_BYTE0_FORMAT_LENGTHS \ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3 + +#endif /*_XTENSA_CORE_TIE_H*/ diff --git a/components/xtensa/esp32s3/libhal.a b/components/xtensa/esp32s3/libhal.a new file mode 100644 index 0000000000000000000000000000000000000000..42a19a23fab95d1d4a55f812992528bce57bff57 GIT binary patch literal 517178 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 D3)F +#include "esp_attr.h" +#include "esp_err.h" +#include "esp_log.h" +#include "trax.h" +#include "soc/sensitive_reg.h" +#include "sdkconfig.h" + +#define TRACEMEM_MUX_BLK0_NUM 19 +#define TRACEMEM_MUX_BLK1_NUM 20 + +static const char *__attribute__((unused)) TAG = "trax"; + +// IDF-1785 +int trax_enable(trax_ena_select_t which) +{ +#ifndef CONFIG_ESP32S3_TRAX + ESP_LOGE(TAG, "Trax_enable called, but trax is disabled in menuconfig!"); + return ESP_ERR_NO_MEM; +#endif + if (which != TRAX_ENA_PRO) { + return ESP_ERR_INVALID_ARG; + } + // REG_WRITE(DPORT_PMS_OCCUPY_3_REG, BIT(TRACEMEM_MUX_BLK1_NUM-4)); + return ESP_OK; +}