# Kconfig - x86 general configuration options

#
# Copyright (c) 2014-2015 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 "x86 SoC Selection"
	depends on X86

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

menu "x86 Options"
	depends on X86

config ARCH
	default "x86"


config ARCH_DEFCONFIG
	string
	default "arch/x86/defconfig"


source "arch/x86/core/Kconfig"

#
# Hidden CPU family configs which are to be selected by
# individual SoC.
#
config CPU_ATOM
	# Hidden
	bool
	select CMOV
	select CPU_HAS_FPU
	help
	This option signifies the use of a CPU from the Atom family.

config CPU_MINUTEIA
	# Hidden
	bool
	help
	This option signifies the use of a CPU from the Minute IA family.
#
# End hidden CPU family configs
#

config CPU_HAS_FPU
	# Hidden config selected by CPU family
	bool
	default n
	help
	This option is enabled when the CPU has hardware floating point
	unit.

menu "Processor Capabilities"

config X86_IAMCU
	bool
	default n
	prompt "IAMCU calling convention"
	help
	The IAMCU calling convention changes the X86 C calling convention to
	pass some arguments via registers allowing for code size and performance
	improvements.  Great care needs to be taken if you have assembly code
	that will be called from C or C code called from assembly code, the
	assembly code will need to be updated to conform to the new calling
	convention.  If in doubt say N

menu "Floating Point Options"
depends on CPU_HAS_FPU

config FLOAT
	bool
	prompt "Floating point registers"
	default n
	help
	This option allows tasks and fibers to use the floating point registers.
	By default, only a single task or fiber may use the registers, and only
	the x87 FPU/MMX registers may be used.

	Disabling this option means that any task or fiber that uses a
	floating point register will get a fatal exception.

config FP_SHARING
	bool
	prompt "Floating point register sharing"
	depends on FLOAT
	default n
	help
	This option allows multiple tasks and fibers to use the floating point
	registers. Any task that uses the floating point registers must provide
	stack space where the kernel can save these registers during context
	switches; a task that uses only the x87 FPU/MMX registers must provide
	108 bytes of added stack space, while a task the uses the SSE registers
	must provide 464 bytes of added stack space.

config SSE
	bool
	prompt "SSE registers"
	depends on FLOAT
	default n
	help
	This option enables the use of SSE registers by tasks and fibers.

config SSE_FP_MATH
	bool
	prompt "Compiler-generated SSEx instructions"
	depends on SSE
	default n
	help
	This option allows the compiler to generate SSEx instructions for
	performing floating point math. This can greatly improve performance
	when exactly the same operations are to be performed on multiple
	data objects; however, it can also significantly reduce performance
	when pre-emptive task switches occur because of the larger register
	set that must be saved and restored.

	Disabling this option means that the compiler utilizes only the
	x87 instruction set for floating point operations.
endmenu

choice
prompt "Reboot implementation"
depends on REBOOT
default REBOOT_RST_CNT

config REBOOT_RST_CNT
	bool
	prompt "Reboot via RST_CNT register"
	help
	Reboot via the RST_CNT register, going back to BIOS.

endchoice


config ISA_IA32
	bool
	default y
	help
	This option signifies the use of a CPU based on the Intel IA-32
	instruction set architecture.

config IA32_LEGACY_IO_PORTS
	bool
	prompt "Support IA32 legacy IO ports"
	default n
	depends on ISA_IA32
	help
	This option enables IA32 legacy IO ports. Note these are much slower
	than memory access, so they should be used in last resort.

config CMOV
	def_bool n
	help
	This option signifies the use of an Intel CPU that supports
	the CMOV instruction.

config CACHE_LINE_SIZE_DETECT
	bool
	prompt "Detect cache line size at runtime"
	default y
	help
	This option enables querying the CPUID register for finding the cache line
	size at the expense of taking more memory and code and a slightly increased
	boot time.

	If the CPU's cache line size is known in advance, disable this option and
	manually enter the value for CACHE_LINE_SIZE.

config CACHE_LINE_SIZE
	int
	prompt "Cache line size" if !CACHE_LINE_SIZE_DETECT
	default 0 if CACHE_LINE_SIZE_DETECT
	default 64 if CPU_ATOM
	default 0
	help
	Size in bytes of a CPU cache line.

	Detect automatically at runtime by selecting CACHE_LINE_SIZE_DETECT.

config CLFLUSH_INSTRUCTION_SUPPORTED
	bool
	prompt "CLFLUSH instruction supported"
	depends on !CLFLUSH_DETECT && CACHE_FLUSHING
	default n
	help
	An implementation of sys_cache_flush() that uses CLFLUSH is made
	available, instead of the one using WBINVD.

	This option should only be enabled if it is known in advance that the
	CPU supports the CLFLUSH instruction. It disables runtime detection of
	CLFLUSH support thereby reducing both memory footprint and boot time.

config CLFLUSH_DETECT
	bool
	prompt "Detect support of CLFLUSH instruction at runtime"
	depends on CACHE_FLUSHING
	default n
	help
	This option should be enabled if it is not known in advance whether the
	CPU supports the CLFLUSH instruction or not.

	The CPU is queried at boot time to determine which of the multiple
	implementations of sys_cache_flush() linked into the image is the
	correct one to use.

	If the CPU's support (or lack thereof) of CLFLUSH is known in advance, then
	disable this option and set CLFLUSH_INSTRUCTION_SUPPORTED as appropriate.

config ARCH_CACHE_FLUSH_DETECT
	bool
	default y
	depends on CLFLUSH_DETECT

config CACHE_FLUSHING
	bool
	default n
	prompt "Enable cache flushing mechanism"
	help
	This links in the sys_cache_flush() function. A mechanism for flushing the
	cache must be selected as well. By default, that mechanism is discovered at
	runtime.
endmenu

menu "Platform Capabilities"
config NUM_DYNAMIC_STUBS
	int "Number of dynamic int stubs"
	default 0
	help
	This option specifies the number of interrupt handlers that can be
	installed dynamically using irq_connect_dynamic().

config NUM_DYNAMIC_EXC_STUBS
	int "Number of dynamic exception stubs"
	default 0
	help
	This option specifies the maximum number of dynamically allocated
	exception stubs that are to be used with exceptions that push an
	error code onto the stack.

config NUM_DYNAMIC_EXC_NOERR_STUBS
	int "Number of dynamic no-error exception stubs"
	default 0
	help
	This option specifies the maximum number of dynamically allocated
	exception stubs that are to be used with exceptions that do not push
	an error code onto the stack.

config PIC_DISABLE
	bool "Disable PIC"
	default n
	help
	This option disables all interrupts on the PIC

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 IRQ_OFFLOAD_VECTOR
	int "IDT vector to use for IRQ offload"
	default 63 if MVIC
	default 32 if !MVIC
	range 32 255
	depends on IRQ_OFFLOAD
	help
	Specify the IDT vector to use for the IRQ offload interrupt handler.
	The default should be fine for most arches, but on systems like MVIC
	where there is a fixed IRQ-to-vector mapping another value may be
	needed to avoid collision.

config XIP
	default n
endmenu



source "arch/x86/soc/*/Kconfig"

endmenu
