# ARC EM4 options

#
# Copyright (c) 2014 Wind River Systems, Inc.
#
# 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.
#

choice
	prompt "ARC SoC Selection"
	depends on ARC

	source "arch/arc/soc/*/Kconfig.soc"
endchoice


menu "ARC Options"
	depends on ARC

config ARCH
	default "arc"

config ARCH_DEFCONFIG
	string
	default "arch/arc/defconfig"

menu "ARC EM4 processor options"

config	CPU_ARCEM4
	bool
	default y
	select CPU_ARCV2
	select ATOMIC_OPERATIONS_C
	help
	This option signifies the use of an ARC EM4 CPU

endmenu

menu "ARCv2 Family Options"

config	CPU_ARCV2
	bool
	default y
	select NANOKERNEL_TICKLESS_IDLE_SUPPORTED
	help
	  This option signifies the use of a CPU of the ARCv2 family.

config NSIM
	prompt "Running on the MetaWare nSIM simulator"
	bool
	default n
	help
	  For running on nSIM simulator.

	  a) Uses non-XIP to run in RAM.
	  b) Linked at address 0x4000 with 0x4000 of RAM so that it works with
	     a pc_size of 16 (default).
	  c) Sets the entry point to __reset, since it seems nSIM ignores the
	     reset vector when starting (??).

config	DATA_ENDIANNESS_LITTLE
	bool
	default y
	help
	  This is driven by the processor implementation, since it is fixed in
	  hardware. The BSP should set this value to 'n' if the data is
	  implemented as big endian.

config	NUM_IRQ_PRIO_LEVELS
	int
	prompt "Number of supported interrupt priority levels"
	range 1 16
	help
	  Interrupt priorities available will be 0 to NUM_IRQ_PRIO_LEVELS-1.
	  The minimum value is 1.

	  The BSP must provide a valid default for proper operation.

config	NUM_REGULAR_IRQ_PRIO_LEVELS
	int
	prompt "Number of supported regular interrupt priority levels"
	range 1 16
	help
	 This represents the number of Regular Interrupt priorities, which
	 does NOT include the Fast (FIRQ) priority.
	 The Regular Interrupt priorities available will be

	  (NUM_IRQ_PRIO_LEVELS - NUM_REGULAR_IRQ_PRIO_LEVELS) to
	  (NUM_REGULAR_IRQ_PRIO_LEVELS - 1).

	  The maximum value is NUM_IRQ_PRIO_LEVELS.

	  The BSP must provide a valid default for proper operation.

config	NUM_IRQS
	int
	prompt "Upper limit of interrupt numbers/IDs used"
	range 17 256
	help
	  Interrupts available will be 0 to NUM_IRQS-1.
	  The minimum value is 17 as the first 16 entries in the vector
	  table are for CPU exceptions.

	  The BSP must provide a valid default. This drives the size of the
	  vector table.

config	FIRQ_STACK_SIZE
	int
	prompt "Size of stack for FIRQs (in bytes)"
	depends on CPU_ARCV2
	default 1024
	help
	  FIRQs and regular IRQs have different stacks so that a FIRQ can start
	  running without doing stack switching in software.

config	ARC_STACK_CHECKING
	bool "Enable Stack Checking"
	depends on CPU_ARCV2
	default n
	help
	  ARCV2 has a special feature allowing to check stack overflows. This
	  enables code that allows using this debug feature

config	FAULT_DUMP
	int
	prompt "Fault dump level"
	default 2
	range 0 2
	help
	  Different levels for display information when a fault occurs.

	  2: The default. Display specific and verbose information. Consumes
	     the most memory (long strings).
	  1: Display general and short information. Consumes less memory
	     (short strings).
	  0: Off.

config IRQ_OFFLOAD
	bool "Enable IRQ offload"
	default n
	help
	Enable irq_offload() API which allows functions to be synchronously
	run in interrupt context. Uses one entry in the	IDT.  Mainly useful
	for test cases.

