> From: Simon Glass <s...@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 > >