# Copyright (c) 2016 Jean-Paul Etienne <fractalclone@gmail.com>
# Copyright (c) 2024 Antmicro <www.antmicro.com>
# SPDX-License-Identifier: Apache-2.0

menu "RISCV Options"
	depends on RISCV

config ARCH
	string
	default "riscv"

config FLOAT_HARD
	bool "Hard-float calling convention"
	default y
	depends on FPU
	help
	  This option enables the hard-float calling convention.

config RISCV_GP
	bool "RISC-V global pointer relative addressing"
	default n
	help
	  Use global pointer relative addressing for small globals declared
	  anywhere in the executable. It can benefit performance and reduce
	  the code size.

	  Note: To support this feature, RISC-V SoC needs to initialize
	  global pointer at program start or earlier than any instruction
	  using GP relative addressing.

config RISCV_ALWAYS_SWITCH_THROUGH_ECALL
	bool "Do not use mret outside a trap handler context"
	depends on MULTITHREADING
	help
	  Use mret instruction only when in a trap handler.
	  This is for RISC-V implementations that require every mret to be
	  balanced with an ecall. This is not required by the RISC-V spec
	  and most people should say n here to minimize context switching
	  overhead.

choice RISCV_SMP_IPI_IMPL
	prompt "RISC-V SMP IPI implementation"
	depends on SMP
	default RISCV_SMP_IPI_CLINT if DT_HAS_SIFIVE_CLINT0_ENABLED
	default RISCV_SMP_IPI_CUSTOM

config RISCV_SMP_IPI_CLINT
	bool "CLINT-based IPI"
	depends on DT_HAS_SIFIVE_CLINT0_ENABLED
	help
	  Use CLINT-based IPI implementation.

config RISCV_SMP_IPI_CUSTOM
	bool "Custom IPI implementation"
	help
	  Allow custom IPI implementation.

	  When this is selected, the following functions must be provided:
	   - arch_sched_directed_ipi()
	   - arch_flush_fpu_ipi() if CONFIG_FPU_SHARING
	   - arch_spin_relax() if CONFIG_FPU_SHARING
	   - arch_smp_init()

endchoice # RISCV_SMP_IPI_IMPL

menu "RISCV Processor Options"

config INCLUDE_RESET_VECTOR
	bool "Jumps to __initialize directly"
	help
	  Select 'y' here to use the Zephyr provided default implementation that
	  jumps to `__initialize` directly. Otherwise a SOC needs to provide its
	  custom `__reset` routine.

config RISCV_PRIVILEGED
	bool
	select ARCH_HAS_RAMFUNC_SUPPORT if XIP
	help
	  Option selected by SoCs implementing the RISC-V privileged ISA.

config RISCV_SOC_HAS_ISR_STACKING
	bool
	depends on !USERSPACE
	help
	  Enable low-level SOC-specific hardware stacking / unstacking
	  operations during ISR. This hidden option needs to be selected by SoC
	  if this feature is supported.

	  Some SOCs implement a mechanism for which, on interrupt handling,
	  part of the context is automatically saved by the hardware on the
	  stack according to a custom ESF format. The same part of the context
	  is automatically restored by hardware on mret.

	  Enabling this option requires that the SoC provides a
	  soc_isr_stacking.h header which defines the following:

	  - SOC_ISR_SW_STACKING: macro guarded by _ASMLANGUAGE called by the
	    IRQ wrapper assembly code on ISR entry to save in the ESF the
	    remaining part of the context not pushed already on the stack by
	    the hardware.

	  - SOC_ISR_SW_UNSTACKING: macro guarded by _ASMLANGUAGE called by the
	    IRQ wrapper assembly code on ISR exit to restore the part of the
	    context from the ESF that won't be restored by hardware on mret.

	  - SOC_ISR_STACKING_ESF_DECLARE: structure declaration for the ESF
	    guarded by !_ASMLANGUAGE. The ESF should be defined to account for
	    the hardware stacked registers in the proper order as they are
	    saved on the stack by the hardware, and the registers saved by the
	    software macros. The structure must be called 'struct arch_esf'.

config RISCV_SOC_HAS_CUSTOM_IRQ_HANDLING
	bool
	help
	  This allows the SoC to overwrite the irq handling. If enabled, the
	  function __soc_handle_all_irqs has to be implemented. It shall service
	  and clear all pending interrupts.

config RISCV_SOC_HAS_CUSTOM_IRQ_LOCK_OPS
	bool
	help
	  Hidden option to allow SoC to overwrite arch_irq_lock(),
	  arch_irq_unlock() and arch_irq_unlocked() functions with
	  platform-specific versions named z_soc_irq_lock(), z_soc_irq_unlock()
	  and z_soc_irq_unlocked().

	  Enable this hidden option and specialize the z_soc_* functions when
	  the RISC-V SoC needs to do something different and more than reading and
	  writing the mstatus register to lock and unlock the IRQs.

config RISCV_SOC_HAS_CUSTOM_SYS_IO
	bool
	help
	  Hidden option to allow SoC to overwrite sys_read*(), sys_write*() functions with
	  platform-specific versions named z_soc_sys_read*() and z_soc_sys_write*().

	  Enable this hidden option and specialize the z_soc_* functions when
	  the RISC-V SoC needs to do something different and more than reading and
	  writing the registers.

