[PATCH v2 00/71] bootstd: Allow migration from distro_bootcmd scripts

Mark Kettenis mark.kettenis at xs4all.nl
Fri Jan 13 21:32:45 CET 2023


> Date: Fri, 13 Jan 2023 20:54:06 +0100
> From: Heinrich Schuchardt <xypron.glpk at gmx.de>
> 
> On 1/8/23 03:49, Simon Glass wrote:
> > So far, standard boot does not replicate all the of the functionality
> > of the distro_bootcmd scripts. In particular it lacks some bootdevs and
> > some of the bootmeths are incomplete.
> >
> > Also there is currently no internal mechanism to enumerate buses in order
> > to discover bootdevs, e.g. with USB.
> >
> > This series addresses these shortcomings:
> >
> > - Adds the concept of a 'bootdev hunter' to enumerate buses, etc. in an
> >    effort to find bootdevs of a certain priority
> > - Adds bootdevs for SCSI, IDE, NVMe, virtio, SPI flash
> > - Handles PXE and DHCP properly
> > - Supports reading the device tree with EFI and reading scripts from the
> >    network
> >
> > It also tidies up label processing, so it is possible to use:
> >
> >     bootflow scan mmc2
> >
> > to scan just one MMC device (with BOOTSTD_FULL).
> >
> > As before this implementation still relies on CONFIG_CMDLINE being
> > enabled, mostly for the network stack. Further work would be required to
> > disentangle that.
> >
> > Quite a few tests are added but there are some gaps:
> >
> > - SPI flash bootdev
> > - EFI FDT loading
> >
> > Note that SATA works via SCSI (CONFIG_SCSI_AHCI) and does not use
> > driver model. Only pogo_v4 seems to be affected. Probably all thats is
> > needed is to call bootdev_setup_sibling_blk() in the Marvell SATA driver.
> >
> > Also, while it would be possible to init MMC in a bootdev hunter, there is
> > no point since U-Boot always inits MMC on startup, if present.
> >
> > With this series it should be possible to migrate boards to standard boot
> > by removing the inclusion of config_distro_bootcmd.h and instead adding
> > a suitable value for boot_targets to the environment, e.g.:
> >
> >     boot_targets=mmc1 mmc0 nvme scsi usb pxe dhcp spi
> 
> Does nvme mean all nvme drives? Would mmc mean all mmc block devices?
> 
> doc/develop/bootstd.rst should describe the syntax.
> 
> On generic boards it does not make much sense to restrict scanning to
> one instance of a block device type.
> 
> Cf.
> [PATCH] board: sifive: unmatched: enable booting on a second NVME device
> https://lore.kernel.org/all/20230107223239.2387940-1-aurelien@aurel32.net/

But it would still make sense to be able to specify the order in which
those instances are scanned.

