# General architecture configuration options

# Copyright (c) 2014-2015 Wind River Systems, Inc.
# Copyright (c) 2015 Intel Corporation
# Copyright (c) 2016 Cadence Design Systems, Inc.
# SPDX-License-Identifier: Apache-2.0

# Include these first so that any properties (e.g. defaults) below can be
# overridden (by defining symbols in multiple locations)

# Note: $ARCH might be a glob pattern
source "$(ARCH_DIR)/$(ARCH)/Kconfig"

# Architecture symbols
#
# Should be 'select'ed by low-level symbols like SOC_SERIES_* or, lacking that,
# by SOC_*.

config ARC
	bool
	select ARCH_IS_SET
	select HAS_DTS
	imply XIP
	select ARCH_HAS_THREAD_LOCAL_STORAGE
	help
	  ARC architecture

config ARM
	bool
	select ARCH_IS_SET
	select ARCH_SUPPORTS_COREDUMP if CPU_CORTEX_M
	select HAS_DTS
	# FIXME: current state of the code for all ARM requires this, but
	# is really only necessary for Cortex-M with ARM MPU!
	select GEN_PRIV_STACKS
	select ARCH_HAS_THREAD_LOCAL_STORAGE if CPU_AARCH32_CORTEX_R || CPU_CORTEX_M || CPU_AARCH32_CORTEX_A
	help
	  ARM architecture

config ARM64
	bool
	select ARCH_IS_SET
	select 64BIT
	select HAS_DTS
	select HAS_ARM_SMCCC
	select ARCH_HAS_THREAD_LOCAL_STORAGE
	select USE_SWITCH
	select USE_SWITCH_SUPPORTED
	select IRQ_OFFLOAD_NESTED if IRQ_OFFLOAD
	help
	  ARM64 (AArch64) architecture

config MIPS
	bool
	select ARCH_IS_SET
	select ATOMIC_OPERATIONS_C
	select HAS_DTS
	help
	  MIPS architecture

config SPARC
	bool
	select ARCH_IS_SET
	select HAS_DTS
	select USE_SWITCH
	select USE_SWITCH_SUPPORTED
	select BIG_ENDIAN
	select ATOMIC_OPERATIONS_BUILTIN if SPARC_CASA
	select ATOMIC_OPERATIONS_C if !SPARC_CASA
	select ARCH_HAS_THREAD_LOCAL_STORAGE
	select ARCH_HAS_EXTRA_EXCEPTION_INFO
	help
	  SPARC architecture

config X86
	bool
	select ARCH_IS_SET
	select ATOMIC_OPERATIONS_BUILTIN
	select HAS_DTS
	select ARCH_SUPPORTS_COREDUMP
	select CPU_HAS_MMU
	select ARCH_MEM_DOMAIN_DATA if USERSPACE && !X86_COMMON_PAGE_TABLE
	select ARCH_MEM_DOMAIN_SYNCHRONOUS_API if USERSPACE
	select ARCH_HAS_GDBSTUB if !X86_64
	select ARCH_HAS_TIMING_FUNCTIONS
	select ARCH_HAS_THREAD_LOCAL_STORAGE
	select ARCH_HAS_DEMAND_PAGING
	select IRQ_OFFLOAD_NESTED if IRQ_OFFLOAD
	select NEED_LIBC_MEM_PARTITION if USERSPACE && TIMING_FUNCTIONS \
					  && !BOARD_HAS_TIMING_FUNCTIONS \
					  && !SOC_HAS_TIMING_FUNCTIONS
	help
	  x86 architecture

config NIOS2
	bool
	select ARCH_IS_SET
	select ATOMIC_OPERATIONS_C
	select HAS_DTS
	imply XIP
	select ARCH_HAS_TIMING_FUNCTIONS
	help
	  Nios II Gen 2 architecture

config RISCV
	bool
	select ARCH_IS_SET
	select HAS_DTS
	select ARCH_SUPPORTS_COREDUMP
	select ARCH_HAS_THREAD_LOCAL_STORAGE
	select IRQ_OFFLOAD_NESTED if IRQ_OFFLOAD
	select USE_SWITCH_SUPPORTED
	select USE_SWITCH
	select SCHED_IPI_SUPPORTED if SMP
	imply XIP
	help
	  RISCV architecture

