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

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.

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 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 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 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"
	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.