config RISCV_SOC_CONTEXT_SAVE
	bool "SOC-based context saving in IRQ handlers"
	select RISCV_SOC_OFFSETS
	help
	  Enable low-level SOC-specific context management, for SOCs
	  with extra state that must be saved when entering an
	  interrupt/exception, and restored on exit. If unsure, leave
	  this at the default value.

	  Enabling this option requires that the SoC provide a
	  soc_context.h header which defines the following macros:

	  - SOC_ESF_MEMBERS: structure component declarations to
	    allocate space for. The last such declaration should not
	    end in a semicolon, for portability. The generic RISC-V
	    architecture code will allocate space for these members in
	    a "struct soc_esf" type (typedefed to soc_esf_t), which will
	    be available if arch.h is included.

	  - SOC_ESF_INIT: structure contents initializer for struct soc_esf
	    state. The last initialized member should not end in a comma.

	  The generic architecture IRQ wrapper will also call
	  \_\_soc_save_context and \_\_soc_restore_context routines at
	  ISR entry and exit, respectively. These should typically
	  be implemented in assembly. If they were C functions, they
	  would have these signatures:

	  ``void __soc_save_context(soc_esf_t *state);``

	  ``void __soc_restore_context(soc_esf_t *state);``

	  The calls obey standard calling conventions; i.e., the state
	  pointer address is in a0, and ra contains the return address.

config RISCV_SOC_OFFSETS
	bool "SOC-based offsets"
	help
	  Enabling this option requires that the SoC provide a soc_offsets.h
	  header which defines the following macros:

	  - GEN_SOC_OFFSET_SYMS(): a macro which expands to
	    GEN_OFFSET_SYM(soc_esf_t, soc_specific_member) calls
	    to ensure offset macros for SOC_ESF_MEMBERS are defined
	    in offsets.h. The last one should not end in a semicolon.
	    See gen_offset.h for more details.

config RISCV_HAS_PLIC
	bool
	depends on RISCV_PRIVILEGED
	help
	  Does the SOC provide support for a Platform Level Interrupt Controller (PLIC).

config RISCV_HAS_CLIC
	bool
	depends on RISCV_PRIVILEGED
	help
	  Does the SOC provide support for a Core-Local Interrupt Controller (CLIC).

config RISCV_SOC_EXCEPTION_FROM_IRQ
	bool
	help
	  Option selected by SoCs that require a custom mechanism to check if
	  an exception is the result of an interrupt or not. If selected,
	  __soc_is_irq() needs to be implemented by the SoC.

config RISCV_SOC_INTERRUPT_INIT
	bool "SOC-based interrupt initialization"
	help
	  Enable SOC-based interrupt initialization
	  (call soc_interrupt_init, within _IntLibInit when enabled)

config RISCV_MCAUSE_EXCEPTION_MASK
	hex
	default 0x7FFFFFFFFFFFFFFF if 64BIT
	default 0x7FFFFFFF
	help
	  Specify the bits to use for exception code in mcause register.

config RISCV_GENERIC_TOOLCHAIN
	bool "Compile using generic riscv32 toolchain"
	default y
	help
	  Compile using generic riscv32 toolchain.
	  Allow SOCs that have custom extended riscv ISA to still
	  compile with generic riscv32 toolchain.

config GEN_ISR_TABLES
	default y

config GEN_IRQ_VECTOR_TABLE
	default n

config RISCV_RESERVED_IRQ_ISR_TABLES_OFFSET
	int
	default 0
	depends on GEN_ISR_TABLES
	help
	  On some RISCV platform the first interrupt vectors are primarly
	  intended for inter-hart interrupt signaling and so retained for that
	  purpose and not available. When this option is set, all the IRQ
	  vectors are shifted by this offset value when installed into the
	  software ISR table and the IRQ vector table. CONFIG_NUM_IRQS must be
	  properly sized to take into account this offset. This is a hidden
	  option which needs to be set per architecture and left alone.

config NUM_IRQS
	int

config RV_BOOT_HART
	int "Starting HART ID"
	default 0
	help
	  This option sets the starting HART ID for the SMP core.
	  For RISC-V systems such as MPFS and FU540 this would be set to 1 to
	  skip the E51 HART 0 as it is not usable in SMP configurations.

config RISCV_HART_MASK
	int
	default -1
	help
	  Configures the mask for the HART ID.
	  For RISC-V systems with HART ID starting from non-zero value,
	  i.e. 128, 129, ..(0x80, 8x81, ..), this can be configured to 63 (0x7f)
	  such that we can extract the bits that start from 0.

config EXTRA_EXCEPTION_INFO
	bool "Collect extra exception info"
	depends on EXCEPTION_DEBUG
	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.

