menu "Console"

config MENU
	bool
	help
	  This is the library functionality to provide a text-based menu of
	  choices for the user to make choices with.

config CONSOLE_RECORD
	bool "Console recording"
	help
	  This provides a way to record console output (and provide console
	  input) through circular buffers. This is mostly useful for testing.
	  Console output is recorded even when the console is silent.
	  To enable console recording, call console_record_reset_enable()
	  from your code.

config CONSOLE_RECORD_INIT_F
	bool "Enable console recording during pre-relocation init"
	depends on CONSOLE_RECORD && SYS_MALLOC_F
	default y
	help
	  This option enables console recording during pre-relocation init.
	  CONFIG_SYS_MALLOC_F must be enabled to use this feature.

config CONSOLE_RECORD_OUT_SIZE
	hex "Output buffer size"
	depends on CONSOLE_RECORD
	default 0x400 if CONSOLE_RECORD
	help
	  Set the size of the console recording output buffer. When this fills
	  up, no more data will be recorded until some is removed. The buffer
	  is allocated immediately after the malloc() region is ready.

config CONSOLE_RECORD_OUT_SIZE_F
	hex "Output buffer size before relocation"
	depends on CONSOLE_RECORD
	default 0x400 if CONSOLE_RECORD
	help
	  Set the size of the console recording output buffer before
	  relocation. When this fills up, no more data will be recorded until
	  some is removed.  The buffer is allocated immediately after the early
	  malloc() region is ready.

config CONSOLE_RECORD_IN_SIZE
	hex "Input buffer size"
	depends on CONSOLE_RECORD
	default 0x100 if CONSOLE_RECORD
	help
	  Set the size of the console recording input buffer. When this contains data,
	  tstc() and getc() will use this in preference to real device input.
	  The buffer is allocated immediately after the malloc() region is
	  ready.

config SYS_CBSIZE
	int "Console input buffer size"
	default 2048 if ARCH_TEGRA || ARCH_VERSAL || ARCH_ZYNQ || ARCH_ZYNQMP || \
		RCAR_GEN3 || TARGET_SOCFPGA_SOC64
	default 512 if ARCH_MX5 || ARCH_MX6 || ARCH_MX7 || FSL_LSCH2 || \
		FSL_LSCH3 || X86
	default 256 if M68K || PPC
	default 1024
	help
	  Set the size of the console input buffer. This is used both in the
	  case of reading input literally from the user in some manner as well
	  as when we need to construct or modify that type of input, for
	  example when constructing "bootargs" for the OS.

config SYS_PBSIZE
	int "Console output buffer size"
	default 1024 if ARCH_SUNXI
	default 1044
	help
	  Set the size of the console output buffer. This is used when we need
	  to work with some form of a buffer while providing output in some
	  form to the user.

config DISABLE_CONSOLE
	bool "Add functionality to disable console completely"
	help
		Disable console (in & out).

config IDENT_STRING
	string "Board specific string to be added to uboot version string"
	help
	  This options adds the board specific name to u-boot version.

config LOGLEVEL
	int "loglevel"
	default 4
	range 0 10
	help
	  All Messages with a loglevel smaller than the console loglevel will
	  be compiled in. The loglevels are defined as follows:

	    0 - emergency
	    1 - alert
	    2 - critical
	    3 - error
	    4 - warning
	    5 - note
	    6 - info
	    7 - debug
	    8 - debug content
	    9 - debug hardware I/O

config SPL_LOGLEVEL
	int
	depends on SPL
	default LOGLEVEL

config TPL_LOGLEVEL
	int
	depends on TPL
	default LOGLEVEL

config VPL_LOGLEVEL
	int "loglevel for VPL"
	depends on VPL
	default LOGLEVEL
	help
	  All Messages with a loglevel smaller than the console loglevel will
	  be compiled in to VPL. See LOGLEVEL for a list of available log
	  levels. Setting this to a value above 4 may increase the code size
	  significantly.

config SILENT_CONSOLE
	bool "Support a silent console"
	help
	  This option allows the console to be silenced, meaning that no
	  output will appear on the console devices. This is controlled by
	  setting the environment variable 'silent' to a non-empty value.
	  Note this also silences the console when booting Linux.

	  When the console is set up, the variable is checked, and the
	  GD_FLG_SILENT flag is set. Changing the environment variable later
	  will update the flag.

config SPL_SILENT_CONSOLE
	bool "Use a silent console in SPL"
	default y if SILENT_CONSOLE && !SANDBOX
	help
	  This selects a silent console in SPL. When enabled it drops some
	  output messages. The GD_FLG_SILENT flag is not used in SPL so there
	  is no run-time control of console messages in SPL.

	  Future work may allow the SPL console to be silenced completely using
	  this option.