> > Thus it is possible to boot automatically without scripts and boards can
> > use a text-based environment instead of the config.h files.
> >
> > To demonstrate this, rockpro64-rk3399 is migrated to standard boot in this
> > series. Full migration could probably be automated using a script, similar
> > in concept to moveconfig:
> >
> >     - obtain the board environment via 'make u-boot-initial-env'
> >     - get the value of "boot_targets"
> >     - drop config_distro_bootcmd.h from the config.h file
> >     - rebuild again to get the environment without distro scripts
> >     - write the environment (adding boot_targets) to board.env
> >     - remove CONFIG_EXTRA_ENV_SETTINGS from the config.h file
> >
> > This series is based on top of the boot menu series v3 [1].
> > The tree is available at u-boot-dm/dis-working
> >
> > [1] https://patchwork.ozlabs.org/project/uboot/list/?series=335364
> >
> > Changes in v2:
> > - Rebase to -next
> >
> > Simon Glass (71):
> >    dm: core: Correct ordering of uclasses IDs
> >    dm: core: Support sorting devices with dm tree
> >    dm: test: Correct assertion in dm_test_part()
> >    lib: Add a function to split a string into substrings
> >    bootstd: Remove special-case code for boot_targets
> >    bootstd: Simplify locating existing bootdevs
> >    test: Fix the help for the ut command
> >    test: Drop duplicate restore of DM state
> >    sandbox: mmc: Start off with a zeroed file
> >    vbe: Avoid a build failure when bloblist is not enabled
> >    vbe: sandbox: Drop VBE node in chosen
> >    dm: part: Update test to use mmc2
> >    dm: test: Correct ordering of DM setup
> >    ide: Drop non-DM code for BLK
> >    dm: mmc: Use bootdev_setup_sibling_blk()
> >    bootstd: Add a default method to get bootflows
> >    sandbox: Allow ethernet to be disabled at runtime
> >    sandbox: Allow ethernet bootdevs to be disabled for tests
> >    sandbox: Enable the Ethernet bootdev
> >    lib: Support printing an error string
> >    event: Correct duplicate log message in event_notify()
> >    efi: Improve logging in efi_disk
> >    bootstd: Add the concept of a bootdev hunter
> >    bootstd: Support running bootdev hunters
> >    dm: usb: Drop some dead code
> >    dm: usb: Mark the device name as alloced when binding
> >    test: Add a generic function to skip delays
> >    bootstd: Add a USB hunter
> >    bootstd: Add an MMC hunter
> >    net: Add a function to run dhcp
> >    bootstd: Add a hunter for ethernet
> >    part: Add a function to find the first bootable partition
> >    bootstd: Only scan bootable partitions
> >    scsi: Correct allocation of block-device name
> >    scsi: Remove all children of SCSI devices before rescanning
> >    bootstd: Add a SCSI bootdev
> >    bootstd: Add an IDE bootdev
> >    bootstd: Add an NVMe bootdev
> >    virtio: Avoid repeating a long expression
> >    virtio: Fix returning -ENODEV
> >    virtio: Avoid strange behaviour on removal
> >    virtio: Add a block device
> >    bootstd: Add a virtio bootdev
> >    ata: Don't try to use non-existent ports
> >    bootstd: Rename bootdev checkers
> >    bootstd: Allow reading an EFI file from the network
> >    bootstd: Include the device tree in the bootflow
> >    bootstd: Support reading the device tree with EFI
> >    bootstd: Set the distro_bootpart env var with scripts
> >    bootstd: Update docs on bootmeth_try_file() for sandbox
> >    bootstd: Move label parsing into its own function
> >    bootstd: Add a new bootmeth method to set the bootflow
> >    sandbox: Allow SPI flash bootdevs to be disabled for tests
> >    bootstd: Add a SPI flash bootdev
> >    bootstd: Support reading a script from network or SPI flash
> >    bootstd: Treat DHCP and PXE as bootdev labels
> >    bootstd: Use hunters when scanning for bootflows
> >    bootstd: Allow hunting for bootdevs of a given priority
> >    bootstd: Add a new pre-scan priority for bootdevs
> >    bootstd: Allow hunting for a bootdev by label
> >    bootstd: Allow iterating to the next label in a list
> >    bootstd: Allow iterating to the next bootdev priortiy
> >    extension: Refactor to allow non-command usage
> >    bootstd: Add a hunter for the extension feature
> >    bootstd: Switch bootdev scanning to use labels
> >    bootstd: Allow scanning a single bootdev label
> >    bootstd: Drop the old bootflow_scan_first()
> >    bootstd: Record the bootdevs used during scanning
> >    bootstd: Add a little more logging of bootflows
> >    bootstd: Update documentation for new features
> >    rockchip: Convert rockpro64-rk3399 to use standard boot
> >
> >   arch/sandbox/cpu/state.c           |  30 ++
> >   arch/sandbox/dts/sandbox.dtsi      |  13 -
> >   arch/sandbox/dts/test.dts          |   6 +
> >   arch/sandbox/include/asm/state.h   |   2 +
> >   arch/sandbox/include/asm/test.h    |  30 ++
> >   boot/bootdev-uclass.c              | 551 +++++++++++++++++++---------
> >   boot/bootflow.c                    | 173 ++++++---
> >   boot/bootmeth-uclass.c             |  11 +
> >   boot/bootmeth_distro.c             |   2 +-
> >   boot/bootmeth_efi.c                | 220 ++++++++++-
> >   boot/bootmeth_efi_mgr.c            |   2 +-
> >   boot/bootmeth_pxe.c                |   5 +-
> >   boot/bootmeth_script.c             |  98 ++++-
> >   boot/bootstd-uclass.c              |  17 +-
> >   boot/vbe_simple_fw.c               |   2 +-
> >   cmd/bootdev.c                      |  42 ++-
> >   cmd/bootflow.c                     |  97 +++--
> >   cmd/dm.c                           |  10 +-
> >   cmd/extension_board.c              |  43 ++-
> >   cmd/net.c                          |  35 ++
> >   cmd/vbe.c                          |   7 +-
> >   common/event.c                     |   2 +-
> >   configs/sandbox_defconfig          |   2 +-
> >   configs/sandbox_flattree_defconfig |  10 +-
> >   disk/part.c                        |  16 +
> >   doc/develop/bootstd.rst            | 221 +++++++----
> >   doc/develop/driver-model/nvme.rst  |   2 +-
> >   doc/usage/cmd/bootdev.rst          |  48 ++-
> >   doc/usage/cmd/bootflow.rst         |  17 +-
> >   doc/usage/cmd/dm.rst               |   5 +-
> >   drivers/ata/ahci.c                 |   6 +
> >   drivers/block/ide.c                |  86 ++---
> >   drivers/core/dump.c                |  65 +++-
> >   drivers/mmc/mmc-uclass.c           |   2 +-
> >   drivers/mmc/mmc_bootdev.c          |  33 +-
> >   drivers/mmc/sandbox_mmc.c          |   2 +-
> >   drivers/mtd/spi/Kconfig            |   8 +
> >   drivers/mtd/spi/Makefile           |   1 +
> >   drivers/mtd/spi/sf-uclass.c        |  11 +
> >   drivers/mtd/spi/sf_bootdev.c       |  82 +++++
> >   drivers/nvme/nvme-uclass.c         |  54 +++
> >   drivers/nvme/nvme.c                |   5 +
> >   drivers/scsi/Makefile              |   7 +
> >   drivers/scsi/scsi.c                |  32 +-
> >   drivers/scsi/scsi_bootdev.c        |  62 ++++
> >   drivers/usb/host/usb-uclass.c      |  45 +--
> >   drivers/usb/host/usb_bootdev.c     |  38 +-
> >   drivers/virtio/virtio-uclass.c     |  62 +++-
> >   drivers/virtio/virtio_sandbox.c    |  16 +-
> >   include/bootdev.h                  | 206 ++++++++++-
> >   include/bootflow.h                 | 134 +++++--
> >   include/bootmeth.h                 |  35 +-
> >   include/bootstd.h                  |  17 +-
> >   include/configs/rk3399_common.h    |   5 +-
> >   include/configs/rockchip-common.h  |   2 +
> >   include/dm/uclass-id.h             |   4 +-
> >   include/dm/util.h                  |   8 +-
> >   include/net.h                      |  31 ++
> >   include/part.h                     |   8 +
> >   include/test/test.h                |  72 ++++
> >   include/vsprintf.h                 |  24 ++
> >   lib/efi_loader/efi_disk.c          |  30 +-
> >   lib/strto.c                        |  41 +++
> >   lib/vsprintf.c                     |  12 +
> >   net/eth-uclass.c                   |  14 +-
> >   net/eth_bootdev.c                  |  68 ++--
> >   net/net.c                          |   4 +
> >   test/boot/bootdev.c                | 563 +++++++++++++++++++++++++++--
> >   test/boot/bootflow.c               | 138 +++++--
> >   test/boot/bootstd_common.c         |  19 +
> >   test/boot/bootstd_common.h         |  13 +
> >   test/cmd_ut.c                      |   2 +-
> >   test/dm/part.c                     |  37 +-
> >   test/dm/virtio_device.c            |   3 +
> >   test/py/tests/bootstd/mmc1.img.xz  | Bin 4448 -> 4480 bytes
> >   test/py/tests/test_dm.py           |  38 ++
> >   test/py/tests/test_ut.py           |  13 +-
> >   test/str_ut.c                      |  82 +++++
> >   test/test-main.c                   |  24 +-
> >   79 files changed, 3225 insertions(+), 758 deletions(-)
> >   create mode 100644 drivers/mtd/spi/sf_bootdev.c
> >   create mode 100644 drivers/scsi/scsi_bootdev.c
> >
> 
> 


More information about the U-Boot mailing list