#
# For a description of the syntax of this configuration file,
# see the file Documentation/kbuild/kconfig-language.rst 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 WERROR
	bool "Compile U-Boot with warnings as errors"
	help
	  A U-Boot build should not cause any compiler warnings, and this
	  enables the '-Werror' flag to enforce that rule.

	  However, if you have a new (or very old) compiler or linker with odd
	  and unusual warnings, or you have some architecture with problems,
	  you may need to disable this config option in order to
	  successfully build U-Boot.

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))

choice
	prompt "Optimization level"
	default CC_OPTIMIZE_FOR_SIZE

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

	  This option is enabled by default for U-Boot.

config CC_OPTIMIZE_FOR_SPEED
	bool "Optimize for speed"
	help
	  Enabling this option will pass "-O2" to gcc, resulting in a faster
	  U-Boot image.

config CC_OPTIMIZE_FOR_DEBUG
	bool "Optimize for debugging"
	help
	  Enabling this option will pass "-Og" to gcc, enabling optimizations
	  which don't interfere with debugging.

endchoice

config OPTIMIZE_INLINING
	bool "Allow compiler to uninline functions marked 'inline' in full U-Boot"
	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
	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
	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
	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 ASAN
	bool "Enable AddressSanitizer"
	depends on SANDBOX
	help
	  Enables AddressSanitizer to discover out-of-bounds accesses,
	  use-after-free, double-free and memory leaks.

config FUZZ
	bool "Enable fuzzing"
	depends on CC_IS_CLANG
	depends on DM_FUZZING_ENGINE
	select ASAN
	help
	  Enables the fuzzing infrastructure to generate fuzzing data and run
          fuzz tests.

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"
	depends on ARM64
	select SSCANF
	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 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_SC5XX || ARCH_SUNXI || ARCH_OWL
	default 2 if OMAP34XX
	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_BARGSIZE
	int "Size of kernel command line buffer in bytes"
	depends on SYS_BOOT_GET_CMDLINE
	default 512
	help
	  Buffer size for Boot Arguments which are passed to the application
	  (usually a Linux kernel) when it is booted

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 HAS_CUSTOM_SYS_INIT_SP_ADDR
	bool "Use a custom location for the initial stack pointer address"
	depends on ARC || (ARM && !INIT_SP_RELATIVE) || MIPS || PPC || RISCV
	default y if OMAP34XX || AM33XX || AM43XX || DRA7XX
	default y if TFABOOT
	help
	  Typically, we use an initial stack pointer address that is calculated
	  by taking the statically defined CFG_SYS_INIT_RAM_ADDR, adding the
	  statically defined CFG_SYS_INIT_RAM_SIZE and then subtracting the
	  build-time constant of GENERATED_GBL_DATA_SIZE.  On MIPS a different
	  but statica calculation is performed.  However, some platforms will
	  take a different approach.  Say Y here to define the address statically
	  instead.

config CUSTOM_SYS_INIT_SP_ADDR
	hex "Static location for the initial stack pointer"
	depends on HAS_CUSTOM_SYS_INIT_SP_ADDR
	default 0x4020ff00 if OMAP34XX
	default 0x4030ff00 if AM33XX
	default 0x4033ff00 if AM43XX
	default 0x4037ff00 if DRA7XX
	default TEXT_BASE if TFABOOT

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 0x400 if M68K || PPC || ROCKCHIP_PX30 || ROCKCHIP_RK3036 || \
			 ROCKCHIP_RV1108
	default 0x600 if ARCH_ZYNQMP_R5 || ARCH_ZYNQMP
	default 0x800 if ARCH_ZYNQ || ROCKCHIP_RK3128 || ROCKCHIP_RK3188 || \
			 ROCKCHIP_RK322X || X86
	default 0x1000 if ARCH_MESON || ARCH_BMIPS || ARCH_MTMIPS
	default 0x1800 if ARCH_TEGRA
	default 0x4000 if SANDBOX || RISCV || ARCH_APPLE || ROCKCHIP_RK3368 || \
			  ROCKCHIP_RK3399
	default 0x8000 if RCAR_GEN3
	default 0x10000 if ARCH_IMX8 || ARCH_IMX8M
	default 0x2000
	help
		Size of the malloc() pool for use before relocation. If
		this is defined, then a very simple malloc() implementation
		will become available before relocation. The address is just
		below the global data, and the stack is moved down to make
		space.

		This feature allocates regions with increasing addresses
		within the region. calloc() is supported, but realloc()
		is not available. free() is supported but does nothing.
		The memory will be freed (or in fact just forgotten) when
		U-Boot relocates itself.