config TPL_SILENT_CONSOLE
	bool "Use a silent console in TPL"
	default y if SILENT_CONSOLE && !SANDBOX
	help
	  This selects a silent console in TPL. When enabled it drops some
	  output messages. The GD_FLG_SILENT flag is not used in TPL so there
	  is no run-time control of console messages in TPL.

	  Future work may allow the TPL console to be silenced completely using
	  this option.

config SILENT_U_BOOT_ONLY
	bool "Only silence the U-Boot console"
	depends on SILENT_CONSOLE
	help
	  Normally when the U-Boot console is silenced, Linux's console is
	  also silenced (assuming the board boots into Linux). This option
	  allows the linux console to operate normally, even if U-Boot's
	  is silenced.

config SILENT_CONSOLE_UPDATE_ON_SET
	bool "Changes to the 'silent' environment variable update immediately"
	depends on SILENT_CONSOLE
	default y if SILENT_CONSOLE
	help
	  When the 'silent' environment variable is changed, update the
	  console silence flag immediately. This allows 'setenv' to be used
	  to silence or un-silence the console.

	  The effect is that any change to the variable will affect the
	  GD_FLG_SILENT flag.

config SILENT_CONSOLE_UPDATE_ON_RELOC
	bool "Allow flags to take effect on relocation"
	depends on SILENT_CONSOLE
	help
	  In some cases the environment is not available until relocation
	  (e.g. NAND). This option makes the value of the 'silent'
	  environment variable take effect at relocation.

config SILENT_CONSOLE_UNTIL_ENV
	bool "Keep console silent until environment is loaded"
	depends on SILENT_CONSOLE
	help
	  This option makes sure U-Boot will never use the console unless the
	  environment from flash does not contain the 'silent' variable.  If
	  set, the console is kept silent until after the environment was
	  loaded.  Use this in combination with PRE_CONSOLE_BUFFER to print out
	  earlier messages after loading the environment when allowed.

config PRE_CONSOLE_BUFFER
	bool "Buffer characters before the console is available"
	help
	  Prior to the console being initialised (i.e. serial UART
	  initialised etc) all console output is silently discarded.
	  Defining CONFIG_PRE_CONSOLE_BUFFER will cause U-Boot to
	  buffer any console messages prior to the console being
	  initialised to a buffer. The buffer is a circular buffer, so
	  if it overflows, earlier output is discarded.

	  Note that this is not currently supported in SPL. It would be
	  useful to be able to share the pre-console buffer with SPL.

config PRE_CON_BUF_SZ
	int "Sets the size of the pre-console buffer"
	depends on PRE_CONSOLE_BUFFER
	default 4096
	help
	  The size of the pre-console buffer affects how much console output
	  can be held before it overflows and starts discarding earlier
	  output. Normally there is very little output at this early stage,
	  unless debugging is enabled, so allow enough for ~10 lines of
	  text.

	  This is a useful feature if you are using a video console and
	  want to see the full boot output on the console. Without this
	  option only the post-relocation output will be displayed.

config PRE_CON_BUF_ADDR
	hex "Address of the pre-console buffer"
	depends on PRE_CONSOLE_BUFFER
	default 0x2f000000 if ARCH_SUNXI && MACH_SUN9I
	default 0x4f000000 if ARCH_SUNXI && !MACH_SUN9I
	default 0x0f000000 if ROCKCHIP_RK3288
	default 0x0f200000 if ROCKCHIP_RK3399 || ROCKCHIP_RK3328
	help
	  This sets the start address of the pre-console buffer. This must
	  be in available memory and is accessed before relocation and
	  possibly before DRAM is set up. Therefore choose an address
	  carefully.

	  We should consider removing this option and allocating the memory
	  in board_init_f_init_reserve() instead.

config CONSOLE_FLUSH_SUPPORT
	bool "Enable console flush support"
	default y
	help
	  This enables compilation of flush() function for console flush support.

config CONSOLE_FLUSH_ON_NEWLINE
	bool "Flush console buffer on every newline character"
	depends on DM_SERIAL
	help
	  This makes the serial core code flush the console device
	  whenever a newline (\n) character has been emitted. This can
	  be especially useful when "printf debugging", as otherwise
	  lots of output could still be in the UART's FIFO by the time
	  one hits the code which causes the CPU to hang or reset.

config CONSOLE_MUX
	bool "Enable console multiplexing"
	default y if VIDEO || LCD
	help
	  This allows multiple devices to be used for each console 'file'.
	  For example, stdout can be set to go to serial and video.
	  Similarly, stdin can be set to come from serial and keyboard.
	  Input can be provided from either source. Console multiplexing
	  adds a small amount of size to U-Boot.  Changes to the environment
	  variables stdout, stdin and stderr will take effect immediately.

config SYS_CONSOLE_IS_IN_ENV
	bool "Select console devices from the environment"
	default y if CONSOLE_MUX
	help
	  This allows multiple input/output devices to be set at boot time.
	  For example, if stdout is set to "serial,vidconsole" then output
	  will be sent to both the serial and video devices on boot. The
	  environment variables can be updated after boot to change the
	  input/output devices.