config XTENSA
	bool
	select ARCH_IS_SET
	select HAS_DTS
	select USE_SWITCH
	select USE_SWITCH_SUPPORTED
	select IRQ_OFFLOAD_NESTED if IRQ_OFFLOAD
	imply ATOMIC_OPERATIONS_ARCH
	help
	  Xtensa architecture

config ARCH_POSIX
	bool
	select ARCH_IS_SET
	select HAS_DTS
	select ATOMIC_OPERATIONS_BUILTIN
	select ARCH_HAS_CUSTOM_SWAP_TO_MAIN
	select ARCH_HAS_CUSTOM_BUSY_WAIT
	select ARCH_HAS_THREAD_ABORT
	select NATIVE_APPLICATION
	select HAS_COVERAGE_SUPPORT
	help
	  POSIX (native) architecture

config ARCH_IS_SET
	bool
	help
	  Helper symbol to detect SoCs forgetting to select one of the arch
	  symbols above. See the top-level CMakeLists.txt.

menu "General Architecture Options"

source "$(ARCH_DIR)/common/Kconfig"

module = ARCH
module-str = arch
source "subsys/logging/Kconfig.template.log_config"

module = MPU
module-str = mpu
source "subsys/logging/Kconfig.template.log_config"

config BIG_ENDIAN
	bool
	help
	  This option tells the build system that the target system is big-endian.
	  Little-endian architecture is the default and should leave this option
	  unselected.  This option is selected by arch/$ARCH/Kconfig,
	  soc/**/Kconfig, or boards/**/Kconfig and the user should generally avoid
	  modifying it.  The option is used to select linker script OUTPUT_FORMAT
	  and command line option for gen_isr_tables.py.

config 64BIT
	bool
	help
	  This option tells the build system that the target system is
	  using a 64-bit address space, meaning that pointer and long types
	  are 64 bits wide. This option is selected by arch/$ARCH/Kconfig,
	  soc/**/Kconfig, or boards/**/Kconfig and the user should generally
	  avoid modifying it.

# Workaround for not being able to have commas in macro arguments
DT_CHOSEN_Z_SRAM := zephyr,sram

config SRAM_SIZE
	int "SRAM Size in kB"
	default $(dt_chosen_reg_size_int,$(DT_CHOSEN_Z_SRAM),0,K)
	help
	  The SRAM size in kB. The default value comes from /chosen/zephyr,sram in
	  devicetree. The user should generally avoid changing it via menuconfig or
	  in configuration files.

config SRAM_BASE_ADDRESS
	hex "SRAM Base Address"
	default $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_SRAM))
	help
	  The SRAM base address. The default value comes from from
	  /chosen/zephyr,sram in devicetree. The user should generally avoid
	  changing it via menuconfig or in configuration files.

if ARC || ARM || ARM64 || NIOS2 || X86

# Workaround for not being able to have commas in macro arguments
DT_CHOSEN_Z_FLASH := zephyr,flash

config FLASH_SIZE
	int "Flash Size in kB"
	default $(dt_chosen_reg_size_int,$(DT_CHOSEN_Z_FLASH),0,K) if (XIP && (ARM ||ARM64)) || !ARM
	help
	  This option specifies the size of the flash in kB.  It is normally set by
	  the board's defconfig file and the user should generally avoid modifying
	  it via the menu configuration.

config FLASH_BASE_ADDRESS
	hex "Flash Base Address"
	default $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_FLASH)) if (XIP && (ARM || ARM64)) || !ARM
	help
	  This option specifies the base address of the flash on the board. It is
	  normally set by the board's defconfig file and the user should generally
	  avoid modifying it via the menu configuration.

endif # ARM || ARM64 || ARC || NIOS2 || X86

if ARCH_HAS_TRUSTED_EXECUTION