config SYS_MALLOC_LEN
	hex "Define memory for Dynamic allocation"
	default 0x4000000 if SANDBOX
	default 0x2000000 if ARCH_ROCKCHIP || ARCH_OMAP2PLUS || ARCH_MESON
	default 0x200000 if ARCH_BMIPS || X86
	default 0x4020000 if SUNXI_MINIMUM_DRAM_MB >= 256
	default 0x220000 if SUNXI_MINIMUM_DRAM_MB >= 64
	default 0x120000 if SUNXI_MINIMUM_DRAM_MB >= 32
	default 0x400000
	help
	  This defines memory to be allocated for Dynamic allocation
	  TODO: Use for other architectures

config SPL_SYS_MALLOC_F
	bool "Enable malloc() pool in SPL"
	depends on SPL_FRAMEWORK && SYS_MALLOC_F && SPL
	default y
	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.

config SPL_SYS_MALLOC_F_LEN
	hex "Size of malloc() pool in SPL"
	depends on SPL_SYS_MALLOC_F
	default 0x2800 if RCAR_GEN3
	default 0x2000 if IMX8MQ
	default SYS_MALLOC_F_LEN
	help
	  Sets the size of the malloc() pool in SPL. This is used for
	  driver model and other features, which must allocate memory for
	  data structures.

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

config TPL_SYS_MALLOC_F
	bool "Enable malloc() pool in TPL"
	depends on SYS_MALLOC_F && TPL
	default y if SPL_SYS_MALLOC_F
	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.

config TPL_SYS_MALLOC_F_LEN
	hex "Size of malloc() pool in TPL"
	depends on TPL_SYS_MALLOC_F
	default SPL_SYS_MALLOC_F_LEN
	help
	  Sets the size of the malloc() pool in TPL. This is used for
	  driver model and other features, which must allocate memory for
	  data structures.

config VALGRIND
	bool "Inform valgrind about memory allocations"
	depends on !RISCV
	help
	  Valgrind is an instrumentation framework for building dynamic analysis
	  tools. In particular, it may be used to detect memory management bugs
	  in U-Boot. It relies on knowing when heap blocks are allocated in
	  order to give accurate results. This happens automatically for
	  standard allocator functions provided by the host OS. However, this
	  doesn't automatically happen for U-Boot's malloc implementation.

	  Enable this option to annotate U-Boot's malloc implementation so that
	  it can be handled accurately by Valgrind. If you aren't planning on
	  using valgrind to debug U-Boot, say 'n'.

config VPL_SYS_MALLOC_F
	bool "Enable malloc() pool in VPL"
	depends on SYS_MALLOC_F && VPL
	default y if SPL_SYS_MALLOC_F
	help
	  In VPL 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 VPL_SYS_MALLOC_F_LEN
	hex "Size of malloc() pool in VPL before relocation"
	depends on VPL_SYS_MALLOC_F
	default SPL_SYS_MALLOC_F_LEN
	help
	  Sets the size of the malloc() pool in VPL. This is used for
	  driver model and other features, which must allocate memory for
	  data structures.

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 SPL_SYS_MALLOC_CLEAR_ON_INIT
	bool "Init with zeros the memory reserved for malloc (slow) in SPL"
	depends on SPL
	default SYS_MALLOC_CLEAR_ON_INIT
	help
	  Same as SYS_MALLOC_CLEAR_ON_INIT, but for SPL. It's possible to
	  Enable it without SYS_MALLOC_CLEAR_ON_INIT. It's useful for boards
	  that must have particular memory regions zero'ed before first use.
	  If SYS_SPL_MALLOC_START is configured to be in such region, this
	  option should be enabled.

config SYS_MALLOC_DEFAULT_TO_INIT
	bool "Default malloc to init while reserving the memory for it"
	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"
	select FDT_64BIT
	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 FDT_64BIT
	bool "64bit fdt address support"
	help
	  Say Y here to support 64bit fdt addresses.
	  This can be used not only for 64bit SoCs, but also
	  for large address extensions 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 REMAKE_ELF
	bool "Recreate an ELF image from raw U-Boot binary"
	help
	  Enable this to recreate an ELF image (u-boot.elf) from the raw
	  U-Boot binary (u-boot.bin), which may already have been statically
	  relocated and may already have a device-tree appended to it.