config	XIP
	default n if NSIM
	default y

config DCCM_SIZE
	int "DCCM Size in kB"
	help
	This option specifies the size of the DCCM in kB.  It is normally set by
	the platform's defconfig file and the user should generally avoid modifying
	it via the menu configuration.

config DCCM_BASE_ADDRESS
	hex "DCCM Base Address"
	help
	This option specifies the base address of the DCCM on the platform.  It is
	normally set by the platform's defconfig file and the user should generally
	avoid modifying it via the menu configuration.

config SRAM_SIZE
	int "SRAM Size in kB"
	help
	This option specifies the size of the SRAM in kB.  It is normally set by
	the platform's defconfig file and the user should generally avoid modifying
	it via the menu configuration.

config SRAM_BASE_ADDRESS
	hex "SRAM Base Address"
	help
	This option specifies the base address of the SRAM on the platform.  It is
	normally set by the platform's defconfig file and the user should generally
	avoid modifying it via the menu configuration.

config FLASH_SIZE
	int "Flash Size in kB"
	help
	This option specifies the size of the flash in kB.  It is normally set by
	the platform's defconfig file and the user should generally avoid modifying
	it via the menu configuration.

config FLASH_BASE_ADDRESS
	hex "Flash Base Address"
	help
	This option specifies the base address of the flash on the platform.  It is
	normally set by the platform's defconfig file and the user should generally
	avoid modifying it via the menu configuration.
config NSIM
	prompt "Running on the MetaWare nSIM simulator"
	bool
	default n
	help
	For running on nSIM simulator.

	a) Uses non-XIP to run in RAM.
	b) Linked at address 0x4000 with 0x4000 of RAM so that it works with
	   a pc_size of 16 (default).
	c) Sets the entry point to __reset, since it seems nSIM ignores the
	   reset vector when starting.

config  SW_ISR_TABLE
	bool
	prompt "Enable software interrupt handler table"
	default y
	help
	  Enable an interrupt handler table implemented in software. This
	  table, unlike ISRs connected directly in the vector table, allow
	  a parameter to be passed to the interrupt handlers. Also, invoking
	  the exeception/interrupt exit stub is automatically done.

	  This has to be enabled for dynamically connecting interrupt handlers
	  at runtime (SW_ISR_TABLE_DYNAMIC).

config  SW_ISR_TABLE_DYNAMIC
	bool
	prompt "Allow installing interrupt handlers at runtime"
	depends on SW_ISR_TABLE
	default n
	help
	  This option enables irq_connect_dynamic(). It moves the ISR table to
	  SRAM so that it is writable. This has the side-effect of removing
	  write-protection on the ISR table.

config  IRQ_VECTOR_TABLE_CUSTOM
	bool
	prompt "Projects provide a custom static IRQ part of vector table"
	depends on !SW_ISR_TABLE
	default n
	help
	  Projects, not the BSP, provide the IRQ part of the vector table.

	  This is the table of interrupt handlers with the best potential
	  performance, but is the less flexible.

	  The ISRs are installed directly in the vector table, thus are
	  directly called by the CPU when an interrupt is taken. This adds
	  the least overhead when handling an interrupt.

	  Downsides:

	  - ISRs cannot have a parameter
	  - ISRs cannot be connected at runtime
	  - ISRs must notify the kernel manually by invoking _ExcExit() when
	    then are about to return.

config	IRQ_VECTOR_TABLE_BSP
	bool
	# omit prompt to signify a "hidden" option
	depends on SW_ISR_TABLE || !IRQ_VECTOR_TABLE_CUSTOM
	default y
	help
	  Not user-selectable, helps build system logic.

config  ARCH_HAS_TASK_ABORT
	bool
	# omit prompt to signify a "hidden" option
	default n

config  ARCH_HAS_NANO_FIBER_ABORT
	bool
	# omit prompt to signify a "hidden" option
	default n

endmenu


source "arch/arc/soc/*/Kconfig"

endmenu
