# 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 threads to use the x87 FPU/MMX registers. The
	registers may be used by any number of cooperative threads or by
	a single preemptible thread, but not both, since the kernel does not
	preserve FPU context information when switching between threads.
	Additional options must be enabled to permit the use of SSE registers or
	to permit floating point register use by multiple preemptible threads.

	Disabling this option means that any thread that uses the floating
	point registers will get a fatal exception.

config FP_SHARING
	bool
	prompt "Floating point register sharing"
	depends on FLOAT
	default n
	help
	This option allows multiple preemptible threads to use the floating
	point registers. Any preemptible thread that uses the registers must
	provide stack space where the kernel can save FPU context info during
	a preemptive context switch. A thread that uses only the x87 FPU/MMX
	registers must provide 108 bytes of added stack space, while a thread
	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 threads.

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 "Board Capabilities"
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

config X86_FIXED_IRQ_MAPPING
	bool
	default n
	help
	Specify whether the current interrupt controller in use has a fixed
	mapping between IDT vectors and IRQ lines.

endmenu



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

endmenu