config SYS_CONSOLE_OVERWRITE_ROUTINE
	bool "Allow board control over console overwriting"
	help
	  If this is enabled, and the board-specific function
	  overwrite_console() returns 1, the stdin, stderr and stdout are
	  switched to the serial port, else the settings in the environment
	  are used. If this is not enabled, the console will not be switched
	  to serial.

config SYS_CONSOLE_ENV_OVERWRITE
	bool "Update environment variables during console init"
	depends on SYS_CONSOLE_IS_IN_ENV
	help
	  The console environment variables (stdout, stdin, stderr) can be
	  used to determine the correct console devices on start-up. This
	  option writes the console devices to these variables on console
	  start-up (after relocation). This causes the environment to be
	  updated to match the console devices actually chosen.

config SYS_CONSOLE_INFO_QUIET
	bool "Don't display the console devices on boot"
	help
	  Normally U-Boot displays the current settings for stdout, stdin
	  and stderr on boot when the post-relocation console is set up.
	  Enable this option to suppress this output. It can be obtained by
	  calling stdio_print_current_devices() from board code.

config SYS_STDIO_DEREGISTER
	bool "Allow deregistering stdio devices"
	default y if USB_KEYBOARD
	help
	  Generally there is no need to deregister stdio devices since they
	  are never deactivated. But if a stdio device is used which can be
	  removed (for example a USB keyboard) then this option can be
	  enabled to ensure this is handled correctly.

config SPL_SYS_STDIO_DEREGISTER
	bool "Allow deregistering stdio devices in SPL"
	help
	  Generally there is no need to deregister stdio devices since they
	  are never deactivated. But if a stdio device is used which can be
	  removed (for example a USB keyboard) then this option can be
	  enabled to ensure this is handled correctly. This is very rarely
	  needed in SPL.

config SYS_DEVICE_NULLDEV
	bool "Enable a null device for stdio"
	default y if SPLASH_SCREEN || SYS_STDIO_DEREGISTER
	help
	  Enable creation of a "nulldev" stdio device. This allows silent
	  operation of the console by setting stdout to "nulldev". Enable
	  this to use a serial console under board control.

endmenu

menu "Logging"

config LOG
	bool "Enable logging support"
	depends on DM
	help
	  This enables support for logging of status and debug messages. These
	  can be displayed on the console, recorded in a memory buffer, or
	  discarded if not needed. Logging supports various categories and
	  levels of severity.

if LOG

config LOG_MAX_LEVEL
	int "Maximum log level to record"
	default 6
	range 0 9
	help
	  This selects the maximum log level that will be recorded. Any value
	  higher than this will be ignored. If possible log statements below
	  this level will be discarded at build time. Levels:

	    0 - emergency
	    1 - alert
	    2 - critical
	    3 - error
	    4 - warning
	    5 - note
	    6 - info
	    7 - debug
	    8 - debug content
	    9 - debug hardware I/O

config LOG_DEFAULT_LEVEL
	int "Default logging level to display"
	default LOG_MAX_LEVEL
	range 0 LOG_MAX_LEVEL
	help
	  This is the default logging level set when U-Boot starts. It can
	  be adjusted later using the 'log level' command. Note that setting
	  this to a value above LOG_MAX_LEVEL will be ineffective, since the
	  higher levels are not compiled in to U-Boot.

	    0 - emergency
	    1 - alert
	    2 - critical
	    3 - error
	    4 - warning
	    5 - note
	    6 - info
	    7 - debug
	    8 - debug content
	    9 - debug hardware I/O

config LOG_CONSOLE
	bool "Allow log output to the console"
	default y
	help
	  Enables a log driver which writes log records to the console.
	  Generally the console is the serial port or LCD display. Only the
	  log message is shown - other details like level, category, file and
	  line number are omitted.

config LOGF_FILE
	bool "Show source file name in log messages by default"
	help
	  Show the source file name in log messages by default. This value
	  can be overridden using the 'log format' command.

config LOGF_LINE
	bool "Show source line number in log messages by default"
	help
	  Show the source line number in log messages by default. This value
	  can be overridden using the 'log format' command.

config LOGF_FUNC
	bool "Show function name in log messages by default"
	help
	  Show the function name in log messages by default. This value can
	  be overridden using the 'log format' command.

config LOGF_FUNC_PAD
	int "Number of characters to use for function"
	default 20
	help
	  Sets the field width to use when showing the function. Set this to
	  a larger value if you have lots of long function names, and want
	  things to line up.

config LOG_SYSLOG
	bool "Log output to syslog server"
	depends on NET || NET_LWIP
	help
	  Enables a log driver which broadcasts log records via UDP port 514
	  to syslog servers.

config SPL_LOG
	bool "Enable logging support in SPL"
	depends on LOG && SPL
	help
	  This enables support for logging of status and debug messages. These
	  can be displayed on the console, recorded in a memory buffer, or
	  discarded if not needed. Logging supports various categories and
	  levels of severity.