config TRUSTED_EXECUTION_SECURE
	bool "Trusted Execution: Secure firmware image"
	help
	  Select this option to enable building a Secure firmware
	  image for a platform that supports Trusted Execution. A
	  Secure firmware image will execute in Secure state. It may
	  allow the CPU to execute in Non-Secure (Normal) state.
	  Therefore, a Secure firmware image shall be able to
	  configure security attributions of CPU resources (memory
	  areas, peripherals, interrupts, etc.) as well as to handle
	  faults, related to security violations. It may optionally
	  allow certain functions to be called from the Non-Secure
	  (Normal) domain.

config TRUSTED_EXECUTION_NONSECURE
	depends on !TRUSTED_EXECUTION_SECURE
	bool "Trusted Execution: Non-Secure firmware image"
	help
	  Select this option to enable building a Non-Secure
	  firmware image for a platform that supports Trusted
	  Execution. A Non-Secure firmware image will execute
	  in Non-Secure (Normal) state. Therefore, it shall not
	  access CPU resources (memory areas, peripherals,
	  interrupts etc.) belonging to the Secure domain.

endif # ARCH_HAS_TRUSTED_EXECUTION

config HW_STACK_PROTECTION
	bool "Hardware Stack Protection"
	depends on ARCH_HAS_STACK_PROTECTION
	help
	  Select this option to enable hardware-based platform features to
	  catch stack overflows when the system is running in privileged
	  mode. If CONFIG_USERSPACE is not enabled, the system is always
	  running in privileged mode.

	  Note that this does not necessarily prevent corruption and assertions
	  about the overall system state when a fault is triggered cannot be
	  made.

config USERSPACE
	bool "User mode threads"
	depends on ARCH_HAS_USERSPACE
	depends on RUNTIME_ERROR_CHECKS
	depends on SRAM_REGION_PERMISSIONS
	select THREAD_STACK_INFO
	help
	  When enabled, threads may be created or dropped down to user mode,
	  which has significantly restricted permissions and must interact
	  with the kernel via system calls. See Zephyr documentation for more
	  details about this feature.

	  If a user thread overflows its stack, this will be caught and the
	  kernel itself will be shielded from harm. Enabling this option
	  may or may not catch stack overflows when the system is in
	  privileged mode or handling a system call; to ensure these are always
	  caught, enable CONFIG_HW_STACK_PROTECTION.

config PRIVILEGED_STACK_SIZE
	int "Size of privileged stack"
	default 1024
	depends on ARCH_HAS_USERSPACE
	help
	  This option sets the privileged stack region size that will be used
	  in addition to the user mode thread stack.  During normal execution,
	  this region will be inaccessible from user mode.  During system calls,
	  this region will be utilized by the system call. This value must be
	  a multiple of the minimum stack alignment.

config KOBJECT_TEXT_AREA
	int "Size of kobject text area"
	default 512 if COVERAGE_GCOV
	default 512 if NO_OPTIMIZATIONS
	default 512 if STACK_CANARIES && RISCV
	default 256
	depends on ARCH_HAS_USERSPACE
	help
	  Size of kernel object text area. Used in linker script.

config KOBJECT_DATA_AREA_RESERVE_EXTRA_PERCENT
	int "Reserve extra kobject data area (in percentage)"
	default 100
	depends on ARCH_HAS_USERSPACE
	help
	  Multiplication factor used to calculate the size of placeholder to
	  reserve space for kobject metadata hash table. The hash table is
	  generated via gperf is highly dependent on the absolute addresses of
	  kobjects which might change between prebuilts. To reserve enough
	  space for the hash table during final linking passes to keep
	  kobjects in same place, the size of reserved space is calculated
	  from the first prebuilt plus additional space calculated with
	  this percentage (of the kobject data area in first prebuilt).

config KOBJECT_RODATA_AREA_EXTRA_BYTES
	int "Reserve extra bytes for kobject rodata area"
	default 16
	depends on ARCH_HAS_USERSPACE
	help
	  Reserve a few more bytes for the RODATA region for kobject metadata.
	  This is to account for the uncertainty of tables generated by gperf.

