# 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/*/Kconfig"

if ARCH_X86

config DCACHE_RAM_BASE
	hex

config DCACHE_RAM_SIZE
	hex

config DCACHE_BSP_STACK_SIZE
	hex

config EARLYRAM_BSP_STACK_SIZE
	depends on RESET_VECTOR_IN_RAM
	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 SSE
	bool
	help
	  Select SSE in your socket or model Kconfig if your CPU has SSE
	  streaming SIMD instructions.

config SSE2
	bool
	default n
	select SSE
	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

config USES_MICROCODE_HEADER_FILES
	def_bool n
	select SUPPORT_CPU_UCODE_IN_CBFS
	help
	  This is selected by a board or chipset to set the default for the
	  microcode source choice to a list of external microcode headers

config MICROCODE_BLOB_NOT_IN_BLOB_REPO
	bool
	help
	  Selected by platforms that don't maintain microcode updates in the
	  blobs repo yet.

config MICROCODE_BLOB_NOT_HOOKED_UP
	bool
	help
	  Selected by platforms that haven't hooked microcode updates up yet.

config MICROCODE_BLOB_UNDISCLOSED
	bool
	help
	  Selected by work-in-progress platforms that don't have microcode
	  updates available yet.

config USE_CPU_MICROCODE_CBFS_BINS
	bool
	help
	  Automatically selected below to add binary microcode files
	  (`cpu_microcode_bins` in the makefiles) to CBFS.

choice
	prompt "Include CPU microcode in CBFS" if ARCH_X86
	default CPU_MICROCODE_CBFS_EXTERNAL_HEADER if USES_MICROCODE_HEADER_FILES
	default CPU_MICROCODE_CBFS_NONE if MICROCODE_BLOB_NOT_IN_BLOB_REPO || \
					   MICROCODE_BLOB_NOT_HOOKED_UP || \
					   MICROCODE_BLOB_UNDISCLOSED
	depends on SUPPORT_CPU_UCODE_IN_CBFS

config CPU_MICROCODE_CBFS_DEFAULT_BINS
	bool "Generate from tree"
	select USE_CPU_MICROCODE_CBFS_BINS
	depends on !(MICROCODE_BLOB_NOT_IN_BLOB_REPO || \
		     MICROCODE_BLOB_NOT_HOOKED_UP || \
		     MICROCODE_BLOB_UNDISCLOSED)
	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_BINS
	bool "Include external microcode binary"
	select USE_CPU_MICROCODE_CBFS_BINS
	help
	  Select this option if you want to include external binary files
	  in the CPUs native format. They 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, and applicable, select "Generate from tree"

config CPU_MICROCODE_CBFS_EXTERNAL_HEADER
	bool "Include external microcode header files"
	help
	  Select this option if you want to include external c header files
	  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, and applicable, 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.

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

	  If unsure, and applicable, 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_HEADER_FILES
	string "List of space separated microcode header files with the path"
	depends on CPU_MICROCODE_CBFS_EXTERNAL_HEADER
	help
	  A list of one or more microcode header files with path from the
	  coreboot directory.  These should be separated by spaces.

config CPU_UCODE_BINARIES
	string "Microcode binary path and filename"
	depends on CPU_MICROCODE_CBFS_EXTERNAL_BINS
	default ""
	help
	  Some platforms have microcode in the blobs directory, and these can
	  be hardcoded in the makefiles.  For platforms with microcode
	  binaries that aren't in the makefile, set this option to pull
	  in the microcode.

	  This should contain the full path of the file for one or more
	  microcode binary files to include, separated by spaces.

	  If unsure, leave this blank.