if SPL_LOG

config SPL_LOG_MAX_LEVEL
	int "Maximum log level to record in SPL"
	depends on SPL_LOG
	default 3
	range 0 9
	help
	  This selects the maximum log level that will be recorded. Any value
	  higher than this will be ignored. If possible log statements below
	  this level will be discarded at build time. Levels:

	    0 - emergency
	    1 - alert
	    2 - critical
	    3 - error
	    4 - warning
	    5 - note
	    6 - info
	    7 - debug
	    8 - debug content
	    9 - debug hardware I/O

config SPL_LOG_CONSOLE
	bool "Allow log output to the console in SPL"
	default y
	help
	  Enables a log driver which writes log records to the console.
	  Generally the console is the serial port or LCD display. Only the
	  log message is shown - other details like level, category, file and
	  line number are omitted.

endif

config TPL_LOG
	bool "Enable logging support in TPL"
	depends on LOG && TPL
	help
	  This enables support for logging of status and debug messages. These
	  can be displayed on the console, recorded in a memory buffer, or
	  discarded if not needed. Logging supports various categories and
	  levels of severity.

if TPL_LOG

config TPL_LOG_MAX_LEVEL
	int "Maximum log level to record in TPL"
	depends on TPL_LOG
	default 3
	range 0 9
	help
	  This selects the maximum log level that will be recorded. Any value
	  higher than this will be ignored. If possible log statements below
	  this level will be discarded at build time. Levels:

	    0 - emergency
	    1 - alert
	    2 - critical
	    3 - error
	    4 - warning
	    5 - note
	    6 - info
	    7 - debug
	    8 - debug content
	    9 - debug hardware I/O

config TPL_LOG_CONSOLE
	bool "Allow log output to the console in TPL"
	default y
	help
	  Enables a log driver which writes log records to the console.
	  Generally the console is the serial port or LCD display. Only the
	  log message is shown - other details like level, category, file and
	  line number are omitted.

endif

config VPL_LOG
	bool "Enable logging support in VPL"
	depends on LOG && VPL
	help
	  This enables support for logging of status and debug messages. These
	  can be displayed on the console, recorded in a memory buffer, or
	  discarded if not needed. Logging supports various categories and
	  levels of severity.

if VPL_LOG

config VPL_LOG_MAX_LEVEL
	int "Maximum log level to record in VPL"
	default 3
	help
	  This selects the maximum log level that will be recorded. Any value
	  higher than this will be ignored. If possible log statements below
	  this level will be discarded at build time. Levels:

	    0 - emergency
	    1 - alert
	    2 - critical
	    3 - error
	    4 - warning
	    5 - note
	    6 - info
	    7 - debug
	    8 - debug content
	    9 - debug hardware I/O

config VPL_LOG_CONSOLE
	bool "Allow log output to the console in VPL"
	default y
	help
	  Enables a log driver which writes log records to the console.
	  Generally the console is the serial port or LCD display. Only the
	  log message is shown - other details like level, category, file and
	  line number are omitted.

endif

config LOG_ERROR_RETURN
	bool "Log all functions which return an error"
	help
	  When an error is returned in U-Boot it is sometimes difficult to
	  figure out the root cause. For example, reading from SPI flash may
	  fail due to a problem in the SPI controller or due to the flash part
	  not returning the expected information. This option changes
	  log_ret() to log any errors it sees. With this option disabled,
	  log_ret() is a nop.

	  You can add log_ret() to all functions which return an error code.

config LOG_TEST
	bool "Provide a test for logging"
	depends on UNIT_TEST
	default y if SANDBOX
	help
	  This enables a 'log test' command to test logging. It is normally
	  executed from a pytest and simply outputs logging information
	  in various different ways to test that the logging system works
	  correctly with various settings.

endif

endmenu

menu "Init options"

config BOARD_TYPES
	bool "Enable board_type entry in global data struct"
	help
	  If this option is enabled, a field will be added to the global
	  data struct to store an unsigned long value for the type of
	  platform that we have determined we are on, at run-time.

config DISPLAY_CPUINFO
	bool "Display information about the CPU during start up"
	default y if ARC || ARM || NIOS2 || X86 || XTENSA || M68K
	help
	  Display information about the CPU that U-Boot is running on
	  when U-Boot starts up. The function print_cpuinfo() is called
	  to do this.

config DISPLAY_BOARDINFO
	bool "Display information about the board during early start up"
	default y if ARC || ARM || M68K || MIPS || PPC || SANDBOX || XTENSA
	help
	  Display information about the board that U-Boot is running on
	  when U-Boot starts up. The board function checkboard() is called
	  to do this.

config DISPLAY_BOARDINFO_LATE
	bool "Display information about the board during late start up"
	help
	  Display information about the board that U-Boot is running on after
	  the relocation phase. The board function checkboard() is called to do
	  this.