config GEN_PRIV_STACKS
	bool
	help
	  Selected if the architecture requires that privilege elevation stacks
	  be allocated in a separate memory area. This is typical of arches
	  whose MPUs require regions to be power-of-two aligned/sized.

	  FIXME: This should be removed and replaced with checks against
	  CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT, but both ARM and ARC
	  changes will be necessary for this.

config STACK_GROWS_UP
	bool "Stack grows towards higher memory addresses"
	help
	  Select this option if the architecture has upward growing thread
	  stacks. This is not common.

config NO_UNUSED_STACK_INSPECTION
	bool
	help
	  Selected if the architecture will generate a fault if unused stack
	  memory is examined, which is the region between the current stack
	  pointer and the deepest available address in the current stack
	  region.

config MAX_THREAD_BYTES
	int "Bytes to use when tracking object thread permissions"
	default 2
	depends on USERSPACE
	help
	  Every kernel object will have an associated bitfield to store
	  thread permissions for that object. This controls the size of the
	  bitfield (in bytes) and imposes a limit on how many threads can
	  be created in the system.

config DYNAMIC_OBJECTS
	bool "Allow kernel objects to be allocated at runtime"
	depends on USERSPACE
	help
	  Enabling this option allows for kernel objects to be requested from
	  the calling thread's resource pool, at a slight cost in performance
	  due to the supplemental run-time tables required to validate such
	  objects.

	  Objects allocated in this way can be freed with a supervisor-only
	  API call, or when the number of references to that object drops to
	  zero.

config NOCACHE_MEMORY
	bool "Support for uncached memory"
	depends on ARCH_HAS_NOCACHE_MEMORY_SUPPORT
	help
	  Add a "nocache" read-write memory section that is configured to
	  not be cached. This memory section can be used to perform DMA
	  transfers when cache coherence issues are not optimal or can not
	  be solved using cache maintenance operations.

menu "Interrupt Configuration"

config DYNAMIC_INTERRUPTS
	bool "Installation of IRQs at runtime"
	help
	  Enable installation of interrupts at runtime, which will move some
	  interrupt-related data structures to RAM instead of ROM, and
	  on some architectures increase code size.

config GEN_ISR_TABLES
	bool "Use generated IRQ tables"
	help
	  This option controls whether a platform uses the gen_isr_tables
	  script to generate its interrupt tables. This mechanism will create
	  an appropriate hardware vector table and/or software IRQ table.

config GEN_IRQ_VECTOR_TABLE
	bool "Generate an interrupt vector table"
	default y
	depends on GEN_ISR_TABLES
	help
	  This option controls whether a platform using gen_isr_tables
	  needs an interrupt vector table created. Only disable this if the
	  platform does not use a vector table at all, or requires the vector
	  table to be in a format that is not an array of function pointers
	  indexed by IRQ line. In the latter case, the vector table must be
	  supplied by the application or architecture code.

config GEN_SW_ISR_TABLE
	bool "Generate a software ISR table"
	default y
	depends on GEN_ISR_TABLES
	help
	  This option controls whether a platform using gen_isr_tables
	  needs a software ISR table table created. This is an array of struct
	  _isr_table_entry containing the interrupt service routine and supplied
	  parameter.

config ARCH_SW_ISR_TABLE_ALIGN
	int "Alignment size of a software ISR table"
	default 0
	depends on GEN_SW_ISR_TABLE
	help
	  This option controls alignment size of generated
	  _sw_isr_table.  Some architecture needs a software ISR table
	  to be aligned to architecture specific size.  The default
	  size is 0 for no alignment.

config GEN_IRQ_START_VECTOR
	int
	default 0
	depends on GEN_ISR_TABLES
	help
	  On some architectures, part of the vector table may be reserved for
	  system exceptions and is declared separately from the tables
	  created by gen_isr_tables.py. When creating these tables, this value
	  will be subtracted from CONFIG_NUM_IRQS to properly size them.
	  This is a hidden option which needs to be set per architecture and
	  left alone.

config IRQ_OFFLOAD
	bool "IRQ offload"
	depends on TEST
	help
	  Enable irq_offload() API which allows functions to be synchronously
	  run in interrupt context. Only useful for test cases that need
	  to validate the correctness of kernel objects in IRQ context.

