#
# For a description of the syntax of this configuration file,
# see the file Documentation/kbuild/kconfig-language.txt in the
# Linux kernel source tree.
#
mainmenu "U-Boot $(UBOOTVERSION) Configuration"

comment "Compiler: $(CC_VERSION_TEXT)"

source "scripts/Kconfig.include"

# Allow defaults in arch-specific code to override any given here
source "arch/Kconfig"

menu "General setup"

config BROKEN
	bool
	help
	  This option cannot be enabled. It is used as dependency
	  for broken and incomplete features.

config DEPRECATED
	bool
	help
	  This option cannot be enabled.  It it used as a dependency for
	  code that relies on deprecated features that will be removed and
	  the conversion deadline has passed.

config LOCALVERSION
	string "Local version - append to U-Boot release"
	help
	  Append an extra string to the end of your U-Boot version.
	  This will show up in your boot log, for example.
	  The string you set here will be appended after the contents of
	  any files with a filename matching localversion* in your
	  object and source tree, in that order.  Your total string can
	  be a maximum of 64 characters.

config LOCALVERSION_AUTO
	bool "Automatically append version information to the version string"
	default y
	help
	  This will try to automatically determine if the current tree is a
	  release tree by looking for Git tags that belong to the current
	  top of tree revision.

	  A string of the format -gxxxxxxxx will be added to the localversion
	  if a Git-based tree is found.  The string generated by this will be
	  appended after any matching localversion* files, and after the value
	  set in CONFIG_LOCALVERSION.

	  (The actual string used here is the first eight characters produced
	  by running the command:

	    $ git rev-parse --verify HEAD

	  which is done within the script "scripts/setlocalversion".)

config CC_IS_GCC
	def_bool $(success,$(CC) --version | head -n 1 | grep -q gcc)

config GCC_VERSION
	int
	default $(shell,$(srctree)/scripts/gcc-version.sh -p $(CC) | sed 's/^0*//') if CC_IS_GCC
	default 0

config CC_IS_CLANG
	def_bool $(success,$(CC) --version | head -n 1 | grep -q clang)

config CLANG_VERSION
	int
	default $(shell,$(srctree)/scripts/clang-version.sh $(CC))

config CC_OPTIMIZE_FOR_SIZE
	bool "Optimize for size"
	default y
	help
	  Enabling this option will pass "-Os" instead of "-O2" to gcc
	  resulting in a smaller U-Boot image.

	  This option is enabled by default for U-Boot.

config OPTIMIZE_INLINING
	bool "Allow compiler to uninline functions marked 'inline' in full U-Boot"
	default n
	help
	  This option determines if U-Boot forces gcc to inline the functions
	  developers have marked 'inline'. Doing so takes away freedom from gcc to
	  do what it thinks is best, which is desirable in some cases for size
	  reasons.

config SPL_OPTIMIZE_INLINING
	bool "Allow compiler to uninline functions marked 'inline' in SPL"
	depends on SPL
	default n
	help
	  This option determines if U-Boot forces gcc to inline the functions
	  developers have marked 'inline'. Doing so takes away freedom from gcc to
	  do what it thinks is best, which is desirable in some cases for size
	  reasons.

config ARCH_SUPPORTS_LTO
	bool

config LTO
	bool "Enable Link Time Optimizations"
	depends on ARCH_SUPPORTS_LTO
	default n
	help
	  This option enables Link Time Optimization (LTO), a mechanism which
	  allows the compiler to optimize between different compilation units.

	  This can optimize away dead code paths, resulting in smaller binary
	  size (if CC_OPTIMIZE_FOR_SIZE is enabled).

	  This option is not available for every architecture and may
	  introduce bugs.

	  Currently, when compiling with GCC, due to a weird bug regarding
	  jobserver, the final linking will not respect make's --jobs argument.
	  Instead all available processors will be used (as reported by the
	  nproc command).

	  If unsure, say n.

config TPL_OPTIMIZE_INLINING
	bool "Allow compiler to uninline functions marked 'inline' in TPL"
	depends on TPL
	default n
	help
	  This option determines if U-Boot forces gcc to inline the functions
	  developers have marked 'inline'. Doing so takes away freedom from gcc to
	  do what it thinks is best, which is desirable in some cases for size
	  reasons.