menu "Start-up hooks"

config CYCLIC
	bool "General-purpose cyclic execution mechanism"
	help
	  This enables a general-purpose cyclic execution infrastructure,
	  to allow "small" (run-time wise) functions to be executed at
	  a specified frequency. Things like LED blinking or watchdog
	  triggering are examples for such tasks.

if CYCLIC

config SPL_CYCLIC
	bool "General-purpose cyclic execution mechanism (SPL)"
	help
	  This enables a general-purpose cyclic execution infrastructure in SPL,
	  to allow "small" (run-time wise) functions to be executed at
	  a specified frequency. Things like LED blinking or watchdog
	  triggering are examples for such tasks.

config CYCLIC_MAX_CPU_TIME_US
	int "Sets the max allowed time for a cyclic function in us"
	default 100000 if SANDBOX  # sandbox video is quite slow
	default 5000
	help
	  The max allowed time for a cyclic function in us. If a functions
	  takes longer than this duration this function will get unregistered
	  automatically.

endif # CYCLIC

config EVENT
	bool
	help
	  This adds a framework for general purpose sending and processing of
	  events, to allow interested parties to be alerted when something
	  happens. This is an attempt to stem the flow of weak functions,
	  hooks, functions in board_f.c and board_r.c and the Kconfig options
	  below.

	  See doc/develop/event.rst for more information.

if EVENT

config EVENT_DYNAMIC
	bool
	help
	  Enable this to support adding an event spy at runtime, without adding
	  it to the EVENT_SPY*() linker list. This increases code size slightly
	  but provides more flexibility for boards and subsystems that need it.

config EVENT_DEBUG
	bool "Enable event debugging assistance"
	default y if SANDBOX
	help
	  Enable this to get useful features for seeing what is happening with
	  events, such as event-type names. This adds to the code size of
	  U-Boot so can be turned off for production builds.

config SPL_EVENT
	bool  # General-purpose event-handling mechanism in SPL
	depends on SPL
	help
	  This adds a framework for general purpose sending and processing of
	  events, to allow interested parties to be alerted when something
	  happens. This is an attempt to stem the flow of weak functions,
	  hooks, functions in board_f.c and board_r.c and the Kconfig options
	  below.

	  See doc/develop/event.rst for more information.

config SPL_EVENT_DYNAMIC
	bool
	depends on SPL_EVENT && EVENT_DYNAMIC
	help
	  Enable this to support adding an event spy at runtime, without adding
	  it to the EVENT_SPY*() linker list. This increases code size slightly
	  but provides more flexibility for boards and subsystems that need it.

endif # EVENT

config ARCH_EARLY_INIT_R
	bool
	help
	  With this option U-Boot will call arch_early_init_r() soon after
	  relocation. Driver model is running by this point, and the cache
	  is on. Note that board_early_init_r() is called first, if
	  enabled. This can be used to set up architecture-specific devices.

config ARCH_MISC_INIT
	bool "Call arch-specific init after relocation, when console is ready"
	help
	  With this option U-Boot will call arch_misc_init() after
	  relocation to allow miscellaneous arch-dependent initialisation
	  to be performed. This function should be defined by the board
	  and will be called after the console is set up, after relocation.

config BOARD_EARLY_INIT_F
	bool "Call board-specific init before relocation"
	help
	  Some boards need to perform initialisation as soon as possible
	  after boot. With this option, U-Boot calls board_early_init_f()
	  after driver model is ready in the pre-relocation init sequence.
	  Note that the normal serial console is not yet set up, but the
	  debug UART will be available if enabled.

config BOARD_EARLY_INIT_R
	bool "Call board-specific init after relocation"
	help
	  Some boards need to perform initialisation as directly after
	  relocation. With this option, U-Boot calls board_early_init_r()
	  in the post-relocation init sequence.

config BOARD_POSTCLK_INIT
	bool "Call board_postclk_init"
	help
	  Some boards need this to initialize select items, after clocks /
	  timebase and before env / serial.

config BOARD_LATE_INIT
	bool "Execute Board late init"
	help
	  Sometimes board require some initialization code that might
	  require once the actual init done, example saving board specific env,
	  boot-modes etc. which eventually done at late.

	  So this config enable the late init code with the help of board_late_init
	  function which should defined on respective boards.

config CLOCKS
	bool "Call set_cpu_clk_info"
	depends on ARM

config HWCONFIG
	bool "hwconfig infrastructure"
	default y if PPC || ARCH_LS1021A || FSL_LSCH2 || FSL_LSCH3

config SYS_FSL_CLK
	bool
	depends on ARCH_LS1021A || FSL_LSCH2 || FSL_LSCH3 || \
		(FSL_ESDHC_IMX && (ARCH_MX5 || ARCH_MX6 || ARCH_MX7))
	default y
	help
	  Enable to call get_clocks() in board_init_f() for platforms other
	  than PowerPC or M68k.  This is a legacy option.  If not TARGET_BRPPT2

