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

source src/cpu/armltd/Kconfig

endif	# ARCH_ARM

if ARCH_X86

source src/cpu/amd/Kconfig
source src/cpu/intel/Kconfig
source src/cpu/via/Kconfig
source src/cpu/x86/Kconfig

config CACHE_AS_RAM
	bool
	select EARLY_CONSOLE
	default !ROMCC

config DCACHE_RAM_BASE
	hex

config DCACHE_RAM_SIZE
	hex

# FIXME MAX_PHYSICAL_CPUS should move to AMD specific code, or better
# yet be dropped completely.
config MAX_PHYSICAL_CPUS
	int
	depends on CPU_AMD_MODEL_10XXX || CPU_AMD_MODEL_FXX || CPU_AMD_AGESA
	default 1

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 CPU_MICROCODE_IN_CBFS
	bool
	default n

choice
	prompt "Include CPU microcode in CBFS" if ARCH_X86
	default CPU_MICROCODE_CBFS_GENERATE if CPU_MICROCODE_IN_CBFS
	default CPU_MICROCODE_CBFS_NONE if !CPU_MICROCODE_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 CAR_MIGRATION
	def_bool n
	depends on DYNAMIC_CBMEM || EARLY_CBMEM_INIT
	help
	  Migrate the cache-as-ram variables to CBMEM once CBMEM is set up
	  in romstage. This option is only needed if one will be doing more
	  work in romstage after the cache-as-ram is torn down aside from
	  loading ramstage.
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.
