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