config LAST_STAGE_INIT
	bool "Call board-specific as last setup step"
	select EVENT
	help
	  Some boards need to perform initialisation immediately before control
	  is passed to the command-line interpreter (e.g. for initializations
	  that depend on later phases in the init sequence). With this option,
	  U-Boot calls last_stage_init() before the command-line interpreter is
	  started.

config MISC_INIT_R
	bool "Execute Misc Init"
	default y if ARCH_KEYSTONE || ARCH_SUNXI || MPC85xx
	default y if ARCH_OMAP2PLUS && !AM33XX
	help
	  Enabling this option calls 'misc_init_r' function

config SYS_MALLOC_BOOTPARAMS
	bool "Malloc a buffer to use for bootparams"
	help
	  In some cases rather than using a known location to store the
	  bi_boot_params portion of gd we need to allocate it from our malloc pool.

config SYS_BOOTPARAMS_LEN
	hex "Size of the bootparam buffer to malloc in bytes"
	depends on SYS_MALLOC_BOOTPARAMS
	default 0x20000 if MIPS || RCAR_64
	default 0x10000

config ID_EEPROM
	bool "Enable I2C connected system identifier EEPROM"
	help
	  A number of different systems and vendors enable a vendor-specified
	  EEPROM that contains various identifying features.

config SYS_EEPROM_BUS_NUM
	int "I2C bus number of the system identifier EEPROM"
	depends on ID_EEPROM
	default 0

choice
	prompt "EEPROM starts with 'CCID' or 'NXID'"
	depends on ID_EEPROM && (PPC || ARCH_LS1021A || FSL_LAYERSCAPE)
	default SYS_I2C_EEPROM_NXID
	help
	  Specify if the Freescale / NXP ID EEPROM starts with 'CCID' or 'NXID'
	  ASCII literal string.

config SYS_I2C_EEPROM_CCID
	bool "EEPROM starts with 'CCID'"

config SYS_I2C_EEPROM_NXID
	bool "EEPROM starts with 'NXID'"

endchoice

config PCI_INIT_R
	bool "Enumerate PCI buses during init"
	depends on PCI
	help
	  With this option U-Boot will call pci_init() soon after relocation,
	  which will enumerate PCI buses. This is needed, for instance, in the
	  case of DM PCI-based Ethernet devices, which will not be detected
	  without having the enumeration performed earlier.

config RESET_PHY_R
	bool "Reset ethernet PHY during init"
	help
	  Implement reset_phy() in board code if required to reset the ethernet
	  PHY.

endmenu

endmenu		# Init options

menu "Security support"

config HASH
	bool # "Support hashing API (SHA1, SHA256, etc.)"
	help
	  This provides a way to hash data in memory using various supported
	  algorithms (such as SHA1, MD5, CRC32). The API is defined in hash.h
	  and the algorithms it supports are defined in common/hash.c. See
	  also CMD_HASH for command-line access.

config AVB_VERIFY
	bool "Build Android Verified Boot operations"
	depends on LIBAVB
	depends on MMC
	depends on PARTITION_UUIDS
	depends on FASTBOOT
	help
	  This option enables compilation of bootloader-dependent operations,
	  used by Android Verified Boot 2.0 library (libavb). Includes:
	    * Helpers to process strings in order to build OS bootargs.
	    * Helpers to access MMC, similar to drivers/fastboot/fb_mmc.c.
	    * Helpers to alloc/init/free avb ops.

if AVB_VERIFY

config AVB_BUF_ADDR
	hex "Define AVB buffer address"
	default FASTBOOT_BUF_ADDR
	help
	  AVB requires a buffer for memory transactions. This variable defines the
	  buffer address.

config AVB_BUF_SIZE
	hex "Define AVB buffer SIZE"
	default FASTBOOT_BUF_SIZE
	help
	  AVB requires a buffer for memory transactions. This variable defines the
	  buffer size.

endif # AVB_VERIFY

config SCP03
	bool "Build SCP03 - Secure Channel Protocol O3 - controls"
	depends on OPTEE || SANDBOX
	depends on TEE
	help
	  This option allows U-Boot to enable and or provision SCP03 on an OPTEE
	  controlled Secured Element.

config SPL_HASH
	bool # "Support hashing API (SHA1, SHA256, etc.)"
	help
	  This provides a way to hash data in memory using various supported
	  algorithms (such as SHA1, MD5, CRC32). The API is defined in hash.h
	  and the algorithms it supports are defined in common/hash.c. See
	  also CMD_HASH for command-line access.

config TPL_HASH
	bool # "Support hashing API (SHA1, SHA256, etc.)"
	help
	  This provides a way to hash data in memory using various supported
	  algorithms (such as SHA1, MD5, CRC32). The API is defined in hash.h
	  and the algorithms it supports are defined in common/hash.c. See
	  also CMD_HASH for command-line access.

