# 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 && !CPU_INTEL_MICROCODE_CBFS_SPLIT_BINS

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.