config IRQ_OFFLOAD_NESTED
	bool "irq_offload() supports nested IRQs"
	depends on IRQ_OFFLOAD
	help
	  When set by the arch layer, indicates that irq_offload() may
	  legally be called in interrupt context to cause a
	  synchronous nested interrupt on the current CPU.  Not all
	  hardware is capable.

config EXTRA_EXCEPTION_INFO
	bool "Collect extra exception info"
	depends on ARCH_HAS_EXTRA_EXCEPTION_INFO
	help
	  This option enables the collection of extra information, such as
	  register state, when a fault occurs. This information can be useful
	  to collect for post-mortem analysis and debug of issues.

endmenu # Interrupt configuration

config INIT_ARCH_HW_AT_BOOT
	bool "Initialize internal architecture state at boot"
	depends on ARCH_SUPPORTS_ARCH_HW_INIT
	help
	  This option instructs Zephyr to force the initialization
	  of the internal architectural state (for example ARCH-level
	  HW registers and system control blocks) during boot to
	  the reset values as specified by the corresponding
	  architecture manual. The option is useful when the Zephyr
	  firmware image is chain-loaded, for example, by a debugger
	  or a bootloader, and we need to guarantee that the internal
	  states of the architecture core blocks are restored to the
	  reset values (as specified by the architecture).

	  Note: the functionality is architecture-specific. For the
	  implementation details refer to each architecture where
	  this feature is supported.

endmenu

#
# Architecture Capabilities
#

config ARCH_HAS_SINGLE_THREAD_SUPPORT
	bool

config ARCH_HAS_TIMING_FUNCTIONS
	bool

config ARCH_HAS_TRUSTED_EXECUTION
	bool

config ARCH_HAS_STACK_PROTECTION
	bool

config ARCH_HAS_USERSPACE
	bool

config ARCH_HAS_EXECUTABLE_PAGE_BIT
	bool

config ARCH_HAS_NOCACHE_MEMORY_SUPPORT
	bool

config ARCH_HAS_RAMFUNC_SUPPORT
	bool

config ARCH_HAS_NESTED_EXCEPTION_DETECTION
	bool

config ARCH_SUPPORTS_COREDUMP
	bool

config ARCH_SUPPORTS_ARCH_HW_INIT
	bool

config ARCH_HAS_EXTRA_EXCEPTION_INFO
	bool

config ARCH_HAS_GDBSTUB
	bool

config ARCH_HAS_COHERENCE
	bool
	help
	  When selected, the architecture supports the
	  arch_mem_coherent() API and can link into incoherent/cached
	  memory using the ".cached" linker section.

config ARCH_HAS_THREAD_LOCAL_STORAGE
	bool

#
# Other architecture related options
#

config ARCH_HAS_THREAD_ABORT
	bool

#
# Hidden CPU family configs
#

config CPU_HAS_TEE
	bool
	help
	  This option is enabled when the CPU has support for Trusted
	  Execution Environment (e.g. when it has a security attribution
	  unit).

config CPU_HAS_DCLS
	bool
	help
	  This option is enabled when the processor hardware is configured in
	  Dual-redundant Core Lock-step (DCLS) topology.

config CPU_HAS_FPU
	bool
	help
	  This option is enabled when the CPU has hardware floating point
	  unit.

config CPU_HAS_FPU_DOUBLE_PRECISION
	bool
	select CPU_HAS_FPU
	help
	  When enabled, this indicates that the CPU has a double floating point
	  precision unit.

config CPU_HAS_MPU
	bool
	help
	  This option is enabled when the CPU has a Memory Protection Unit (MPU).

config CPU_HAS_MMU
	bool
	help
	  This hidden option is selected when the CPU has a Memory Management Unit
	  (MMU).

config ARCH_HAS_DEMAND_PAGING
	bool
	help
	  This hidden configuration should be selected by the architecture if
	  demand paging is supported.

config ARCH_HAS_RESERVED_PAGE_FRAMES
	bool
	help
	  This hidden configuration should be selected by the architecture if
	  certain RAM page frames need to be marked as reserved and never used for
	  memory mappings. The architecture will need to implement
	  arch_reserved_pages_update().

