[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