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 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 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 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 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
	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_MUX
	bool "Enable console multiplexing"
	default y if VIDEO || 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"
	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
	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 CYCLIC_MAX_CPU_TIME_US
	int "Sets the max allowed time for a cyclic function in us"
	default 1000
	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"
	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
	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

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.

endmenu

menu "Blob list"

config BLOBLIST
	bool "Support for a bloblist"
	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
	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
	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 0xc000 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 0 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 FDT_SIMPLEFB
	bool "FDT tools for simplefb support"
	depends on OF_LIBFDT
	help
	  Enable the fdt tools to manage the simple fb nodes in device tree.
	  These functions can be used by board to indicate to the OS
	  the presence of the simple frame buffer with associated reserved
	  memory

config IO_TRACE
	bool

config BMP
	bool "Enable bmp image display"
	default y if CMD_BMP
	help
	  Enable bmp functions to display bmp image and get bmp info.

config SPL_BMP
	bool "Enable bmp image display at  SPL"
	depends on SPL_VIDEO
	help
	  Enable bmp functions to display bmp image and get bmp info at SPL.