config CC_COVERAGE
	bool "Enable code coverage analysis"
	depends on SANDBOX
	help
	  Enabling this option will pass "--coverage" to gcc to compile
	  and link code instrumented for coverage analysis.

config CC_HAS_ASM_INLINE
	def_bool $(success,echo 'void foo(void) { asm inline (""); }' | $(CC) -x c - -c -o /dev/null)

config XEN
	bool "Select U-Boot be run as a bootloader for XEN Virtual Machine"
	help
	  Enabling this option will make U-Boot be run as a bootloader
	  for XEN [1] Virtual Machine.

	  Xen is a virtual machine monitor (VMM) or a type-1 hypervisor with support
	  for para-virtualization. Xen can organize the safe execution of several
	  virtual machines on the same physical system with performance close to
	  native. It is used as the basis for a number of different commercial and
	  open source applications, such as: server virtualization, Infrastructure
	  as a Service (IaaS), desktop virtualization, security applications,
	  embedded and hardware appliances.
	  Xen has a special VM called Domain-0 that runs the Dom0 kernel and allows
	  Xen to use the device drivers for the Domain-0 kernel by default.

	  [1] - https://xenproject.org/

config DISTRO_DEFAULTS
	bool "Select defaults suitable for booting general purpose Linux distributions"
	select AUTO_COMPLETE
	select CMDLINE_EDITING
	select CMD_BOOTI if ARM64
	select CMD_BOOTZ if ARM && !ARM64
	select CMD_DHCP if CMD_NET
	select CMD_ENV_EXISTS
	select CMD_EXT2
	select CMD_EXT4
	select CMD_FAT
	select CMD_FS_GENERIC
	select CMD_PART if PARTITIONS
	select CMD_PING if CMD_NET
	select CMD_PXE if NET
	select CMD_SYSBOOT
	select ENV_VARS_UBOOT_CONFIG
	select HUSH_PARSER
	select SUPPORT_RAW_INITRD
	select SYS_LONGHELP
	imply CMD_MII if NET
	imply USB_STORAGE
	imply USE_BOOTCOMMAND
	help
	  Select this to enable various options and commands which are suitable
	  for building u-boot for booting general purpose Linux distributions.

config ENV_VARS_UBOOT_CONFIG
	bool "Add arch, board, vendor and soc variables to default environment"
	help
	  Define this in order to add variables describing the
	  U-Boot build configuration to the default environment.
	  These will be named arch, cpu, board, vendor, and soc.
	  Enabling this option will cause the following to be defined:
	  - CONFIG_SYS_ARCH
	  - CONFIG_SYS_CPU
	  - CONFIG_SYS_BOARD
	  - CONFIG_SYS_VENDOR
	  - CONFIG_SYS_SOC

config NR_DRAM_BANKS
	int "Number of DRAM banks"
	default 1 if ARCH_SUNXI || ARCH_OWL
	default 4
	help
	  This defines the number of DRAM banks.

config SYS_BOOT_GET_CMDLINE
	bool "Enable kernel command line setup"
	help
	  Enables allocating and saving kernel cmdline in space between
	  "bootm_low" and "bootm_low" + BOOTMAPSZ.

config SYS_BOOT_GET_KBD
	bool "Enable kernel board information setup"
	help
	  Enables allocating and saving a kernel copy of the bd_info in
	  space between "bootm_low" and "bootm_low" + BOOTMAPSZ.

config SYS_MALLOC_F
	bool "Enable malloc() pool before relocation"
	default y if DM

	help
	  Before relocation, memory is very limited on many platforms. Still,
	  we can provide a small malloc() pool if needed. Driver model in
	  particular needs this to operate, so that it can allocate the
	  initial serial device and any others that are needed.

config SYS_MALLOC_F_LEN
	hex "Size of malloc() pool before relocation"
	depends on SYS_MALLOC_F
	default 0x1000 if AM33XX
	default 0x4000 if SANDBOX
	default 0x2000 if (ARCH_IMX8 || ARCH_IMX8M || ARCH_MX7 || \
			   ARCH_MX7ULP || ARCH_MX6 || ARCH_MX5 || \
			   ARCH_LS1012A || ARCH_LS1021A || ARCH_LS1043A || \
			   ARCH_LS1046A || ARCH_QEMU || ARCH_SUNXI || ARCH_OWL)
	default 0x400
	help
	  Before relocation, memory is very limited on many platforms. Still,
	  we can provide a small malloc() pool if needed. Driver model in
	  particular needs this to operate, so that it can allocate the
	  initial serial device and any others that are needed.

