[PATCH 00/28] Initial implementation of bootmethod/bootflow

Mark Kettenis mark.kettenis at xs4all.nl
Mon Aug 23 13:54:29 CEST 2021


> From: Simon Glass <sjg at chromium.org>
> Date: Wed, 18 Aug 2021 21:45:33 -0600
> 
> Bootmethod and bootflow provide a built-in way for U-Boot to automatically boot
> an Operating System without custom scripting and other customisation:
> 
>   - bootmethod - a method to scan a device to find bootflows (owned by U-Boot)
>   - bootflow - a description of how to boot (owned by the distro)
> 
> This series provides an initial implementation of these, enable to scan
> for bootflows from MMC and Ethernet. The only bootflow supported is
> distro boot, i.e. an extlinux.conf file included on a filesystem or
> tftp server. It works similiarly to the existing script-based approach,
> but is native to U-Boot.
> 
> With this we can boot on a Raspberry Pi 3 with just one command:
> 
>    bootflow scan -lb
> 
> which means to scan, listing (-l) each bootflow and trying to boot each
> one (-b). The final patch shows this.
> 
> It is intended that this approach be expanded to support mechanisms other
> than distro boot, including EFI-related ones. With a standard way to
> identify boot devices, these features become easier. It also should
> support U-Boot scripts, for backwards compatibility only.
> 
> The first patch of this series moves boot-related code out of common/ and
> into a new boot/ directory. This helps to collect these related files
> in one place, as common/ is quite large.
> 
> Like sysboot, this feature makes use of the existing PXE implementation.
> Much of this series consists of cleaning up that code and refactoring it
> into something closer to a module that can be called, teasing apart its
> reliance on the command-line interpreter to access filesystems and the
> like. Also it now uses function arguments and its own context struct
> internally rather than environment variables, which is very hard to
> follow. No core functional change is included in the included PXE patches.
> 
> For documentation, see the 'doc' patch.
> 
> There is quite a long list of future work included in the documentation.
> One question is the choice of naming. Since this is a bootloader, should
> we just call this a 'method' and a 'flow' ? The 'boot' prefix is already
> shared by other commands like bootm, booti, etc.
> 
> The design is described here:
> 
> https://drive.google.com/file/d/1ggW0KJpUOR__vBkj3l61L2dav4ZkNC12/view?usp=sharing
> 
> The series is available at u-boot-dm/bmea-working

How does the user control the order in which devices are scanned/booted?

And how do we define the default order?

