[PATCH v2 00/71] bootstd: Allow migration from distro_bootcmd scripts
Heinrich Schuchardt
xypron.glpk at gmx.de
Fri Jan 13 20:54:06 CET 2023
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/
Best regards
Heinrich
>
> 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