config SYS_MALLOC_LEN
	hex "Define memory for Dynamic allocation"
	depends on ARCH_ZYNQ || ARCH_VERSAL || ARCH_STM32MP || ARCH_ROCKCHIP
	default 0x2000000 if ARCH_ROCKCHIP
	help
	  This defines memory to be allocated for Dynamic allocation
	  TODO: Use for other architectures

config SPL_SYS_MALLOC_F_LEN
	hex "Size of malloc() pool in SPL"
	depends on SYS_MALLOC_F && SPL
	default 0x2800 if RCAR_GEN3
	default SYS_MALLOC_F_LEN
	help
	  In SPL memory is very limited on many platforms. Still,
	  we can provide a small malloc() pool if needed. Driver model in
	  particular needs this to operate, so that it can allocate the
	  initial serial device and any others that are needed.

	  It is possible to enable CONFIG_SYS_SPL_MALLOC_START to start a new
	  malloc() region in SDRAM once it is inited.

config TPL_SYS_MALLOC_F_LEN
	hex "Size of malloc() pool in TPL"
	depends on SYS_MALLOC_F && TPL
	default SPL_SYS_MALLOC_F_LEN
	help
	  In TPL memory is very limited on many platforms. Still,
	  we can provide a small malloc() pool if needed. Driver model in
	  particular needs this to operate, so that it can allocate the
	  initial serial device and any others that are needed.

menuconfig EXPERT
	bool "Configure standard U-Boot features (expert users)"
	default y
	help
	  This option allows certain base U-Boot options and settings
	  to be disabled or tweaked. This is for specialized
	  environments which can tolerate a "non-standard" U-Boot.
	  Use this only if you really know what you are doing.

if EXPERT
	config SYS_MALLOC_CLEAR_ON_INIT
	bool "Init with zeros the memory reserved for malloc (slow)"
	default y
	help
	  This setting is enabled by default. The reserved malloc
	  memory is initialized with zeros, so first malloc calls
	  will return the pointer to the zeroed memory. But this
	  slows the boot time.

	  It is recommended to disable it, when CONFIG_SYS_MALLOC_LEN
	  value, has more than few MiB, e.g. when uses bzip2 or bmp logo.
	  Then the boot time can be significantly reduced.
	  Warning:
	  When disabling this, please check if malloc calls, maybe
	  should be replaced by calloc - if one expects zeroed memory.

config SYS_MALLOC_DEFAULT_TO_INIT
	bool "Default malloc to init while reserving the memory for it"
	default n
	help
	  It may happen that one needs to move the dynamic allocation
	  from one to another memory range, eg. when moving the malloc
	  from the limited static to a potentially large dynamic (DDR)
	  memory.

	  If so then on top of setting the updated memory aside one
	  needs to bring the malloc init.

	  If such a scenario is sought choose yes.

config TOOLS_DEBUG
	bool "Enable debug information for tools"
	help
	  Enable generation of debug information for tools such as mkimage.
	  This can be used for debugging purposes. With debug information
	  it is possible to set breakpoints on particular lines, single-step
	  debug through the source code, etc.

endif # EXPERT

config PHYS_64BIT
	bool "64bit physical address support"
	help
	  Say Y here to support 64bit physical memory address.
	  This can be used not only for 64bit SoCs, but also for
	  large physical address extension on 32bit SoCs.

config HAS_ROM
	bool
	select BINMAN
	help
	  Enables building of a u-boot.rom target. This collects U-Boot and
	  any necessary binary blobs.

config SPL_IMAGE
	string "SPL image used in the combined SPL+U-Boot image"
	default "spl/boot.bin" if ARCH_AT91 && SPL_NAND_SUPPORT
	default "spl/u-boot-spl.bin"
	depends on SPL
	help
	  Select the SPL build target that shall be generated by the SPL
	  build process (default spl/u-boot-spl.bin). This image will be
	  used to generate a combined image with SPL and main U-Boot
	  proper as one single image.