config ARCH_MAPS_ALL_RAM
	bool
	help
	  This hidden option is selected by the architecture to inform the kernel
	  that all RAM is mapped at boot, and not just the bounds of the Zephyr image.
	  If RAM starts at 0x0, the first page must remain un-mapped to catch NULL
	  pointer dereferences. With this enabled, the kernel will not assume that
	  virtual memory addresses past the kernel image are available for mappings,
	  but instead takes into account an entire RAM mapping instead.

	  This is typically set by architectures which need direct access to all memory.
	  It is the architecture's responsibility to mark reserved memory regions
	  as such in arch_reserved_pages_update().

	  Although the kernel will not disturb this RAM mapping by re-mapping the associated
	  virtual addresses elsewhere, this is limited to only management of the
	  virtual address space. The kernel's page frame ontology will not consider
	  this mapping at all; non-kernel pages will be considered free (unless marked
	  as reserved) and Z_PAGE_FRAME_MAPPED will not be set.

menuconfig MPU
	bool "MPU features"
	depends on CPU_HAS_MPU
	help
	  This option, when enabled, indicates to the core kernel that an MPU
	  is enabled.

if MPU
config MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT
	bool
	help
	  This option is enabled when the MPU requires a power of two alignment
	  and size for MPU regions.

config MPU_REQUIRES_NON_OVERLAPPING_REGIONS
	bool
	help
	  This option is enabled when the MPU requires the active (i.e. enabled)
	  MPU regions to be non-overlapping with each other.

config MPU_GAP_FILLING
	bool "Force MPU to be filling in background memory regions"
	depends on MPU_REQUIRES_NON_OVERLAPPING_REGIONS
	default y if !USERSPACE
	help
	  This Kconfig option instructs the MPU driver to enforce
	  a full kernel SRAM partitioning, when it programs the
	  dynamic MPU regions (user thread stack, PRIV stack guard
	  and application memory domains) during context-switch. We
	  allow this to be a configurable option, in order to be able
	  to switch the option off and have an increased number of MPU
	  regions available for application memory domain programming.

	  Notes:
	  An increased number of MPU regions should only be required,
	  when building with USERSPACE support. As a result, when we
	  build without USERSPACE support, gap filling should always
	  be required.

	  When the option is switched off, access to memory areas not
	  covered by explicit MPU regions is restricted to privileged
	  code on an ARCH-specific basis. Refer to ARCH-specific
	  documentation for more information on how this option is
	  used.

endif # MPU

config SRAM_REGION_PERMISSIONS
	bool "Assign appropriate permissions to kernel areas in SRAM"
	depends on MMU || MPU
	default y
	help
	  This option indicates that memory protection hardware
	  is present, enabled, and regions have been configured at boot for memory
	  ranges within the kernel image.

	  If this option is turned on, certain areas of the kernel image will
	  have the following access policies applied for all threads, including
	  supervisor threads:

	  1) All program text will be have read-only, execute memory permission
	  2) All read-only data will have read-only permission, and execution
	     disabled if the hardware supports it.
	  3) All other RAM addresses will have read-write permission, and
	     execution disabled if the hardware supports it.

	  Options such as USERSPACE or HW_STACK_PROTECTION may additionally
	  impose additional policies on the memory map, which may be global
	  or local to the current running thread.

	  This option may consume additional memory to satisfy memory protection
	  hardware alignment constraints.

	  If this option is disabled, the entire kernel will have default memory
	  access permissions set, typically read/write/execute. It may be desirable
	  to turn this off on MMU systems which are using the MMU for demand
	  paging, do not need memory protection, and would rather not use up
	  RAM for the alignment between regions.

menu "Floating Point Options"

config FPU
	bool "Floating point unit (FPU)"
	depends on CPU_HAS_FPU
	help
	  This option enables the hardware Floating Point Unit (FPU), in order to
	  support using the floating point registers and instructions.

	  When this option is enabled, by default, threads may use the floating
	  point registers only in an exclusive manner, and this usually means that
	  only one thread may perform floating point operations.

	  If it is necessary for multiple threads to perform concurrent floating
	  point operations, the "FPU register sharing" option must be enabled to
	  preserve the floating point registers across context switches.

	  Note that this option cannot be selected for the platforms that do not
	  include a hardware floating point unit; the floating point support for
	  those platforms is dependent on the availability of the toolchain-
	  provided software floating point library.

