# XTENSA architecture configuration options

# Copyright (c) 2016 Cadence Design Systems, Inc.
# SPDX-License-Identifier: Apache-2.0

menu "XTENSA Options"
	depends on XTENSA

config ARCH
	default "xtensa"

config SIMULATOR_XTENSA
	bool "Simulator Target"
	help
	  Enable if building to run on simulator.

config XTENSA_RESET_VECTOR
	bool "Build reset vector code"
	default y
	help
	  This option controls whether the initial reset vector code is built.
	  This is always needed for the simulator. Real boards may already
	  implement this in boot ROM.

config XTENSA_USE_CORE_CRT1
	bool "Use crt1.S from core"
	default y
	help
	  SoC or boards might define their own __start by setting this setting
	  to false.

config XTENSA_ENABLE_BACKTRACE
	bool "Backtrace on panic exception"
	default y
	depends on SOC_SERIES_ESP32 || SOC_FAMILY_INTEL_ADSP || SOC_XTENSA_DC233C
	help
	  Enable this config option to print backtrace on panic exception

config XTENSA_SMALL_VECTOR_TABLE_ENTRY
	bool "Workaround for small vector table entries"
	help
	  This option enables a small indirection to bypass the size
	  constraint of the vector table entry and moved the default
	  handlers to the end of vector table, renaming them to
	  _Level\LVL\()VectorHelper.

config XTENSA_RPO_CACHE
	bool "Cached/uncached RPO mapping"
	help
	  Support Cached/uncached RPO mapping.

	  A design trick on multi-core hardware is to map memory twice
	  so that it can be seen in both (incoherent) cached mappings
	  and a coherent "shared" area.

if XTENSA_RPO_CACHE
config XTENSA_CACHED_REGION
	int "Cached RPO mapping"
	range 0 7
	help
	  This specifies which 512M region (0-7, as defined by the Xtensa
	  Region Protection Option) contains the "cached" mapping.

config XTENSA_UNCACHED_REGION
	int "Uncached RPO mapping"
	range 0 7
	help
	  As for XTENSA_CACHED_REGION, this specifies which 512M
	  region (0-7) contains the "uncached" mapping.

endif

config XTENSA_CCOUNT_HZ
	int "CCOUNT cycle rate"
	default 1000000
	help
	  Rate in HZ of the Xtensa core as measured by the value of
	  the CCOUNT register.

config XTENSA_MORE_SPIN_RELAX_NOPS
	bool "Use Xtensa specific arch_spin_relax() with more NOPs"
	help
	  Some Xtensa SoCs, especially under SMP, may need extra
	  NOPs after failure to lock a spinlock. This gives
	  the bus extra time to synchronize the RCW transaction
	  among CPUs.

config XTENSA_NUM_SPIN_RELAX_NOPS
	int "Number of NOPs to be used in arch_spin_relax()"
	default 1
	depends on XTENSA_MORE_SPIN_RELAX_NOPS
	help
	  Specify the number of NOPs in Xtensa specific
	  arch_spin_relax().

if CPU_HAS_MMU

config XTENSA_MMU
	bool "Xtensa MMU Support"
	select MMU
	select ARCH_MEM_DOMAIN_SYNCHRONOUS_API if USERSPACE
	select XTENSA_SMALL_VECTOR_TABLE_ENTRY
	select KERNEL_VM_USE_CUSTOM_MEM_RANGE_CHECK if XTENSA_RPO_CACHE
	select CURRENT_THREAD_USE_NO_TLS if USERSPACE
	help
	  Enable support for Xtensa Memory Management Unit.

if XTENSA_MMU

choice
	prompt "PageTable virtual address"
	default XTENSA_MMU_PTEVADDR_20000000
	help
	  The virtual address for Xtensa page table (PTEVADDR).

config XTENSA_MMU_PTEVADDR_20000000
	bool "0x20000000"

endchoice

config XTENSA_MMU_PTEVADDR
	hex
	default 0x20000000 if XTENSA_MMU_PTEVADDR_20000000
	help
	  The virtual address for Xtensa page table (PTEVADDR).

config XTENSA_MMU_PTEVADDR_SHIFT
	int
	default 29 if XTENSA_MMU_PTEVADDR_20000000
	help
	  The bit shift number for the virtual address for Xtensa
	  page table (PTEVADDR).

config XTENSA_MMU_NUM_L1_TABLES
	int "Number of L1 page tables"
	default 1 if !USERSPACE
	default 4
	help
	  This option specifies the maximum number of traslation tables.
	  Translation tables are directly related to the number of
	  memory domains in the target, considering the kernel itself requires one.

config XTENSA_MMU_NUM_L2_TABLES
	int "Number of L2 page tables"
	default 20 if USERSPACE
	default 10
	help
	  Each table can address up to 4MB memory address.

config XTENSA_MMU_DOUBLE_MAP
	bool "Map memory in cached and uncached region"
	help
	  This option specifies that the memory is mapped in two
	  distinct region, cached and uncached.

	config XTENSA_INVALIDATE_MEM_DOMAIN_TLB_ON_SWAP
		bool
		help
		  This invalidates all TLBs referred by the incoming thread's
		  memory domain when swapping page tables.

endif # XTENSA_MMU

config XTENSA_SYSCALL_USE_HELPER
	bool "Use userspace syscall helper"
	default y if "$(ZEPHYR_TOOLCHAIN_VARIANT)" = "xt-clang"
	depends on USERSPACE
	help
	  Use syscall helpers for passing more then 3 arguments.
	  This is a workaround for toolchains where they have
	  issue modeling register usage.

config XTENSA_INSECURE_USERSPACE
	bool
	default y if USERSPACE
	depends on XTENSA_MMU

endif # CPU_HAS_MMU

endmenu