config BUILD_TARGET
	string "Build target special images"
	default "u-boot-with-spl.sfp" if TARGET_SOCFPGA_ARRIA10
	default "u-boot-with-spl.sfp" if TARGET_SOCFPGA_GEN5
	default "u-boot-spl.kwb" if ARCH_MVEBU && SPL
	default "u-boot-elf.srec" if RCAR_GEN3
	default "u-boot.itb" if !BINMAN && SPL_LOAD_FIT && (ARCH_ROCKCHIP || \
				ARCH_SUNXI || RISCV || ARCH_ZYNQMP)
	default "u-boot.kwb" if ARCH_KIRKWOOD
	default "u-boot-with-spl.bin" if ARCH_AT91 && SPL_NAND_SUPPORT
	default "u-boot-with-spl.imx" if ARCH_MX6 && SPL
	help
	  Some SoCs need special image types (e.g. U-Boot binary
	  with a special header) as build targets. By defining
	  CONFIG_BUILD_TARGET in the SoC / board header, this
	  special image will be automatically built upon calling
	  make / buildman.

config SYS_CUSTOM_LDSCRIPT
	bool "Use a custom location for the U-Boot linker script"
	help
	  Normally when linking U-Boot we will look in the board directory,
	  the CPU directory and finally the "cpu" directory of the architecture
	  for the ile "u-boot.lds" and use that as our linker.  However, in
	  some cases we need to provide a different linker script.  To do so,
	  enable this option and then provide the location under
	  CONFIG_SYS_LDSCRIPT.

config SYS_LDSCRIPT
	depends on SYS_CUSTOM_LDSCRIPT
	string "Custom ldscript location"
	help
	  Path within the source tree to the linker script to use for the
	  main U-Boot binary.

config ERR_PTR_OFFSET
	hex
	default 0x0
	help
	  Some U-Boot pointers have redundant information, so we can use a
	  scheme where we can return either an error code or a pointer with the
	  same return value. The default implementation just casts the pointer
	  to a number, however, this may fail on platforms where the end of the
	  address range is used for valid pointers (e.g. 0xffffff00 is a valid
	  heap pointer in socfpga SPL).
	  For such platforms, this value provides an upper range of those error
	  pointer values - up to 'MAX_ERRNO' bytes below this value must be
	  unused/invalid addresses.

config PLATFORM_ELFENTRY
	string
	default "__start" if MIPS
	default "_start"

config STACK_SIZE
	hex "Define max stack size that can be used by U-Boot"
	default 0x4000000 if ARCH_VERSAL || ARCH_ZYNQMP
	default 0x200000 if MICROBLAZE
	default 0x1000000
	help
	  Define Max stack size that can be used by U-Boot. This value is used
	  by the UEFI sub-system. On some boards initrd_high is calculated as
	  base stack pointer minus this stack size.

config SYS_HAS_SRAM
	bool
	default y if TARGET_PIC32MZDASK
	default y if TARGET_DEVKIT8000
	default y if TARGET_TRICORDER
	default n
	help
	  Enable this to allow support for the on board SRAM.
	  SRAM base address is controlled by CONFIG_SYS_SRAM_BASE.
	  SRAM size is controlled by CONFIG_SYS_SRAM_SIZE.

config SYS_SRAM_BASE
	hex
	default 0x80000000 if TARGET_PIC32MZDASK
	default 0x40200000 if TARGET_DEVKIT8000
	default 0x40200000 if TARGET_TRICORDER
	default 0x0

config SYS_SRAM_SIZE
	hex
	default 0x00080000 if TARGET_PIC32MZDASK
	default 0x10000 if TARGET_DEVKIT8000
	default 0x10000 if TARGET_TRICORDER
	default 0x0

config EXAMPLES
	bool "Compile API examples"
	depends on !SANDBOX
	default y if ARCH_QEMU
	help
	  U-Boot provides an API for standalone applications. Examples are
	  provided in directory examples/.

endmenu		# General setup

source "api/Kconfig"

source "common/Kconfig"

source "cmd/Kconfig"

source "disk/Kconfig"

source "dts/Kconfig"

source "env/Kconfig"

source "net/Kconfig"

source "drivers/Kconfig"

source "fs/Kconfig"

source "lib/Kconfig"

source "test/Kconfig"

source "tools/Kconfig"