config BUILD_TARGET
	string "Build target special images"
	default "u-boot-elf.srec" if RCAR_64
	default "u-boot-with-spl.bin" if ARCH_AT91 && SPL_NAND_SUPPORT
	default "u-boot-with-spl.bin" if MPC85xx && !E500MC && !E5500 && !E6500 && SPL
	default "u-boot-with-spl.imx" if ARCH_MX6 && SPL
	default "u-boot-with-spl.kwb" if ARMADA_32BIT && SPL
	default "u-boot-with-spl.sfp" if TARGET_SOCFPGA_ARRIA10
	default "u-boot-with-spl.sfp" if TARGET_SOCFPGA_GEN5
	default "u-boot.itb" if !BINMAN && SPL_LOAD_FIT && (ARCH_ROCKCHIP || \
				RISCV || ARCH_ZYNQMP)
	default "u-boot.kwb" if (ARCH_KIRKWOOD || ARMADA_32BIT) && !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 HAS_BOARD_SIZE_LIMIT
	bool "Define a maximum size for the U-Boot image"
	default y if RCAR_32 || RCAR_64
	help
	  In some cases, we need to enforce a hard limit on how big the U-Boot
	  image itself can be.

config BOARD_SIZE_LIMIT
	int "Maximum size of the U-Boot image in bytes"
	default 524288 if RCAR_32
	default 1048576 if RCAR_64
	depends on HAS_BOARD_SIZE_LIMIT
	help
	  Maximum size of the U-Boot image. When defined, the build system
	  checks that the actual size does not exceed it.  This does not
	  include SPL nor TPL, on platforms that use that functionality, they
	  have a separate option to restict size.

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 SYS_LOAD_ADDR
	hex "Address in memory to use by default"
	default 0x01000000 if ARCH_SOCFPGA
	default 0x02000000 if PPC || X86
	default 0x81000000 if MACH_SUNIV
	default 0x22000000 if MACH_SUN9I
	default 0x42000000 if ARCH_SUNXI
	default 0x82000000 if ARCH_KEYSTONE || ARCH_OMAP2PLUS || ARCH_K3
	default 0x82000000 if ARCH_MX6 && (MX6SL || MX6SLL  || MX6SX || MX6UL || MX6ULL)
	default 0x12000000 if ARCH_MX6 && !(MX6SL || MX6SLL  || MX6SX || MX6UL || MX6ULL)
	default 0x80800000 if ARCH_MX7
	default 0x90000000 if FSL_LSCH2 || FSL_LSCH3
	default 0x0 if ARCH_SC5XX
	help
	  Address in memory to use as the default safe load address.

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_NET || ARCH_VERSAL || ARCH_ZYNQMP
	default 0x200000 if MICROBLAZE
	default 0x4000 if ARCH_STM32
	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_MEM_TOP_HIDE
	hex "Exclude some memory from U-Boot / OS information"
	default 0x0
	help
	  If set, this specified memory area will get subtracted from the top
	  (end) of RAM and won't get "touched" at all by U-Boot. By fixing up
	  gd->ram_size the OS / next stage should gets passed the now
	  "corrected" memory size and won't touch it either.
	  WARNING: Please make sure that this value is a multiple of the OS
	  page size.

config SYS_MONITOR_LEN
	int "Maximum size in bytes reserved for U-Boot in memory"
	default 1048576 if X86
	default 262144 if OMAP34XX
	default 786432 if ARCH_SUNXI
	default 0
	help
	  Size of memory reserved for monitor code, used to determine
	  _at_compile_time_ (!) if the environment is embedded within the
	  U-Boot image, or in a separate flash sector, among other uses where
	  we need to set a maximum size of the U-Boot binary itself that will
	  be loaded.

config MP
	bool "Support for multiprocessor"
	help
	  This provides an option to bringup different processors
	  in multiprocessor cases.

config HAVE_TEXT_BASE
	bool
	depends on !NIOS2 && !XTENSA
	depends on !EFI_APP
	default y

config TEXT_BASE
	depends on HAVE_TEXT_BASE
	default 0x0 if POSITION_INDEPENDENT
	default 0x17800000 if ARCH_MX6
	default 0x87800000 if ARCH_MX7
	default 0x80800000 if ARCH_OMAP2PLUS || ARCH_K3
	default 0x81700000 if MACH_SUNIV
	default 0x2a000000 if MACH_SUN9I
	default 0x4a000000 if SUNXI_MINIMUM_DRAM_MB >= 256
	default 0x42e00000 if SUNXI_MINIMUM_DRAM_MB >= 64
	default 0x96000000 if ARCH_SC5XX && SC59X_64
	default 0xB2200000 if ARCH_SC5XX && SC59X
	default 0x89200000 if ARCH_SC5XX && TARGET_SC584_EZKIT
	default 0xC2200000 if ARCH_SC5XX && (TARGET_SC589_EZKIT || TARGET_SC589_MINI)
	default 0x82200000 if ARCH_SC5XX && SC57X
	hex "Text Base"
	help
	  The address in memory that U-Boot will be copied and executed from
	  initially.

