#
# Copyright (c) 2016 Intel Corporation
#
# 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 "Nios II configuration selection"
	depends on NIOS2
	source "arch/nios2/soc/*/Kconfig.soc"
endchoice

menu "Nios II Options"
	depends on NIOS2

config ARCH
	string
	default "nios2"

config ARCH_DEFCONFIG
	string
	default "arch/nios2/defconfig"

menu "Nios II Gen 2 Processor Options"

config CPU_NIOS2_GEN2
	bool
	default y
	help
	This option signifies the use of a Nios II Gen 2 CPU

endmenu

menu "Nios II Family Options"

config XIP
	bool
	default y

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

config HAS_MUL_INSTRUCTION
	bool
	default n

config HAS_DIV_INSTRUCTION
	bool
	default n

config HAS_MULX_INSTRUCTION
	bool
	default n

config INCLUDE_RESET_VECTOR
	bool "Include Reset vector"
	default y
	help
	Include the reset vector stub, which enables instruction/data caches
	and then jumps to __start. This code is typically located at the very
	beginning of flash memory. You may need to omit this if using the
	nios2-download tool since it refuses to load data anywhere other than
	RAM.

config EXTRA_EXCEPTION_INFO
	bool "Extra exception debug information"
	default n
	help
	Have exceptions print additional useful debugging information in
	human-readable form, at the expense of code size. For example,
	the cause code for an exception will be supplemented by a string
	describing what that cause code means.

choice
prompt "Global Pointer options"
default GP_GLOBAL

config GP_NONE
	bool "No global pointer"
	help
	Do not use global pointer relative offsets at all

config GP_LOCAL
	bool "Local data global pointer references"
	help
	Use global pointer relative offsets for small globals declared in the
	same C file as the code that uses it.

config GP_GLOBAL
	bool "Global data global pointer references"
	help
	Use global pointer relative offsets for small globals declared
	anywhere in the executable. Note that if any small globals that are put
	in alternate sections (such as _k_task_list_ptr in the microkernel)
	they must be declared in headers with proper __attribute__((section)) or
	the linker will error out.

config GP_ALL_DATA
	bool "All data global pointer references"
	help
	Use GP relative access for all data in the program, not just
	small data. Use this if your platform has 64K or less of RAM.

endchoice

endmenu

source "arch/nios2/soc/*/Kconfig"

endmenu