config FPU_SHARING
	bool "FPU register sharing"
	depends on FPU && MULTITHREADING
	help
	  This option enables preservation of the hardware floating point registers
	  across context switches to allow multiple threads to perform concurrent
	  floating point operations.

	  Note that some compiler configurations may activate a floating point
	  context by generating FP instructions for any thread, and that
	  context must be preserved when switching such threads in and out.
	  The developers can still disable the FP sharing mode in their
	  application projects, and switch to Unshared FP registers mode,
	  if it is guaranteed that the image code does not generate FP
	  instructions outside the single thread context that is allowed
	  to do so.

endmenu

menu "Cache Options"

config CACHE_MANAGEMENT
	bool "Cache management features"
	help
	  This links in the cache management functions (for d-cache and i-cache
	  where possible).

config DCACHE_LINE_SIZE_DETECT
	bool "Detect d-cache line size at runtime"
	depends on CACHE_MANAGEMENT
	help
	  This option enables querying some architecture-specific hardware for
	  finding the d-cache line size at the expense of taking more memory and
	  code and a slightly increased boot time.

	  If the CPU's d-cache line size is known in advance, disable this option and
	  manually enter the value for DCACHE_LINE_SIZE or set it in the DT
	  using the 'd-cache-line-size' property.

config DCACHE_LINE_SIZE
	int "d-cache line size" if !DCACHE_LINE_SIZE_DETECT
	depends on CACHE_MANAGEMENT
	default 0
	help
	  Size in bytes of a CPU d-cache line. If this is set to 0 the value is
	  obtained from the 'd-cache-line-size' DT property instead if present.


	  Detect automatically at runtime by selecting DCACHE_LINE_SIZE_DETECT.

config ICACHE_LINE_SIZE_DETECT
	bool "Detect i-cache line size at runtime"
	depends on CACHE_MANAGEMENT
	help
	  This option enables querying some architecture-specific hardware for
	  finding the i-cache line size at the expense of taking more memory and
	  code and a slightly increased boot time.

	  If the CPU's i-cache line size is known in advance, disable this option and
	  manually enter the value for ICACHE_LINE_SIZE or set it in the DT
	  using the 'i-cache-line-size' property.

config ICACHE_LINE_SIZE
	int "i-cache line size" if !ICACHE_LINE_SIZE_DETECT
	depends on CACHE_MANAGEMENT
	default 0
	help
	  Size in bytes of a CPU i-cache line. If this is set to 0 the value is
	  obtained from the 'i-cache-line-size' DT property instead if present.

	  Detect automatically at runtime by selecting ICACHE_LINE_SIZE_DETECT.

choice CACHE_TYPE
	prompt "Cache type"
	depends on CACHE_MANAGEMENT
	default HAS_ARCH_CACHE

config HAS_ARCH_CACHE
	bool "Integrated cache controller"
	help
	  "Integrated on-core cache controller"

config HAS_EXTERNAL_CACHE
	bool "External cache controller"
	help
	  "External cache controller or cache management system"

endchoice

endmenu

config ARCH
	string
	help
	  System architecture string.

config SOC
	string
	help
	  SoC name which can be found under soc/<arch>/<soc name>.
	  This option holds the directory name used by the build system to locate
	  the correct linker and header files for the SoC.

config SOC_SERIES
	string
	help
	  SoC series name which can be found under soc/<arch>/<family>/<series>.
	  This option holds the directory name used by the build system to locate
	  the correct linker and header files.

config SOC_FAMILY
	string
	help
	  SoC family name which can be found under soc/<arch>/<family>.
	  This option holds the directory name used by the build system to locate
	  the correct linker and header files.

config TOOLCHAIN_HAS_BUILTIN_FFS
	bool
	default y if !(64BIT && RISCV)
	help
	  Hidden option to signal that toolchain has __builtin_ffs*().