> Simon Glass (28):
>   Create a new boot/ directory
>   pxe: Move API comments to the header files
>   pxe: Use a context pointer
>   pxe: Move do_getfile() into the context
>   pxe: Add a userdata field to the context
>   pxe: Tidy up the is_pxe global
>   pxe: Move pxe_utils files
>   pxe: Tidy up some comments in pxe_utils
>   pxe: Tidy up code style a little in pxe_utils
>   pxe: Move common parsing coding into pxe_util
>   pxe: Clean up the use of bootfile
>   pxe: Drop get_bootfile_path()
>   lib: Add tests for simple_itoa()
>   lib: Add a function to convert a string to a hex value
>   pxe: Return the file size from the getfile() function
>   pxe: Refactor sysboot to have one helper
>   doc: Move distro boot doc to rST
>   pxe: Allow calling the pxe_get logic directly
>   bootmethod: Add the uclass and core implementation
>   bootmethod: Add an implementation of distro boot
>   bootmethod: Add a command
>   bootflow: Add a command
>   bootmethod: Add tests for bootmethod and bootflow
>   bootmethod: doc: Add documentation
>   mmc: Allow for children other than the block device
>   mmc: Add a bootmethod
>   ethernet: Add a bootmethod
>   RFC: rpi: Switch over to use bootflow
> 
>  Kconfig                                   |   2 +
>  MAINTAINERS                               |  16 +
>  Makefile                                  |   3 +-
>  README                                    |   1 +
>  common/Kconfig.boot => boot/Kconfig       |  22 +-
>  boot/Makefile                             |  39 ++
>  {common => boot}/android_ab.c             |   0
>  {common => boot}/boot_fit.c               |   0
>  {common => boot}/bootm.c                  |   0
>  {common => boot}/bootm_os.c               |   0
>  boot/bootmethod.c                         | 485 ++++++++++++++++++++
>  {common => boot}/bootretry.c              |   0
>  {common => boot}/common_fit.c             |   0
>  boot/distro.c                             | 194 ++++++++
>  {common => boot}/fdt_region.c             |   0
>  {common => boot}/image-android-dt.c       |   0
>  {common => boot}/image-android.c          |   0
>  {common => boot}/image-cipher.c           |   0
>  {common => boot}/image-fdt.c              |   0
>  {common => boot}/image-fit-sig.c          |   0
>  {common => boot}/image-fit.c              |   0
>  {common => boot}/image-sig.c              |   0
>  {common => boot}/image.c                  |   0
>  {cmd => boot}/pxe_utils.c                 | 512 +++++++++++-----------
>  cmd/Kconfig                               |   8 +
>  cmd/Makefile                              |   5 +-
>  cmd/bootflow.c                            | 399 +++++++++++++++++
>  cmd/bootmethod.c                          | 130 ++++++
>  cmd/pxe.c                                 | 136 +++---
>  cmd/pxe_utils.h                           |  91 ----
>  cmd/sysboot.c                             | 114 +++--
>  common/Kconfig                            |   2 -
>  common/Makefile                           |  22 -
>  configs/sandbox_defconfig                 |   3 +-
>  doc/android/boot-image.rst                |   2 +-
>  doc/develop/bootflow.rst                  | 323 ++++++++++++++
>  doc/{README.distro => develop/distro.rst} | 180 ++++----
>  doc/develop/index.rst                     |   2 +
>  doc/device-tree-bindings/bootmethod.txt   |  14 +
>  doc/usage/bootflow.rst                    | 419 ++++++++++++++++++
>  doc/usage/bootmethod.rst                  | 138 ++++++
>  doc/usage/index.rst                       |   2 +
>  drivers/mmc/Makefile                      |   5 +
>  drivers/mmc/mmc-uclass.c                  |  23 +-
>  drivers/mmc/mmc_bootmethod.c              |  46 ++
>  include/bootmethod.h                      | 357 +++++++++++++++
>  include/configs/rpi.h                     |  37 +-
>  include/distro.h                          |  62 +++
>  include/dm/uclass-id.h                    |   1 +
>  include/mmc.h                             |  12 +-
>  include/pxe_utils.h                       | 253 +++++++++++
>  include/test/suites.h                     |   2 +
>  include/vsprintf.h                        |  25 +-
>  lib/vsprintf.c                            |  20 +-
>  net/Kconfig                               |   9 +
>  net/Makefile                              |   1 +
>  net/eth-uclass.c                          |   8 +
>  net/eth_bootmethod.c                      |  76 ++++
>  scripts/Makefile.spl                      |   4 +-
>  test/Makefile                             |   1 +
>  test/boot/Makefile                        |   5 +
>  test/boot/bootmethod.c                    | 271 ++++++++++++
>  test/cmd_ut.c                             |   4 +
>  test/print_ut.c                           |  33 ++
>  tools/Makefile                            |  16 +-
>  try.sh                                    | 131 ++++++
>  66 files changed, 4035 insertions(+), 631 deletions(-)
>  rename common/Kconfig.boot => boot/Kconfig (98%)
>  create mode 100644 boot/Makefile
>  rename {common => boot}/android_ab.c (100%)
>  rename {common => boot}/boot_fit.c (100%)
>  rename {common => boot}/bootm.c (100%)
>  rename {common => boot}/bootm_os.c (100%)
>  create mode 100644 boot/bootmethod.c
>  rename {common => boot}/bootretry.c (100%)
>  rename {common => boot}/common_fit.c (100%)
>  create mode 100644 boot/distro.c
>  rename {common => boot}/fdt_region.c (100%)
>  rename {common => boot}/image-android-dt.c (100%)
>  rename {common => boot}/image-android.c (100%)
>  rename {common => boot}/image-cipher.c (100%)
>  rename {common => boot}/image-fdt.c (100%)
>  rename {common => boot}/image-fit-sig.c (100%)
>  rename {common => boot}/image-fit.c (100%)
>  rename {common => boot}/image-sig.c (100%)
>  rename {common => boot}/image.c (100%)
>  rename {cmd => boot}/pxe_utils.c (74%)
>  create mode 100644 cmd/bootflow.c
>  create mode 100644 cmd/bootmethod.c
>  delete mode 100644 cmd/pxe_utils.h
>  create mode 100644 doc/develop/bootflow.rst
>  rename doc/{README.distro => develop/distro.rst} (76%)
>  create mode 100644 doc/device-tree-bindings/bootmethod.txt
>  create mode 100644 doc/usage/bootflow.rst
>  create mode 100644 doc/usage/bootmethod.rst
>  create mode 100644 drivers/mmc/mmc_bootmethod.c
>  create mode 100644 include/bootmethod.h
>  create mode 100644 include/distro.h
>  create mode 100644 include/pxe_utils.h
>  create mode 100644 net/eth_bootmethod.c
>  create mode 100644 test/boot/Makefile
>  create mode 100644 test/boot/bootmethod.c
>  create mode 100755 try.sh
> 
> -- 
> 2.33.0.rc1.237.g0d66db33f3-goog
> 
> 


More information about the U-Boot mailing list