config STACKPROTECTOR
	bool "Stack Protector buffer overflow detection"
	help
	  Enable stack smash detection through compiler's stack-protector
	  canary logic

config SPL_STACKPROTECTOR
	bool "Stack Protector buffer overflow detection for SPL"
	depends on STACKPROTECTOR && SPL

config TPL_STACKPROTECTOR
	bool "Stack Protector buffer overflow detection for TPL"
	depends on STACKPROTECTOR && TPL

config BOARD_RNG_SEED
	bool "Provide /chosen/rng-seed property to the linux kernel"
	help
	  Selecting this option requires the board to define a
	  board_rng_seed() function, which should return a buffer
	  which will be used to populate the /chosen/rng-seed property
	  in the device tree for the OS being booted.

	  It is up to the board code (and more generally the whole
	  BSP) where and how to store (or generate) such a seed, how
	  to ensure a given seed is only used once, how to create a
	  new seed for use on subsequent boots, and whether or not the
	  kernel should account any entropy from the given seed.

endmenu

menu "Update support"

config UPDATE_COMMON
	bool
	select DFU_WRITE_ALT
	imply CMD_TFTPBOOT

config UPDATE_TFTP
	bool "Auto-update using fitImage via TFTP"
	depends on FIT && OF_LIBFDT && !MTD_NOR_FLASH
	select UPDATE_COMMON
	help
	  This option allows performing update of NOR with data in fitImage
	  sent via TFTP boot.

config UPDATE_TFTP_CNT_MAX
	int "The number of connection retries during auto-update"
	default 0
	depends on UPDATE_TFTP || DFU_TFTP

config UPDATE_TFTP_MSEC_MAX
	int "Delay in mSec to wait for the TFTP server during auto-update"
	default 100
	depends on UPDATE_TFTP || DFU_TFTP

config UPDATE_LOAD_ADDR
	hex "Address in memory to load the update to"
	depends on UPDATE_TFTP || DFU_TFTP
	default 0x100000
	help
	  This option defines the location in memory to be used to load the
	  update to, if 'loadaddr' is not set in the environment.

config UPDATE_FIT
	bool "Firmware update using fitImage"
	depends on FIT && OF_LIBFDT
	depends on DFU
	select UPDATE_COMMON
	help
	  This option allows performing update of DFU-capable storage with
	  data in fitImage.

config ANDROID_AB
	bool "Android A/B updates"
	help
	  If enabled, adds support for the new Android A/B update model. This
	  allows the bootloader to select which slot to boot from based on the
	  information provided by userspace via the Android boot_ctrl HAL. This
	  allows a bootloader to try a new version of the system but roll back
	  to previous version if the new one didn't boot all the way.

config ANDROID_AB_BACKUP_OFFSET
	hex "Offset of backup bootloader control"
	depends on ANDROID_AB
	default 0x0
	help
	  If non-zero, a backup bootloader message starting at this offset in
	  the partition will tried in the event that the primary one (starting
	  at offset 0) fails its checksum. The offset is in bytes and must be
	  multiple of the block size.

endmenu

menu "Blob list"

config BLOBLIST
	bool "Support for a bloblist"
	select CRC32
	help
	  This enables support for a bloblist in U-Boot, which can be passed
	  from TPL to SPL to U-Boot proper (and potentially to Linux). The
	  blob list supports multiple binary blobs of data, each with a tag,
	  so that different U-Boot components can store data which can survive
	  through to the next phase of the boot.

config SPL_BLOBLIST
	bool "Support for a bloblist in SPL"
	depends on BLOBLIST && SPL_LIBGENERIC_SUPPORT && SPL_LIBCOMMON_SUPPORT
	select SPL_CRC32
	default y if SPL
	help
	  This enables a bloblist in SPL. If this is the first part of U-Boot
	  to run, then the bloblist is set up in SPL and passed to U-Boot
	  proper. If TPL also has a bloblist, then SPL uses the one from there.

config TPL_BLOBLIST
	bool "Support for a bloblist in TPL"
	depends on BLOBLIST && TPL_LIBGENERIC_SUPPORT && TPL_LIBCOMMON_SUPPORT
	select TPL_CRC32
	default y if TPL
	help
	  This enables a bloblist in TPL. The bloblist is set up in TPL and
	  passed to SPL and U-Boot proper.

config VPL_BLOBLIST
	bool "Support for a bloblist in VPL"
	depends on BLOBLIST && VPL_LIBGENERIC_SUPPORT && VPL_LIBCOMMON_SUPPORT
	default y if VPL
	help
	  This enables a bloblist in VPL. The bloblist is set up in VPL and
	  passed to SPL and U-Boot proper.

if BLOBLIST

choice
	prompt "Bloblist location"
	help
	  Select the location of the bloblist, via various means.

