mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-31 03:58:17 +00:00 
			
		
		
		
	Before adding more files, move the bootstd docs into a new directory, with an index. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Quentin Schulz <quentin.schulz@cherry.de> Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
		
			
				
	
	
		
			749 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			749 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| .. SPDX-License-Identifier: GPL-2.0+:
 | |
| 
 | |
| .. index::
 | |
|    single: bootflow (command)
 | |
| 
 | |
| bootflow command
 | |
| ================
 | |
| 
 | |
| Synopsis
 | |
| --------
 | |
| 
 | |
| ::
 | |
| 
 | |
|     bootflow scan [-abelGH] [bootdev]
 | |
|     bootflow list [-e]
 | |
|     bootflow select [<num|name>]
 | |
|     bootflow info [-ds]
 | |
|     bootflow read
 | |
|     bootflow boot
 | |
|     bootflow cmdline [set|get|clear|delete|auto] <param> [<value>]
 | |
|     bootfloe menu [-t]
 | |
| 
 | |
| Description
 | |
| -----------
 | |
| 
 | |
| The `bootflow` command is used to manage bootflows. It can scan bootdevs to
 | |
| locate bootflows, list them and boot them.
 | |
| 
 | |
| See :doc:`/develop/bootstd/index` for more information.
 | |
| 
 | |
