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 zcmY$iNi0gvu;bEKKm~@T#-`?$7N&;A3JL~bDP&SX!P3Oo1T3tOz{SA8n9aao&qg}- zb7NpA_F`bDVME}ySqu#5cytj&hVH8s@4Bmt>FuVz4U}QK4!5pg?7-3j? z7Xu?UY_7(@Xcxr5=$Z$?KF1gsK{!N+fic>NfiWqGfibg>fw5o}17rCu2F7|m2F5l$ z2F6}52F59E42-ikF)%KVV_@9C#K5>?9RuURUkr?=%@`Ojr7rg{&iwtVku)_;-1C8B(#fxN%9>7lOi7jlZF)olYSTjlUW-BlkFk~CYMVL zOg?N3OuGdOc`AaO!?~=n92?@Fx4?JFtr*%aPKPyCJ>%Bje%*t76a4r zbqq|awlOfR-N(SR2=#y0MRe=}8s?)7xzfOy52+F#S_v zU}kk0s;V3yj%z^r(VfmxG@f!RQbf!W-Tf!QvLf!TEy1GCRI2Ik;<49rpA z7?_jv7?|_Z7?_Ll7??}T7?^9eF)%m(VqospV_=>X$G|+th=F=(LBY#Vmgn3#m0?+#pxac zi#HPkORyLNOXNNVmV__{mb8BiEV5$K#K797$G|%C5CiMtYYeQbsu)-|$}zBR-^9Rr$c{98 z!;69Su^0ruPh(&O;a{H^*jVN`)cIOuZ+v7e4wpT(7Y#){}uzlBJ zVEem|ft|&Pft~9b1G``p1H1S;26nk326k0826pW(26iJQ26l^O4D9xP4D7DY7}$Nv z7}$fpF|bFrF|a4FF|emiV_?q}V_+{{#=u^s#=zdNje))0jDfxP7z6thHwN}u*BICr zhB2@&f5yPRE{%bG%P$7@-E|D?htwF@PwZk~KVQbceocvi{jOO=Nk(E$d`fa+az<)= zPG(+ed`^CHc4AUaDg#6+6SovpS7vd1c~NFbYEoiyHdGT-rZ}?-%@`yRsG9P`%3`Q4 zs8vWJP&LJ=CFPkZB^jvd&_tnXL4H881!^XmD3V$%27?qsge$QgVvo^U9%8Ny+&Il~6W_X=r2&<>jX4CKpsfqXA?! z+&2)*GZM>EVP1xaROIAl#v{cCm|u{Xl2QaU1uRg8B#@F=l30|Oi>wJIgscxHhM_ed zQ)_;1Jcic%+<0WInR&$}Xtu(HkhQ|ZFtnoD3RZ?@D@+VoD<}v-0RRmP5Etq%bdmgA zBoVMti5MbqH7O-IN%4tAY4ONe2_%MvAD@(20?&XTHE8-WL1IYyV0>hKxw)nBxtV$K z1tqER1&QgY$Z-djORT^tmz;=hQgIQwNKs~9IyNzwyFqp&7H6i!XQvkBrRG3G3NDJ| zLvR8u$w`9g1oOd}7?iW28o`1UIVJH}C2})!Gn27PWu~O&m1LGw#^)v$Ae&WOkeHVT z@aLG(Dgn7CgTHa))7(j)RN;7j(;!E=~ z3rkbuGgF|Vpac)8J4(~iQj6kK^Gb>`Q&A$PATtfB7#uAn8AYjyDFr3)AOV#)#l}X- zhMCC9U=A&=%u7ZVFDQcB4K^+>7e!k}W_m_WYFTOyBvOh>3*dPJtQ;Iw$f6agiLfw7 zwkEYAIkli9Gd~Z-E5!w=$)!1oAaP{HX((wWw=~Dl3|TriF&R}LIVUl<0M+2siV_qp znR&U1704oa#fiw=ocw%L6O!`tb5avgotu)HSDaY_Pq3hXF3-$M$uCcZMPF`eZhlc^ ze11_%Dl9%gF`8JEnqC~Alb>z`wG%D~R7mqwftAWeA8 z%tOdQ8)=C-pxg)xL#TaN<*;fk%>y-PF||R&v1);oNTAj%BtDQVgGIOmAft$EW6j`UCKWBP1Ol z#4(%(YCnSvf+l-ZOVK2;YsQQ+ur`n|b`6l |Xf0=p(0!2-4lE(h`m7IRVL2^fzd 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 C)P%qQ literal 0 HcmV?d00001 diff --git a/components/xtensa/esp32s3/trax_init.c b/components/xtensa/esp32s3/trax_init.c new file mode 100644 index 0000000000..a2ff55e13d --- /dev/null +++ b/components/xtensa/esp32s3/trax_init.c @@ -0,0 +1,40 @@ +// 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. + +#include +#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; +}