config BLOBLIST_FIXED
	bool "Place bloblist at a fixed address in memory"
	help
	  Select this to used a fixed memory address for the bloblist. If the
	  bloblist exists at this address from a previous phase, it used as is.
	  If not it is created at this address in U-Boot.

config BLOBLIST_ALLOC
	bool "Allocate bloblist"
	help
	  Allocate the bloblist using malloc(). This avoids the need to
	  specify a fixed address on systems where this is unknown or can
	  change at runtime.

endchoice

config BLOBLIST_ADDR
	hex "Address of bloblist"
	default 0xb000 if SANDBOX
	depends on BLOBLIST_FIXED
	help
	  Sets the address of the bloblist, set up by the first part of U-Boot
	  which runs. Subsequent U-Boot phases typically use the same address.

	  This is not used if BLOBLIST_ALLOC is selected.

config BLOBLIST_SIZE
	hex "Size of bloblist"
	default 0x400
	help
	  Sets the size of the bloblist in bytes. This must include all
	  overhead (alignment, bloblist header, record header). The bloblist
	  is set up in the first part of U-Boot to run (TPL, SPL or U-Boot
	  proper), and this sane bloblist is used for subsequent phases.

config BLOBLIST_SIZE_RELOC
	hex "Size of bloblist after relocation"
	default BLOBLIST_SIZE if BLOBLIST_FIXED || BLOBLIST_ALLOC
	default 0x0 if BLOBLIST_PASSAGE
	help
	  Sets the size of the bloblist in bytes after relocation. Since U-Boot
	  has a lot more memory available then, it is possible to use a larger
	  size than the one set up by SPL. This bloblist is set up during the
	  relocation process.

endif # BLOBLIST

if SPL_BLOBLIST

choice
	prompt "Bloblist location in SPL"
	help
	  Select the location of the bloblist, via various means. Typically
	  you should use the same value for SPL as for U-Boot, since they need
	  to look in the same place. But if BLOBLIST_ALLOC is used, then a
	  fresh bloblist will be created each time, since there is no shared
	  address (between phases) for the bloblist.

config SPL_BLOBLIST_FIXED
	bool "Place bloblist at a fixed address in memory"
	help
	  Select this to used a fixed memory address for the bloblist. If the
	  bloblist exists at this address from a previous phase, it used as is.
	  If not it is created at this address in SPL.

config SPL_BLOBLIST_ALLOC
	bool "Allocate bloblist"
	help
	  Allocate the bloblist using malloc(). This avoids the need to
	  specify a fixed address on systems where this is unknown or can
	  change at runtime.

endchoice

endif # SPL_BLOBLIST

if TPL_BLOBLIST

choice
	prompt "Bloblist location in TPL"
	help
	  Select the location of the bloblist, via various means. Typically
	  you should use the same value for TPL as for U-Boot, since they need
	  to look in the same place. But if BLOBLIST_ALLOC is used, then a
	  fresh bloblist will be created each time, since there is no shared
	  address (between phases) for the bloblist.

config TPL_BLOBLIST_FIXED
	bool "Place bloblist at a fixed address in memory"
	help
	  Select this to used a fixed memory address for the bloblist. If the
	  bloblist exists at this address from a previous phase, it used as is.
	  If not it is created at this address in TPL.

config TPL_BLOBLIST_ALLOC
	bool "Allocate bloblist"
	help
	  Allocate the bloblist using malloc(). This avoids the need to
	  specify a fixed address on systems where this is unknown or can
	  change at runtime.

endchoice

endif # TPL_BLOBLIST

if VPL_BLOBLIST

choice
	prompt "Bloblist location in VPL"
	help
	  Select the location of the bloblist, via various means. Typically
	  you should use the same value for VPL as for U-Boot, since they need
	  to look in the same place. But if BLOBLIST_ALLOC is used, then a
	  fresh bloblist will be created each time, since there is no shared
	  address (between phases) for the bloblist.

config VPL_BLOBLIST_FIXED
	bool "Place bloblist at a fixed address in memory"
	help
	  Select this to used a fixed memory address for the bloblist. If the
	  bloblist exists at this address from a previous phase, it used as is.
	  If not it is created at this address in VPL.

config VPL_BLOBLIST_ALLOC
	bool "Allocate bloblist"
	help
	  Allocate the bloblist using malloc(). This avoids the need to
	  specify a fixed address on systems where this is unknown or can
	  change at runtime.

endchoice

endif # VPL_BLOBLIST

endmenu

source "common/spl/Kconfig"

config IMAGE_SIGN_INFO
	bool
	select SHA1
	select SHA256
	help
	  Enable image_sign_info helper functions.

if IMAGE_SIGN_INFO

config SPL_IMAGE_SIGN_INFO
	bool
	select SHA1
	select SHA256
	help
	  Enable image_sign_info helper functions in SPL.

config VPL_IMAGE_SIGN_INFO
	bool
	select SHA1
	select SHA256
	help
	  Enable image_sign_info helper functions in SPL.

endif

config IO_TRACE
	bool
