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-aurel...@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


Reply via email to