config HAVE_SYS_UBOOT_START
	bool "Use custom U-Boot Start"
	depends on HAVE_TEXT_BASE
	help
	  By default, the address in memory that U-Boot will be copied from
	  (TEXT_BASE) and the entry point are the same. Select this to start the
	  execution of U-Boot from a different address.
	  This may be required if a header or vector table needs to be copied
	  but not executed.

config SYS_UBOOT_START
	hex
	depends on HAVE_TEXT_BASE
	default TEXT_BASE
	prompt "U-Boot entry" if HAVE_SYS_UBOOT_START
	help
	  If TEXT_BASE differs from the start of execution, this sets the
	  address in memory that U-Boot will start execution from initially.

config HAVE_SYS_MONITOR_BASE
	bool
	depends on ARC || MIPS || M68K || NIOS2 || PPC || XTENSA || X86 \
		|| ENV_IS_IN_FLASH || MTD_NOR_FLASH
	depends on !EFI_APP
	default y

config SYS_MONITOR_BASE
	depends on HAVE_SYS_MONITOR_BASE
	hex "Physical start address of boot monitor code"
	default TEXT_BASE
	help
	  The physical start address of boot monitor code (which is the same as
	  CONFIG_TEXT_BASE when linking) and the same as CFG_SYS_FLASH_BASE
	  when booting from flash.

config SPL_SYS_MONITOR_BASE
	depends on MPC85xx && SPL && HAVE_SYS_MONITOR_BASE
	hex "Physical start address of SPL monitor code"
	default SPL_TEXT_BASE

config TPL_SYS_MONITOR_BASE
	depends on MPC85xx && TPL && HAVE_SYS_MONITOR_BASE
	hex "Physical start address of TPL monitor code"

config DYNAMIC_SYS_CLK_FREQ
	bool "Determine CPU clock frequency at run-time"
	help
	  Implement a get_board_sys_clk function that will determine the CPU
	  clock frequency at run time, rather than define it statically.

config SYS_CLK_FREQ
	depends on !DYNAMIC_SYS_CLK_FREQ
	int "CPU clock frequency"
	default 125000000 if ARCH_LS1012A
	default 100000000 if ARCH_P2020 || ARCH_T1024 || ARCH_T1042 || \
			     ARCH_LS1021A || FSL_LSCH2 || FSL_LSCH3
	default 66666666 if ARCH_P1010 || ARCH_P1020 || ARCH_T4240
	default 66660000 if ARCH_T2080
	default 33333333 if RCAR_GEN3
	default 24000000 if ARCH_EXYNOS
	default 20000000 if RCAR_GEN2
	default 0
	help
	  A static value for the CPU frequency.  Note that if not required
	  for a given SoC, this can be left at 0.

config HAS_LDR
	bool
	help
	  Enables building .ldr targets for U-Boot and SPL. This does not
	  automatically build any additional targets with make or buildman.

config LDR_CPU
	string "CPU name to be passed to LDR utility."
	depends on HAS_LDR
	help
	  Set the CPU name for the -T parameter in the LDR utility.  This is
	  generally used on processors from Analog Devices, but may be also
	  be useful for other vendors.

source "api/Kconfig"

endmenu		# General setup

source "boot/Kconfig"

source "common/Kconfig"

source "cmd/Kconfig"

source "disk/Kconfig"

source "dts/Kconfig"

source "env/Kconfig"

menu "Networking"

choice
	prompt "Networking stack"
	default NET

config NO_NET
	bool "No networking support"
	help
	  Do not include networking support

config NET
	bool "Legacy U-Boot networking stack"
	imply NETDEVICES
	help
	  Include networking support with U-Boot's internal implementation of
	  the TCP/IP protocol stack.

config NET_LWIP
	bool "Use lwIP for networking stack"
	imply NETDEVICES
	help
	  Include networking support based on the lwIP (lightweight IP)
	  TCP/IP stack (https://nongnu.org/lwip). This is a replacement for
	  the default U-Boot network stack and applications located in net/
	  and enabled via CONFIG_NET as well as other pieces of code that
	  depend on CONFIG_NET (such as cmd/net.c enabled via CONFIG_CMD_NET).
	  Therefore the two symbols CONFIG_NET and CONFIG_NET_LWIP are mutually
	  exclusive.

endchoice

source "net/Kconfig"

endmenu

source "drivers/Kconfig"

source "fs/Kconfig"

source "lib/Kconfig"

source "test/Kconfig"

source "tools/Kconfig"
