# Warning: This file is included whether or not the if is here.
# The if controls how the evaluation occurs.
# (See also src/Kconfig)

source src/cpu/allwinner/Kconfig
source src/cpu/armltd/Kconfig
source src/cpu/ti/Kconfig

source src/cpu/amd/Kconfig
source src/cpu/dmp/Kconfig
source src/cpu/intel/Kconfig
source src/cpu/via/Kconfig
source src/cpu/qemu-x86/Kconfig
source src/cpu/x86/Kconfig

if ARCH_X86

config CACHE_AS_RAM
	bool
	default !ROMCC

config DCACHE_RAM_BASE
	hex

config DCACHE_RAM_SIZE
	hex

config SMP
	bool
	default y if MAX_CPUS != 1
	default n
	help
	  This option is used to enable certain functions to make coreboot
	  work correctly on symmetric multi processor (SMP) systems.

config AP_SIPI_VECTOR
	hex
	default 0xfffff000
	help
	  This must equal address of ap_sipi_vector from bootblock build.

config	MMX
	bool
	help
	  Select MMX in your socket or model Kconfig if your CPU has MMX
	  streaming SIMD instructions. ROMCC can build more efficient
	  code if it can spill to MMX registers.

config SSE
	bool
	help
	  Select SSE in your socket or model Kconfig if your CPU has SSE
	  streaming SIMD instructions. ROMCC can build more efficient
	  code if it can spill to SSE (aka XMM) registers.

config SSE2
	bool
	default n
	help
	  Select SSE2 in your socket or model Kconfig if your CPU has SSE2
	  streaming SIMD instructions. Some parts of coreboot can be built
	  with more efficient code if SSE2 instructions are available.

endif # ARCH_X86

config SUPPORT_CPU_UCODE_IN_CBFS
	bool
	default n

# This variable is used to determine if we add CPU microcode to CBFS during the
# build. Microcode can be added manually afterwards, or removed. As a result,
# code should not rely on this to tell if a microcode update is present or not,
# and should instead search CBFS.
# This variable is useful in determining if certain automated post-processing
# steps can be performed right after the build, such as automatically adding
# a firmware interface table.
config CPU_MICROCODE_ADDED_DURING_BUILD
	bool
	default y if CPU_MICROCODE_CBFS_GENERATE || CPU_MICROCODE_CBFS_EXTERNAL

choice
	prompt "Include CPU microcode in CBFS" if ARCH_X86
	default CPU_MICROCODE_CBFS_GENERATE if SUPPORT_CPU_UCODE_IN_CBFS
	default CPU_MICROCODE_CBFS_NONE if !SUPPORT_CPU_UCODE_IN_CBFS

config CPU_MICROCODE_CBFS_GENERATE
	bool "Generate from tree"
	help
	  Select this option if you want microcode updates to be assembled when
	  building coreboot and included in the final image as a separate CBFS
	  file. Microcode will not be hard-coded into ramstage.

	  The microcode file may be removed from the ROM image at a later
	  time with cbfstool, if desired.

	  If unsure, select this option.

config CPU_MICROCODE_CBFS_EXTERNAL
	bool "Include external microcode file"
	help
	  Select this option if you want to include an external file containing
	  the CPU microcode. This will be included as a separate file in CBFS.
	  A word of caution: only select this option if you are sure the
	  microcode that you have is newer than the microcode shipping with
	  coreboot.

	  The microcode file may be removed from the ROM image at a later
	  time with cbfstool, if desired.

	  If unsure, select "Generate from tree"

config CPU_MICROCODE_CBFS_NONE
	bool "Do not include microcode updates"
	help
	  Select this option if you do not want CPU microcode included in CBFS.
	  Note that for some CPUs, the microcode is hard-coded into the source
	  tree and is not loaded from CBFS. In this case, microcode will still
	  be updated. There is a push to move all microcode to CBFS, but this
	  change is not implemented for all CPUs.

	  This option currently applies to:
	    - Intel SandyBridge/IvyBridge
	    - VIA Nano

	  Microcode may be added to the ROM image at a later time with cbfstool,
	  if desired.

	  If unsure, select "Generate from tree"

	  The GOOD:
	  Microcode updates intend to solve issues that have been discovered
	  after CPU production. The expected effect is that systems work as
	  intended with the updated microcode, but we have also seen cases where
	  issues were solved by not applying microcode updates.

	  The BAD:
	  Note that some operating system include these same microcode patches,
	  so you may need to also disable microcode updates in your operating
	  system for this option to have an effect.

	  The UGLY:
	  A word of CAUTION: some CPUs depend on microcode updates to function
	  correctly. Not updating the microcode may leave the CPU operating at
	  less than optimal performance, or may cause outright hangups.
	  There are CPUs where coreboot cannot properly initialize the CPU
	  without microcode updates
	  For example, if running with the factory microcode, some Intel
	  SandyBridge CPUs may hang when enabling CAR, or some VIA Nano CPUs
	  will hang when changing the frequency.

	  Make sure you have a way of flashing the ROM externally before
	  selecting this option.

endchoice

config CPU_MICROCODE_FILE
	  string "Path and filename of CPU microcode"
	  depends on CPU_MICROCODE_CBFS_EXTERNAL
	  default "cpu_microcode.bin"
	  help
	    The path and filename of the file containing the CPU microcode.