| Note that `CONFIG_BOOTSTD_FULL` (which enables `CONFIG_CMD_BOOTFLOW_FULL) must
 | |
| be enabled to obtain full functionality with this command. Otherwise, it only
 | |
| supports `bootflow scan` which scans and boots the first available bootflow.
 | |
| 
 | |
| bootflow scan
 | |
| ~~~~~~~~~~~~~
 | |
| 
 | |
| Scans for available bootflows, optionally booting the first valid one it finds.
 | |
| This operates in two modes:
 | |
| 
 | |
| - If no bootdev is selected (see `bootdev select`) it scans bootflows one
 | |
|   by one, extracting all the bootdevs from each
 | |
| - If a bootdev is selected, it just scans that one bootflow
 | |
| 
 | |
| Flags are:
 | |
| 
 | |
| -a
 | |
|     Collect all bootflows, even those that cannot be loaded. Normally if a file
 | |
|     is not where it is expected, then the bootflow fails and so is dropped
 | |
|     during the scan. With this option you can see why each bootflow would be
 | |
|     dropped.
 | |
| 
 | |
| -b
 | |
|     Boot each valid bootflow as it is scanned. Typically only the first bootflow
 | |
|     matters, since by then the system boots in the OS and U-Boot is no-longer
 | |
|     running. `bootflow scan -b` is a quick way to boot the first available OS.
 | |
|     A valid bootflow is one that made it all the way to the `loaded` state.
 | |
|     Note that if `-m` is provided as well, booting is delayed until the user
 | |
|     selects a bootflow.
 | |
| 
 | |
| -e
 | |
|     Used with -l to also show errors for each bootflow. The shows detailed error
 | |
|     information for each bootflow that failed to make it to the `loaded` state.
 | |
| 
 | |
| -l
 | |
|     List bootflows while scanning. This is helpful when you want to see what
 | |
|     is happening during scanning. Use it with the `-b` flag to see which
 | |
|     bootdev and bootflows are being tried.
 | |
| 
 | |
| -G
 | |
|     Skip global bootmeths when scanning. By default these are tried first, but
 | |
|     this flag disables them.
 | |
| 
 | |
| -H
 | |
|     Don't use bootdev hunters. By default these are used before each boot
 | |
|     priority or label is tried, to see if more bootdevs can be discovered, but
 | |
|     this flag disables that process.
 | |
| 
 | |
| -m
 | |
|     Show a menu of available bootflows for the user to select. When used with
 | |
|     -b it then boots the one that was selected, if any.
 | |
| 
 | |
| The optional argument specifies a particular bootdev to scan. This can either be
 | |
| the name of a bootdev or its sequence number (both shown with `bootdev list`).
 | |
| Alternatively a convenience label can be used, like `mmc0`, which is the type of
 | |
| device and an optional sequence number. Specifically, the label is the uclass of
 | |
| the bootdev's parent followed by the sequence number of that parent. Sequence
 | |
| numbers are typically set by aliases, so if you have 'mmc0' in your devicetree
 | |
| alias section, then `mmc0` refers to the bootdev attached to that device.
 | |
| 
 | |
| 
 | |
| bootflow list
 | |
| ~~~~~~~~~~~~~
 | |
| 
 | |
| Lists the previously scanned bootflows. You must use `bootflow scan` before this
 | |
| to see anything.
 | |
| 
 | |
| If you scanned with -a and have bootflows with errors, -e can be used to show
 | |
| those errors.
 | |
| 
 | |
| The list looks something like this:
 | |
| 
 | |
| ===  ======  ======  ========  ====  ===============================   ================
 | |
| Seq  Method  State   Uclass    Part  Name                              Filename
 | |
| ===  ======  ======  ========  ====  ===============================   ================
 | |
|   0  distro  ready   mmc          2  mmc\@7e202000.bootdev.part_2      /boot/extlinux/extlinux.conf
 | |
|   1  pxe     ready   ethernet     0  smsc95xx_eth.bootdev.0            rpi.pxe/extlinux/extlinux.conf
 | |
| ===  ======  ======  ========  ====  ===============================   ================
 | |
| 
 | |
| The fields are as follows:
 | |
| 
 | |
| Seq:
 | |
|     Sequence number in the scan, used to reference the bootflow later
 | |
| 
 | |
| Method:
 | |
|     The boot method (bootmeth) used to find the bootflow. Several methods are
 | |
|     included in U-Boot.
 | |
| 
 | |
| State:
 | |
|     Current state of the bootflow, indicating how far the bootdev got in
 | |
|     obtaining a valid one. See :ref:`BootflowStates` for a list of states.
 | |
| 
 | |
| Uclass:
 | |
|     Name of the media device's Uclass. This indicates the type of the parent
 | |
|     device (e.g. MMC, Ethernet).
 | |
| 
 | |
| Part:
 | |
|     Partition number being accesseed, numbered from 1. Normally a device will
 | |
|     have a partition table with a small number of partitions. For devices
 | |
|     without partition tables (e.g. network) this field is 0.
 | |
| 
 | |
| Name:
 | |
|     Name of the bootflow. This is generated from the bootdev appended with
 | |
|     the partition information
 | |
| 
 | |
| Filename:
 | |
|     Name of the bootflow file. This indicates where the file is on the
 | |
|     filesystem or network device.
 | |
| 
 | |
| 
 | |
| bootflow select
 | |
| ~~~~~~~~~~~~~~~
 | |
| 
 | |
| Use this to select a particular bootflow. You can select it by the sequence
 | |
| number or name, as shown in `bootflow list`.
 | |
| 
 | |
| Once a bootflow is selected, you can use `bootflow info` and `bootflow boot`.
 | |
| 
 | |
| If no bootflow name or number is provided, then any existing bootflow is
 | |
| unselected.
 | |
| 
 | |
| 
 | |
| bootflow info
 | |
| ~~~~~~~~~~~~~
 | |
| 
 | |
| This shows information on the current bootflow, with the format looking like
 | |
| this:
 | |
| 
 | |
| =========  ===============================
 | |
| Name       mmc\@7e202000.bootdev.part_2
 | |
| Device     mmc\@7e202000.bootdev
 | |
| Block dev  mmc\@7e202000.blk
 | |
| Type       distro
 | |
| Method:    extlinux
 | |
| State      ready
 | |
| Partition  2
 | |
| Subdir     (none)
 | |
| Filename   /extlinux/extlinux.conf
 | |
| Buffer     3db7ad48
 | |
| Size       232 (562 bytes)
 | |
| FDT:       <NULL>
 | |
| Error      0
 | |
| =========  ===============================
 | |
| 
 | |
| Most of the information is the same as `bootflow list` above. The new fields
 | |
| are:
 | |
| 
 | |
| Device
 | |
|     Name of the bootdev
 | |
| 
 | |
| Block dev
 | |
|     Name of the block device, if any. Network devices don't have a block device.
 | |
| 
 | |
| Subdir
 | |
|     Subdirectory used for retrieving files. For network bootdevs this is the
 | |
|     directory of the 'bootfile' parameter passed from DHCP. All file retrievals
 | |
|     when booting are relative to this.
 | |
| 
 | |
| Buffer
 | |
|     Buffer containing the bootflow file. You can use the :doc:`md` to look at
 | |
|     it, or dump it with `bootflow info -d`.
 | |
| 
 | |
| Size
 | |
|     Size of the bootflow file
 | |
| 
 | |
| FDT:
 | |
|     Filename of the device tree, if supported. The EFI bootmeth uses this to
 | |
|     remember the filename to load. If `<NULL>` then there is none.
 | |
| 
 | |
| Error
 | |
|     Error number returned from scanning for the bootflow. This is 0 if the
 | |
|     bootflow is in the 'loaded' state, or a negative error value on error. You
 | |
|     can look up Linux error codes to find the meaning of the number.
 | |
| 
 | |
| Use the `-d` flag to dump out the contents of the bootfile file.
 | |
| 
 | |
| The `-s` flag shows any x86 setup block, instead of the above.
 | |
| 
 | |
| 
 | |
| bootflow read
 | |
| ~~~~~~~~~~~~~
 | |
| 
 | |
| This reads any files related to the bootflow. Some bootflows with large files
 | |
| avoid doing this when the bootflow is scanned, since it uses a lot of memory
 | |
| and takes extra time. The files are then automatically read when `bootflow boot`
 | |
| is used.
 | |
| 
 | |
| This command reads these files immediately. Typically this fills in the bootflow
 | |
| `buf` property, which can be used to examine the bootflow.
 | |
| 
 | |
| Note that reading the files does not result in any extra parsing, nor loading of
 | |
| images in the files. This is purely used to read in the data ready for
 | |
| booting, or examination.
 | |
| 
 | |
| 
 | |
| bootflow boot
 | |
| ~~~~~~~~~~~~~
 | |
| 
 | |
| This boots the current bootflow, reading any required files first.
 | |
| 
 | |
| 
 | |
| bootflow cmdline
 | |
| ~~~~~~~~~~~~~~~~
 | |
| 
 | |
| Some bootmeths can obtain the OS command line since it is stored with the OS.
 | |
| In that case, you can use `bootflow cmdline` to adjust this. The command line
 | |
| is assumed to be in the format used by Linux, i.e. a space-separated set of
 | |
| parameters with optional values, e.g. "noinitrd console=/dev/tty0".
 | |
| 
 | |
| To change or add a parameter, use::
 | |
| 
 | |
|     bootflow cmdline set <param> <value>
 | |
| 
 | |
| To clear a parameter value to empty you can use "" for the value, or use::
 | |
| 
 | |
|     bootflow cmdline clear <param>
 | |
| 
 | |
| To delete a parameter entirely, use::
 | |
| 
 | |
|     bootflow cmdline delete <param>
 | |
| 
 | |
| Automatic parameters are available in a very few cases. You can use these to
 | |
| add parmeters where the value is known by U-Boot. For example::
 | |
| 
 | |
|     bootflow cmdline auto earlycon
 | |
|     bootflow cmdline auto console
 | |
| 
 | |
| can be used to set the early console (or console) to a suitable value so that
 | |
| output appears on the serial port. This is only supported by the 16550 serial
 | |
| driver so far.
 | |
| 
 | |
| bootflow menu
 | |
| ~~~~~~~~~~~~~
 | |
| 
 | |
| This shows a menu with available bootflows. The user can select a particular
 | |
| bootflow, which then becomes the current one.
 | |
| 
 | |
| The `-t` flag requests a text menu. Otherwise, if a display is available, a
 | |
| graphical menu is shown.
 | |
| 
 | |
| 
 | |
| Example
 | |
| -------
 | |
| 
 | |
| Here is an example of scanning for bootflows, then listing them::
 | |
| 
 | |
|     U-Boot> bootflow scan -l
 | |
|     Scanning for bootflows in all bootdevs
 | |
|     Seq  Type         State   Uclass    Part  Name                      Filename
 | |
|     ---  -----------  ------  --------  ----  ------------------------  ----------------
 | |
|     Scanning bootdev 'mmc@7e202000.bootdev':
 | |
|       0  distro       ready   mmc          2  mmc@7e202000.bootdev.p    /extlinux/extlinux.conf
 | |
|     Scanning bootdev 'sdhci@7e300000.bootdev':
 | |
|     Card did not respond to voltage select! : -110
 | |
|     Scanning bootdev 'smsc95xx_eth.bootdev':
 | |
|     Waiting for Ethernet connection... done.
 | |
|     BOOTP broadcast 1
 | |
|     DHCP client bound to address 192.168.4.30 (4 ms)
 | |
|     Using smsc95xx_eth device
 | |
|     TFTP from server 192.168.4.1; our IP address is 192.168.4.30
 | |
|     Filename 'rpi.pxe/'.
 | |
|     Load address: 0x200000
 | |
|     Loading: *
 | |
|     TFTP error: 'Is a directory' (0)
 | |
|     Starting again
 | |
| 
 | |
|     missing environment variable: pxeuuid
 | |
|     Retrieving file: rpi.pxe/pxelinux.cfg/01-b8-27-eb-a6-61-e1
 | |
|     Waiting for Ethernet connection... done.
 | |
|     Using smsc95xx_eth device
 | |
|     TFTP from server 192.168.4.1; our IP address is 192.168.4.30
 | |
|     Filename 'rpi.pxe/pxelinux.cfg/01-b8-27-eb-a6-61-e1'.
 | |
|     Load address: 0x2500000
 | |
|     Loading: ##################################################  566 Bytes
 | |
|     	 45.9 KiB/s
 | |
|     done
 | |
|     Bytes transferred = 566 (236 hex)
 | |
|       1  distro       ready   ethernet     0  smsc95xx_eth.bootdev.0 rpi.pxe/extlinux/extlinux.conf
 | |
|     No more bootdevs
 | |
|     ---  -----------  ------  --------  ----  ------------------------  ----------------
 | |
|     (2 bootflows, 2 valid)
 | |
|     U-Boot> bootflow l
 | |
|     Showing all bootflows
 | |
|     Seq  Type         State   Uclass    Part  Name                      Filename
 | |
|     ---  -----------  ------  --------  ----  ------------------------  ----------------
 | |
|       0  distro       ready   mmc          2  mmc@7e202000.bootdev.p    /extlinux/extlinux.conf
 | |
|       1  pxe          ready   ethernet     0  smsc95xx_eth.bootdev.0     rpi.pxe/extlinux/extlinux.conf
 | |
|     ---  -----------  ------  --------  ----  ------------------------  ----------------
 | |
|     (2 bootflows, 2 valid)
 | |
| 
 | |
| 
 | |
| The second one is then selected by name (we could instead use `bootflow sel 0`),
 | |
| displayed and booted::
 | |
| 
 | |
|     U-Boot> bootflow info
 | |
|     No bootflow selected
 | |
|     U-Boot> bootflow sel mmc@7e202000.bootdev.part_2
 | |
|     U-Boot> bootflow info
 | |
|     Name:      mmc@7e202000.bootdev.part_2
 | |
|     Device:    mmc@7e202000.bootdev
 | |
|     Block dev: mmc@7e202000.blk
 | |
|     Method:    distro
 | |
|     State:     ready
 | |
|     Partition: 2
 | |
|     Subdir:    (none)
 | |
|     Filename:  extlinux/extlinux.conf
 | |
|     Buffer:    3db7ae88
 | |
|     Size:      232 (562 bytes)
 | |
|     OS:        Fedora-Workstation-armhfp-31-1.9 (5.3.7-301.fc31.armv7hl)
 | |
|     Cmdline:   (none)
 | |
|     Logo:      (none)
 | |
|     FDT:       <NULL>
 | |
|     Error:     0
 | |
|     U-Boot> bootflow boot
 | |
|     ** Booting bootflow 'smsc95xx_eth.bootdev.0'
 | |
|     Ignoring unknown command: ui
 | |
|     Ignoring malformed menu command:  autoboot
 | |
|     Ignoring malformed menu command:  hidden
 | |
|     Ignoring unknown command: totaltimeout
 | |
|     1:	Fedora-Workstation-armhfp-31-1.9 (5.3.7-301.fc31.armv7hl)
 | |
|     Retrieving file: rpi.pxe/initramfs-5.3.7-301.fc31.armv7hl.img
 | |
|     get 2700000 rpi.pxe/initramfs-5.3.7-301.fc31.armv7hl.img
 | |
|     Waiting for Ethernet connection... done.
 | |
|     Using smsc95xx_eth device
 | |
|     TFTP from server 192.168.4.1; our IP address is 192.168.4.30
 | |
|     Filename 'rpi.pxe/initramfs-5.3.7-301.fc31.armv7hl.img'.
 | |
|     Load address: 0x2700000
 | |
|     Loading: ###################################T ###############  57.7 MiB
 | |
|     	 1.9 MiB/s
 | |
|     done
 | |
|     Bytes transferred = 60498594 (39b22a2 hex)
 | |
|     Retrieving file: rpi.pxe//vmlinuz-5.3.7-301.fc31.armv7hl
 | |
|     get 80000 rpi.pxe//vmlinuz-5.3.7-301.fc31.armv7hl
 | |
|     Waiting for Ethernet connection... done.
 | |
|     Using smsc95xx_eth device
 | |
|     TFTP from server 192.168.4.1; our IP address is 192.168.4.30
 | |
|     Filename 'rpi.pxe//vmlinuz-5.3.7-301.fc31.armv7hl'.
 | |
|     Load address: 0x80000
 | |
|     Loading: ##################################################  7.2 MiB
 | |
|     	 2.3 MiB/s
 | |
|     done
 | |
|     Bytes transferred = 7508480 (729200 hex)
 | |
|     append: ro root=UUID=9732b35b-4cd5-458b-9b91-80f7047e0b8a rhgb quiet LANG=en_US.UTF-8 cma=192MB cma=256MB
 | |
|     Retrieving file: rpi.pxe//dtb-5.3.7-301.fc31.armv7hl/bcm2837-rpi-3-b.dtb
 | |
|     get 2600000 rpi.pxe//dtb-5.3.7-301.fc31.armv7hl/bcm2837-rpi-3-b.dtb
 | |
|     Waiting for Ethernet connection... done.
 | |
|     Using smsc95xx_eth device
 | |
|     TFTP from server 192.168.4.1; our IP address is 192.168.4.30
 | |
|     Filename 'rpi.pxe//dtb-5.3.7-301.fc31.armv7hl/bcm2837-rpi-3-b.dtb'.
 | |
|     Load address: 0x2600000
 | |
|     Loading: ##################################################  13.8 KiB
 | |
|     	 764.6 KiB/s
 | |
|     done
 | |
|     Bytes transferred = 14102 (3716 hex)
 | |
|     Kernel image @ 0x080000 [ 0x000000 - 0x729200 ]
 | |
|     ## Flattened Device Tree blob at 02600000
 | |
|        Booting using the fdt blob at 0x2600000
 | |
|        Using Device Tree in place at 02600000, end 02606715
 | |
| 
 | |
|     Starting kernel ...
 | |
| 
 | |
|     [  OK  ] Started Show Plymouth Boot Screen.
 | |
|     [  OK  ] Started Forward Password R…s to Plymouth Directory Watch.
 | |
|     [  OK  ] Reached target Local Encrypted Volumes.
 | |
|     [  OK  ] Reached target Paths.
 | |
|     ....
 | |
| 
 | |
| 
 | |
| Here we scan for bootflows and boot the first one found::
 | |
| 
 | |
|     U-Boot> bootflow scan -bl
 | |
|     Scanning for bootflows in all bootdevs
 | |
|     Seq  Method       State   Uclass    Part  Name                    Filename
 | |
|     ---  -----------  ------  --------  ----  ----------------------  ----------------
 | |
|     Scanning bootdev 'mmc@7e202000.bootdev':
 | |
|       0  distro       ready   mmc          2  mmc@7e202000.bootdev.p  /extlinux/extlinux.conf
 | |
|     ** Booting bootflow 'mmc@7e202000.bootdev.part_2'
 | |
|     Ignoring unknown command: ui
 | |
|     Ignoring malformed menu command:  autoboot
 | |
|     Ignoring malformed menu command:  hidden
 | |
|     Ignoring unknown command: totaltimeout
 | |
|     1:	Fedora-KDE-armhfp-31-1.9 (5.3.7-301.fc31.armv7hl)
 | |
|     Retrieving file: /initramfs-5.3.7-301.fc31.armv7hl.img
 | |
|     getfile 2700000 /initramfs-5.3.7-301.fc31.armv7hl.img
 | |
|     Retrieving file: /vmlinuz-5.3.7-301.fc31.armv7hl
 | |
|     getfile 80000 /vmlinuz-5.3.7-301.fc31.armv7hl
 | |
|     append: ro root=UUID=b8781f09-e2dd-4cb8-979b-7df5eeaaabea rhgb LANG=en_US.UTF-8 cma=192MB console=tty0 console=ttyS1,115200
 | |
|     Retrieving file: /dtb-5.3.7-301.fc31.armv7hl/bcm2837-rpi-3-b.dtb
 | |
|     getfile 2600000 /dtb-5.3.7-301.fc31.armv7hl/bcm2837-rpi-3-b.dtb
 | |
|     Kernel image @ 0x080000 [ 0x000000 - 0x729200 ]
 | |
|     ## Flattened Device Tree blob at 02600000
 | |
|        Booting using the fdt blob at 0x2600000
 | |
|        Using Device Tree in place at 02600000, end 02606715
 | |
| 
 | |
|     Starting kernel ...
 | |
| 
 | |
|     [    0.000000] Booting Linux on physical CPU 0x0
 | |
| 
 | |
| 
 | |
| Here is am example using the -e flag to see all errors::
 | |
| 
 | |
|     U-Boot> bootflow scan -a
 | |
|     Card did not respond to voltage select! : -110
 | |
|     Waiting for Ethernet connection... done.
 | |
|     BOOTP broadcast 1
 | |
|     DHCP client bound to address 192.168.4.30 (4 ms)
 | |
|     Using smsc95xx_eth device
 | |
|     TFTP from server 192.168.4.1; our IP address is 192.168.4.30
 | |
|     Filename 'rpi.pxe/'.
 | |
|     Load address: 0x200000
 | |
|     Loading: *
 | |
|     TFTP error: 'Is a directory' (0)
 | |
|     Starting again
 | |
| 
 | |
|     missing environment variable: pxeuuid
 | |
|     Retrieving file: rpi.pxe/pxelinux.cfg/01-b8-27-eb-a6-61-e1
 | |
|     Waiting for Ethernet connection... done.
 | |
|     Using smsc95xx_eth device
 | |
|     TFTP from server 192.168.4.1; our IP address is 192.168.4.30
 | |
|     Filename 'rpi.pxe/pxelinux.cfg/01-b8-27-eb-a6-61-e1'.
 | |
|     Load address: 0x2500000
 | |
|     Loading: ##################################################  566 Bytes
 | |
|     	 49.8 KiB/s
 | |
|     done
 | |
|     Bytes transferred = 566 (236 hex)
 | |
|     U-Boot> bootflow l -e
 | |
|     Showing all bootflows
 | |
|     Seq  Type         State   Uclass    Part  Name                   Filename
 | |
|     ---  -----------  ------  --------  ----  ---------------------  ----------------
 | |
|       0  distro       fs      mmc          1  mmc@7e202000.bootdev.p /extlinux/extlinux.conf
 | |
|          ** File not found, err=-2
 | |
|       1  distro       ready   mmc          2  mmc@7e202000.bootdev.p /extlinux/extlinux.conf
 | |
|       2  distro       fs      mmc          3  mmc@7e202000.bootdev.p /extlinux/extlinux.conf
 | |
|          ** File not found, err=-1
 | |
|       3  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|       4  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|       5  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|       6  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|       7  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|       8  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|       9  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|       a  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|       b  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|       c  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|       d  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|       e  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|       f  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|      10  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|      11  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|      12  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|      13  distro       media   mmc          0  mmc@7e202000.bootdev.p <NULL>
 | |
|          ** No partition found, err=-2
 | |
|      14  distro       ready   ethernet     0  smsc95xx_eth.bootdev.0 rpi.pxe/extlinux/extlinux.conf
 | |
|     ---  -----------  ------  --------  ----  ---------------------  ----------------
 | |
|     (21 bootflows, 2 valid)
 | |
|     U-Boot>
 | |
| 
 | |
| Here is an example of booting ChromeOS, adjusting the console beforehand. Note that
 | |
| the cmdline is word-wrapped here and some parts of the command line are elided::
 | |
| 
 | |
|     => bootfl list
 | |
|     Showing all bootflows
 | |
|     Seq  Method       State   Uclass    Part  Name                      Filename
 | |
|     ---  -----------  ------  --------  ----  ------------------------  ----------------
 | |
|     0  cros         ready   nvme         0  5.10.153-20434-g98da1eb2c <NULL>
 | |
|     1  efi          ready   nvme         c  nvme#0.blk#1.bootdev.part efi/boot/bootia32.efi
 | |
|     2  efi          ready   usb_mass_    2  usb_mass_storage.lun0.boo efi/boot/bootia32.efi
 | |
|     ---  -----------  ------  --------  ----  ------------------------  ----------------
 | |
|     (3 bootflows, 3 valid)
 | |
|     => bootfl sel 0
 | |
|     => bootfl inf
 | |
|     Name:      5.10.153-20434-g98da1eb2cf9d (chrome-bot@chromeos-release-builder-us-central1-b-x32-12-xijx) #1 SMP PREEMPT Tue Jan 24 19:38:23 PST 2023
 | |
|     Device:    nvme#0.blk#1.bootdev
 | |
|     Block dev: nvme#0.blk#1
 | |
|     Method:    cros
 | |
|     State:     ready
 | |
|     Partition: 0
 | |
|     Subdir:    (none)
 | |
|     Filename:  <NULL>
 | |
|     Buffer:    737a1400
 | |
|     Size:      c47000 (12873728 bytes)
 | |
|     OS:        ChromeOS
 | |
|     Cmdline:   console= loglevel=7 init=/sbin/init cros_secure drm.trace=0x106
 | |
|         root=/dev/dm-0 rootwait ro dm_verity.error_behavior=3
 | |
|         dm_verity.max_bios=-1 dm_verity.dev_wait=1
 | |
|         dm="1 vroot none ro 1,0 6348800
 | |
|           verity payload=PARTUUID=799c935b-ae62-d143-8493-816fa936eef7/PARTNROFF=1
 | |
|           hashtree=PARTUUID=799c935b-ae62-d143-8493-816fa936eef7/PARTNROFF=1
 | |
|           hashstart=6348800 alg=sha256
 | |
|           root_hexdigest=78cc462cd45aecbcd49ca476587b4dee59aa1b00ba5ece58e2c29ec9acd914ab
 | |
|           salt=8dec4dc80a75dd834a9b3175c674405e15b16a253fdfe05c79394ae5fd76f66a"
 | |
|         noinitrd vt.global_cursor_default=0
 | |
|         kern_guid=799c935b-ae62-d143-8493-816fa936eef7 add_efi_memmap
 | |
|         noresume i915.modeset=1 ramoops.ecc=1 tpm_tis.force=0
 | |
|         intel_pmc_core.warn_on_s0ix_failures=1 i915.enable_guc=3 i915.enable_dc=4
 | |
|         xdomain=0 swiotlb=65536 intel_iommu=on i915.enable_psr=1
 | |
|         usb-storage.quirks=13fe:6500:u
 | |
|     X86 setup: 742e3400
 | |
|     Logo:      (none)
 | |
|     FDT:       <NULL>
 | |
|     Error:     0
 | |
|     => bootflow cmdline auto earlycon
 | |
|     => bootflow cmd auto console
 | |
|     => print bootargs
 | |
|     bootargs=console=ttyS0,115200n8 loglevel=7 ...
 | |
|         usb-storage.quirks=13fe:6500:u earlycon=uart8250,mmio32,0xfe03e000,115200n8
 | |
|     => bootflow cmd del console
 | |
|     => print bootargs
 | |
|     bootargs=loglevel=7 ... earlycon=uart8250,mmio32,0xfe03e000,115200n8
 | |
|     => bootfl boot
 | |
|     ** Booting bootflow '5.10.153-20434-g98da1eb2cf9d (chrome-bot@chromeos-release-builder-us-central1-b-x32-12-xijx) #1 SMP PREEMPT Tue Jan 24 19:38:23 PST 2023' with cros
 | |
|     Kernel command line: "loglevel=7 ... earlycon=uart8250,mmio32,0xfe03e000,115200n8"
 | |
| 
 | |
|     Starting kernel ...
 | |
| 
 | |
|     [    0.000000] Linux version 5.10.153-20434-g98da1eb2cf9d (chrome-bot@chromeos-release-builder-us-central1-b-x32-12-xijx) (Chromium OS 15.0_pre465103_p20220825-r4 clang version 15.0.0 (/var/tmp/portage/sys-devel/llvm-15.0_pre465103_p20220825-r4/work/llvm-15.0_pre465103_p20220825/clang db1978b67431ca3462ad8935bf662c15750b8252), LLD 15.0.0) #1 SMP PREEMPT Tue Jan 24 19:38:23 PST 2023
 | |
|     [    0.000000] Command line: loglevel=7 ... usb-storage.quirks=13fe:6500:u earlycon=uart8250,mmio32,0xfe03e000,115200n8
 | |
|     [    0.000000] x86/split lock detection: warning about user-space split_locks
 | |
| 
 | |
| This shows looking at x86 setup information::
 | |
| 
 | |
|     => bootfl sel 0
 | |
|     => bootfl i -s
 | |
|     Setup located at 77b56010:
 | |
| 
 | |
|     ACPI RSDP addr      : 0
 | |
|     E820: 2 entries
 | |
|             Addr        Size  Type
 | |
|                0        1000  RAM
 | |
|         fffff000        1000  Reserved
 | |
|     Setup sectors       : 1e
 | |
|     Root flags          : 1
 | |
|     Sys size            : 63420
 | |
|     RAM size            : 0
 | |
|     Video mode          : ffff
 | |
|     Root dev            : 0
 | |
|     Boot flag           : 0
 | |
|     Jump                : 66eb
 | |
|     Header              : 53726448
 | |
|                           Kernel V2
 | |
|     Version             : 20d
 | |
|     Real mode switch    : 0
 | |
|     Start sys seg       : 1000
 | |
|     Kernel version      : 38cc
 | |
|        @00003acc:
 | |
|     Type of loader      : ff
 | |
|                           unknown
 | |
|     Load flags          : 1
 | |
|                         : loaded-high
 | |
|     Setup move size     : 8000
 | |
|     Code32 start        : 100000
 | |
|     Ramdisk image       : 0
 | |
|     Ramdisk size        : 0
 | |
|     Bootsect kludge     : 0
 | |
|     Heap end ptr        : 5160
 | |
|     Ext loader ver      : 0
 | |
|     Ext loader type     : 0
 | |
|     Command line ptr    : 735000
 | |
|     Initrd addr max     : 7fffffff
 | |
|     Kernel alignment    : 200000
 | |
|     Relocatable kernel  : 1
 | |
|     Min alignment       : 15
 | |
|                         : 200000
 | |
|     Xload flags         : 3
 | |
|                         : 64-bit-entry can-load-above-4gb
 | |
|     Cmdline size        : 7ff
 | |
|     Hardware subarch    : 0
 | |
|     HW subarch data     : 0
 | |
|     Payload offset      : 26e
 | |
|     Payload length      : 612045
 | |
|     Setup data          : 0
 | |
|     Pref address        : 1000000
 | |
|     Init size           : 1383000
 | |
|     Handover offset     : 0
 | |
| 
 | |
| This shows reading a bootflow to examine the kernel::
 | |
| 
 | |
|     => bootfl i 0
 | |
|     Name:
 | |
|     Device:    emmc@1c,0.bootdev
 | |
|     Block dev: emmc@1c,0.blk
 | |
|     Method:    cros
 | |
|     State:     ready
 | |
|     Partition: 2
 | |
|     Subdir:    (none)
 | |
|     Filename:  <NULL>
 | |
|     Buffer:    0
 | |
|     Size:      63ee00 (6548992 bytes)
 | |
|     OS:        ChromeOS
 | |
|     Cmdline:   console= loglevel=7 init=/sbin/init cros_secure oops=panic panic=-1 root=PARTUUID=35c775e7-3735-d745-93e5-d9e0238f7ed0/PARTNROFF=1 rootwait rw dm_verity.error_behavior=3 dm_verity.max_bios=-1 dm_verity.dev_wait=0 dm="1 vroot none rw 1,0 3788800 verity payload=ROOT_DEV hashtree=HASH_DEV hashstart=3788800 alg=sha1 root_hexdigest=55052b629d3ac889f25a9583ea12cdcd3ea15ff8 salt=a2d4d9e574069f4fed5e3961b99054b7a4905414b60a25d89974a7334021165c" noinitrd vt.global_cursor_default=0 kern_guid=35c775e7-3735-d745-93e5-d9e0238f7ed0 add_efi_memmap boot=local noresume noswap i915.modeset=1 tpm_tis.force=1 tpm_tis.interrupts=0 nmi_watchdog=panic,lapic disablevmx=off
 | |
|     X86 setup: 77b56010
 | |
|     Logo:      (none)
 | |
|     FDT:       <NULL>
 | |
|     Error:     0
 | |
| 
 | |
| Note that `Buffer` is 0 so it has not be read yet. Using `bootflow read`::
 | |
| 
 | |
|     => bootfl read
 | |
|     => bootfl info
 | |
|     Name:
 | |
|     Device:    emmc@1c,0.bootdev
 | |
|     Block dev: emmc@1c,0.blk
 | |
|     Method:    cros
 | |
|     State:     ready
 | |
|     Partition: 2
 | |
|     Subdir:    (none)
 | |
|     Filename:  <NULL>
 | |
|     Buffer:    77b7e400
 | |
|     Size:      63ee00 (6548992 bytes)
 | |
|     OS:        ChromeOS
 | |
|     Cmdline:   console= loglevel=7 init=/sbin/init cros_secure oops=panic panic=-1 root=PARTUUID=35c775e7-3735-d745-93e5-d9e0238f7ed0/PARTNROFF=1 rootwait rw dm_verity.error_behavior=3 dm_verity.max_bios=-1 dm_verity.dev_wait=0 dm="1 vroot none rw 1,0 3788800 verity payload=ROOT_DEV hashtree=HASH_DEV hashstart=3788800 alg=sha1 root_hexdigest=55052b629d3ac889f25a9583ea12cdcd3ea15ff8 salt=a2d4d9e574069f4fed5e3961b99054b7a4905414b60a25d89974a7334021165c" noinitrd vt.global_cursor_default=0 kern_guid=35c775e7-3735-d745-93e5-d9e0238f7ed0 add_efi_memmap boot=local noresume noswap i915.modeset=1 tpm_tis.force=1 tpm_tis.interrupts=0 nmi_watchdog=panic,lapic disablevmx=off
 | |
|     X86 setup: 781b4400
 | |
|     Logo:      (none)
 | |
|     FDT:       <NULL>
 | |
|     Error:     0
 | |
| 
 | |
| Now the buffer can be accessed::
 | |
| 
 | |
|     => md 77b7e400
 | |
|     77b7e400: 1186f6fc 40000002 b8fa0c75 00000018  .......@u.......
 | |
|     77b7e410: c08ed88e a68dd08e 000001e8 000000e8  ................
 | |
|     77b7e420: ed815d00 00000021 62c280b8 89e80100  .]..!......b....
 | |
|     77b7e430: 22f7e8c4 c0850061 22ec850f eb890061  ..."a......"a...
 | |
|     77b7e440: 0230868b 01480000 21d0f7c3 00fb81c3  ..0...H....!....
 | |
|     77b7e450: 7d010000 0000bb05 c3810100 00d4f000  ...}............
 | |
|     77b7e460: 8130858d 85890061 00618132 3095010f  ..0.a...2.a....0
 | |
|     77b7e470: 0f006181 c883e020 e0220f20 e000bb8d  .a.. ... .".....
 | |
|     77b7e480: c0310062 001800b9 8dabf300 62e000bb  b.1............b
 | |
|     77b7e490: 07878d00 89000010 00bb8d07 8d0062f0  .............b..
 | |
|     77b7e4a0: 00100787 0004b900 07890000 00100005  ................
 | |
|     77b7e4b0: 08c78300 8df37549 630000bb 0183b800  ....Iu.....c....
 | |
|     77b7e4c0: 00b90000 89000008 00000507 c7830020  ............ ...
 | |
|     77b7e4d0: f3754908 e000838d 220f0062 0080b9d8  .Iu.....b.."....
 | |
|     77b7e4e0: 320fc000 08e8ba0f c031300f b8d0000f  ...2.....01.....
 | |
|     77b7e4f0: 00000020 6ad8000f 00858d10 50000002   ......j.......P
 | |
| 
 | |
| This shows using a text menu to boot an OS::
 | |
| 
 | |
|     => bootflow scan
 | |
|     => bootfl list
 | |
|     => bootfl menu -t
 | |
|     U-Boot    :    Boot Menu
 | |
| 
 | |
|     UP and DOWN to choose, ENTER to select
 | |
| 
 | |
|       >    0  mmc1        mmc1.bootdev.whole
 | |
|            1  mmc1        Fedora-Workstation-armhfp-31-1.9 (5.3.7-301.fc31.armv7hl)
 | |
|            2  mmc1        mmc1.bootdev.part_1
 | |
|            3  mmc4        mmc4.bootdev.whole
 | |
|            4  mmc4        Armbian
 | |
|            5  mmc4        mmc4.bootdev.part_1
 | |
|            6  mmc5        mmc5.bootdev.whole
 | |
|            7  mmc5        ChromeOS
 | |
|            8  mmc5        ChromeOS
 | |
|     U-Boot    :    Boot Menu
 | |
| 
 | |
|     UP and DOWN to choose, ENTER to select
 | |
| 
 | |
|            0  mmc1        mmc1.bootdev.whole
 | |
|       >    1  mmc1        Fedora-Workstation-armhfp-31-1.9 (5.3.7-301.fc31.armv7hl)
 | |
|            2  mmc1        mmc1.bootdev.part_1
 | |
|            3  mmc4        mmc4.bootdev.whole
 | |
|            4  mmc4        Armbian
 | |
|            5  mmc4        mmc4.bootdev.part_1
 | |
|            6  mmc5        mmc5.bootdev.whole
 | |
|            7  mmc5        ChromeOS
 | |
|            8  mmc5        ChromeOS
 | |
|     U-Boot    :    Boot Menu
 | |
| 
 | |
|     Selected: Fedora-Workstation-armhfp-31-1.9 (5.3.7-301.fc31.armv7hl)
 | |
|     => bootfl boot
 | |
|     ** Booting bootflow 'mmc1.bootdev.part_1' with extlinux
 | |
|     Ignoring unknown command: ui
 | |
|     Ignoring malformed menu command:  autoboot
 | |
|     Ignoring malformed menu command:  hidden
 | |
|     Ignoring unknown command: totaltimeout
 | |
|     Fedora-Workstation-armhfp-31-1.9 Boot Options.
 | |
|     1:	Fedora-Workstation-armhfp-31-1.9 (5.3.7-301.fc31.armv7hl)
 | |
|     Enter choice: 1
 | |
|     1:	Fedora-Workstation-armhfp-31-1.9 (5.3.7-301.fc31.armv7hl)
 | |
|     Retrieving file: /vmlinuz-5.3.7-301.fc31.armv7hl
 | |
|     Retrieving file: /initramfs-5.3.7-301.fc31.armv7hl.img
 | |
|     append: ro root=UUID=9732b35b-4cd5-458b-9b91-80f7047e0b8a rhgb quiet LANG=en_US.UTF-8 cma=192MB cma=256MB
 | |
|     Retrieving file: /dtb-5.3.7-301.fc31.armv7hl/sandbox.dtb
 | |
|     ...
 | |
| 
 | |
| 
 | |
| Return value
 | |
| ------------
 | |
| 
 | |
| On success `bootflow boot` normally boots into the Operating System and does not
 | |
| return to U-Boot. If something about the U-Boot processing fails, then the
 | |
| return value $? is 1. If the boot succeeds but for some reason the Operating
 | |
| System returns, then $? is 0, indicating success.
 | |
| 
 | |
| For `bootflow menu` the return value is $? is 0 (true) if an option was choses,
 | |
| else 1.
 | |
| 
 | |
| For other subcommands, the return value $? is always 0 (true).
 | |
| 
 | |
| 
 | |
| .. BootflowStates_:
 |