config RISCV_PMP
	bool "RISC-V PMP Support"
	select THREAD_STACK_INFO
	select CPU_HAS_MPU
	select ARCH_HAS_USERSPACE
	select ARCH_HAS_STACK_PROTECTION
	select MPU
	select SRAM_REGION_PERMISSIONS
	select ARCH_MEM_DOMAIN_SYNCHRONOUS_API if USERSPACE
	select ARCH_MEM_DOMAIN_DATA if USERSPACE
	select THREAD_LOCAL_STORAGE if USERSPACE
	select ARCH_MEM_DOMAIN_SUPPORTS_ISOLATED_STACKS
	select MEM_DOMAIN_ISOLATED_STACKS
	help
	  MCU implements Physical Memory Protection.

if RISCV_PMP

config PMP_SLOTS
	int "Number of PMP slots"
	default 8
	help
	  This is the number of PMP entries implemented by the hardware.
	  Typical values are 8 or 16.

config PMP_NO_TOR
	bool
	help
	  Set this if TOR (Top Of Range) mode is not supported.

config PMP_NO_NA4
	bool
	help
	  Set this if NA4 (Naturally Aligned 4-byte) mode is not supported.

config PMP_NO_NAPOT
	bool
	help
	  Set this if NAPOT (Naturally Aligned Power Of Two) is not supported.

config PMP_POWER_OF_TWO_ALIGNMENT
	bool "Enforce power-of-two alignment on PMP memory areas" if !PMP_NO_TOR
	default y if TEST_USERSPACE
	default y if (PMP_SLOTS = 8)
	default y if PMP_NO_TOR
	select MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT
	select GEN_PRIV_STACKS
	help
	  This option reduces the PMP slot usage but increases
	  memory consumption. Useful when enabling userspace mode with
	  many memory domains and/or few PMP slots available.

config PMP_GRANULARITY
	int "The granularity of PMP address matching"
	default 8 if (PMP_NO_TOR && PMP_NO_NA4)
	default 4
	help
	  The granularity must be a power of 2 greater than or equal to 4
	  (ie 4, 8, 16, ...), but if neither TOR mode nor NA4 mode is
	  supported, the minimum granularity is 8.

endif #RISCV_PMP

config PMP_STACK_GUARD
	def_bool y
	depends on HW_STACK_PROTECTION

config PMP_STACK_GUARD_MIN_SIZE
	int "Stack Guard area size"
	depends on PMP_STACK_GUARD
	default 1024 if 64BIT
	default 512
	help
	  The Hardware Stack Protection implements a guard area at the bottom
	  of the stack using the PMP to catch stack overflows by marking that
	  guard area not accessible.

	  This is the size of the guard area. This should be large enough to
	  catch any sudden jump in stack pointer decrement, plus some
	  wiggle room to accommodate the eventual overflow exception
	  stack usage.

# Implement the null pointer detection using the Physical Memory Protection
# (PMP) Unit.
config NULL_POINTER_EXCEPTION_DETECTION_PMP
	bool "Use PMP for null pointer exception detection"
	depends on RISCV_PMP
	help
	  Null pointer dereference detection implemented
	  using PMP functionality.

if NULL_POINTER_EXCEPTION_DETECTION_PMP

config NULL_POINTER_EXCEPTION_REGION_SIZE
	hex "Inaccessible region to implement null pointer detection"
	default 0x10
	help
	  Use a PMP slot to make region (starting at address 0x0) inaccessible for
	  detecting null pointer dereferencing (raising a CPU access fault).
	  Minimum is 4 bytes.

endif # NULL_POINTER_EXCEPTION_DETECTION_PMP

config RISCV_IMPRECISE_FPU_STATE_TRACKING
	bool "Imprecise implementation of FPU state tracking"
	depends on FPU
	help
	  According to the RISC-V Instruction Set Manual: Volume II, Version 20240411
	  (Section 3.1.6.6), some implementations may choose to track the dirtiness of
	  the floating-point register state imprecisely by reporting the state to be
	  dirty even when it has not been modified. This option reflects that.

endmenu

config MAIN_STACK_SIZE
	default 4096 if 64BIT
	default 2048 if PMP_STACK_GUARD

config TEST_EXTRA_STACK_SIZE
	default 1536

config CMSIS_THREAD_MAX_STACK_SIZE
	default 1024 if 64BIT

config CMSIS_V2_THREAD_MAX_STACK_SIZE
	default 1024 if 64BIT

config ARCH_IRQ_VECTOR_TABLE_ALIGN
	default 256

config RISCV_TRAP_HANDLER_ALIGNMENT
	int "Alignment of RISC-V trap handler in bytes"
	default 64 if RISCV_HAS_CLIC
	default 4
	help
	  This value configures the alignment of RISC-V trap handling
	  code. The requirement for a particular alignment arises from
	  the format of MTVEC register which is RISC-V platform-specific.
	  The minimum alignment is 4 bytes according to the Spec.

config GEN_IRQ_VECTOR_TABLE
	select RISCV_VECTORED_MODE if RISCV_PRIVILEGED

config ARCH_HAS_SINGLE_THREAD_SUPPORT
	default y if !SMP

config ARCH_HAS_STACKWALK
	bool
	default y
	imply THREAD_STACK_INFO
	help
	  Internal config to indicate that the arch_stack_walk() API is implemented
	  and it can be enabled.

rsource "Kconfig.isa"

endmenu
