uboot/include/config_distro_bootcmd.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * (C) Copyright 2014
   4 * NVIDIA Corporation <www.nvidia.com>
   5 *
   6 * Copyright 2014 Red Hat, Inc.
   7 */
   8
   9#ifndef _CONFIG_CMD_DISTRO_BOOTCMD_H
  10#define _CONFIG_CMD_DISTRO_BOOTCMD_H
  11
  12/*
  13 * A note on error handling: It is possible for BOOT_TARGET_DEVICES to
  14 * reference a device that is not enabled in the U-Boot configuration, e.g.
  15 * it may include MMC in the list without CONFIG_CMD_MMC being enabled. Given
  16 * that BOOT_TARGET_DEVICES is a macro that's expanded by the C pre-processor
  17 * at compile time, it's not  possible to detect and report such problems via
  18 * a simple #ifdef/#error combination. Still, the code needs to report errors.
  19 * The best way I've found to do this is to make BOOT_TARGET_DEVICES expand to
  20 * reference a non-existent symbol, and have the name of that symbol encode
  21 * the error message. Consequently, this file contains references to e.g.
  22 * BOOT_TARGET_DEVICES_references_MMC_without_CONFIG_CMD_MMC. Given the
  23 * prevalence of capitals here, this looks like a pre-processor macro and
  24 * hence seems like it should be all capitals, but it's really an error
  25 * message that includes some other pre-processor symbols in the text.
  26 */
  27
  28#define BOOTENV_SHARED_BLKDEV_BODY(devtypel) \
  29                "if " #devtypel " dev ${devnum}; then " \
  30                        "devtype=" #devtypel "; " \
  31                        "run scan_dev_for_boot_part; " \
  32                "fi\0"
  33
  34#define BOOTENV_SHARED_BLKDEV(devtypel) \
  35        #devtypel "_boot=" \
  36        BOOTENV_SHARED_BLKDEV_BODY(devtypel)
  37
  38#define BOOTENV_DEV_BLKDEV(devtypeu, devtypel, instance) \
  39        "bootcmd_" #devtypel #instance "=" \
  40                "devnum=" #instance "; " \
  41                "run " #devtypel "_boot\0"
  42
  43#define BOOTENV_DEV_NAME_BLKDEV(devtypeu, devtypel, instance) \
  44        #devtypel #instance " "
  45
  46#ifdef CONFIG_SANDBOX
  47#define BOOTENV_SHARED_HOST     BOOTENV_SHARED_BLKDEV(host)
  48#define BOOTENV_DEV_HOST        BOOTENV_DEV_BLKDEV
  49#define BOOTENV_DEV_NAME_HOST   BOOTENV_DEV_NAME_BLKDEV
  50#else
  51#define BOOTENV_SHARED_HOST
  52#define BOOTENV_DEV_HOST \
  53        BOOT_TARGET_DEVICES_references_HOST_without_CONFIG_SANDBOX
  54#define BOOTENV_DEV_NAME_HOST \
  55        BOOT_TARGET_DEVICES_references_HOST_without_CONFIG_SANDBOX
  56#endif
  57
  58#ifdef CONFIG_CMD_MMC
  59#define BOOTENV_SHARED_MMC      BOOTENV_SHARED_BLKDEV(mmc)
  60#define BOOTENV_DEV_MMC         BOOTENV_DEV_BLKDEV
  61#define BOOTENV_DEV_NAME_MMC    BOOTENV_DEV_NAME_BLKDEV
  62#else
  63#define BOOTENV_SHARED_MMC
  64#define BOOTENV_DEV_MMC \
  65        BOOT_TARGET_DEVICES_references_MMC_without_CONFIG_CMD_MMC
  66#define BOOTENV_DEV_NAME_MMC \
  67        BOOT_TARGET_DEVICES_references_MMC_without_CONFIG_CMD_MMC
  68#endif
  69
  70#ifdef CONFIG_CMD_UBIFS
  71#define BOOTENV_SHARED_UBIFS \
  72        "ubifs_boot=" \
  73                "env exists bootubipart || " \
  74                        "env set bootubipart UBI; " \
  75                "env exists bootubivol || " \
  76                        "env set bootubivol boot; " \
  77                "if ubi part ${bootubipart} && " \
  78                        "ubifsmount ubi${devnum}:${bootubivol}; " \
  79                "then " \
  80                        "devtype=ubi; " \
  81                        "run scan_dev_for_boot; " \
  82                "fi\0"
  83#define BOOTENV_DEV_UBIFS       BOOTENV_DEV_BLKDEV
  84#define BOOTENV_DEV_NAME_UBIFS  BOOTENV_DEV_NAME_BLKDEV
  85#else
  86#define BOOTENV_SHARED_UBIFS
  87#define BOOTENV_DEV_UBIFS \
  88        BOOT_TARGET_DEVICES_references_UBIFS_without_CONFIG_CMD_UBIFS
  89#define BOOTENV_DEV_NAME_UBIFS \
  90        BOOT_TARGET_DEVICES_references_UBIFS_without_CONFIG_CMD_UBIFS
  91#endif
  92
  93#ifdef CONFIG_EFI_LOADER
  94#if defined(CONFIG_ARM64)
  95#define BOOTEFI_NAME "bootaa64.efi"
  96#elif defined(CONFIG_ARM)
  97#define BOOTEFI_NAME "bootarm.efi"
  98#elif defined(CONFIG_X86_RUN_32BIT)
  99#define BOOTEFI_NAME "bootia32.efi"
 100#elif defined(CONFIG_X86_RUN_64BIT)
 101#define BOOTEFI_NAME "bootx64.efi"
 102#elif defined(CONFIG_ARCH_RV32I)
 103#define BOOTEFI_NAME "bootriscv32.efi"
 104#elif defined(CONFIG_ARCH_RV64I)
 105#define BOOTEFI_NAME "bootriscv64.efi"
 106#endif
 107#endif
 108
 109#ifdef BOOTEFI_NAME
 110#if defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
 111/*
 112 * On 32bit ARM systems there is a reasonable number of systems that follow
 113 * the $soc-$board$boardver.dtb name scheme for their device trees. Use that
 114 * scheme if we don't have an explicit fdtfile variable.
 115 */
 116#define BOOTENV_EFI_SET_FDTFILE_FALLBACK                                  \
 117        "if test -z \"${fdtfile}\" -a -n \"${soc}\"; then "               \
 118          "setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; "           \
 119        "fi; "
 120#else
 121#ifndef BOOTENV_EFI_SET_FDTFILE_FALLBACK
 122#define BOOTENV_EFI_SET_FDTFILE_FALLBACK
 123#endif
 124#endif
 125
 126#ifdef CONFIG_CMD_BOOTEFI_BOOTMGR
 127#define BOOTENV_EFI_BOOTMGR                                               \
 128        "boot_efi_bootmgr="                                               \
 129                "if fdt addr ${fdt_addr_r}; then "                        \
 130                        "bootefi bootmgr ${fdt_addr_r};"                  \
 131                "else "                                                   \
 132                        "bootefi bootmgr;"                                \
 133                "fi\0"
 134#else
 135#define BOOTENV_EFI_BOOTMGR
 136#endif
 137
 138#define BOOTENV_SHARED_EFI                                                \
 139        BOOTENV_EFI_BOOTMGR                                               \
 140        \
 141        "boot_efi_binary="                                                \
 142                "load ${devtype} ${devnum}:${distro_bootpart} "           \
 143                        "${kernel_addr_r} efi/boot/"BOOTEFI_NAME"; "      \
 144                "if fdt addr ${fdt_addr_r}; then "                        \
 145                        "bootefi ${kernel_addr_r} ${fdt_addr_r};"         \
 146                "else "                                                   \
 147                        "bootefi ${kernel_addr_r} ${fdtcontroladdr};"     \
 148                "fi\0"                                                    \
 149        \
 150        "load_efi_dtb="                                                   \
 151                "load ${devtype} ${devnum}:${distro_bootpart} "           \
 152                        "${fdt_addr_r} ${prefix}${efi_fdtfile}\0"         \
 153        \
 154        "efi_dtb_prefixes=/ /dtb/ /dtb/current/\0"                        \
 155        "scan_dev_for_efi="                                               \
 156                "setenv efi_fdtfile ${fdtfile}; "                         \
 157                BOOTENV_EFI_SET_FDTFILE_FALLBACK                          \
 158                "for prefix in ${efi_dtb_prefixes}; do "                  \
 159                        "if test -e ${devtype} "                          \
 160                                        "${devnum}:${distro_bootpart} "   \
 161                                        "${prefix}${efi_fdtfile}; then "  \
 162                                "run load_efi_dtb; "                      \
 163                        "fi;"                                             \
 164                "done;"                                                   \
 165                "run boot_efi_bootmgr;"                                   \
 166                "if test -e ${devtype} ${devnum}:${distro_bootpart} "     \
 167                                        "efi/boot/"BOOTEFI_NAME"; then "  \
 168                                "echo Found EFI removable media binary "  \
 169                                        "efi/boot/"BOOTEFI_NAME"; "       \
 170                                "run boot_efi_binary; "                   \
 171                                "echo EFI LOAD FAILED: continuing...; "   \
 172                "fi; "                                                    \
 173                "setenv efi_fdtfile\0"
 174#define SCAN_DEV_FOR_EFI "run scan_dev_for_efi;"
 175#else
 176#define BOOTENV_SHARED_EFI
 177#define SCAN_DEV_FOR_EFI
 178#endif
 179
 180#ifdef CONFIG_SATA
 181#define BOOTENV_SHARED_SATA     BOOTENV_SHARED_BLKDEV(sata)
 182#define BOOTENV_DEV_SATA        BOOTENV_DEV_BLKDEV
 183#define BOOTENV_DEV_NAME_SATA   BOOTENV_DEV_NAME_BLKDEV
 184#else
 185#define BOOTENV_SHARED_SATA
 186#define BOOTENV_DEV_SATA \
 187        BOOT_TARGET_DEVICES_references_SATA_without_CONFIG_SATA
 188#define BOOTENV_DEV_NAME_SATA \
 189        BOOT_TARGET_DEVICES_references_SATA_without_CONFIG_SATA
 190#endif
 191
 192#ifdef CONFIG_NVME
 193#define BOOTENV_RUN_NVME_INIT "run nvme_init; "
 194#define BOOTENV_SET_NVME_NEED_INIT "setenv nvme_need_init; "
 195#define BOOTENV_SHARED_NVME \
 196        "nvme_init=" \
 197                "if ${nvme_need_init}; then " \
 198                        "setenv nvme_need_init false; " \
 199                        "nvme scan; " \
 200                "fi\0" \
 201        \
 202        "nvme_boot=" \
 203                BOOTENV_RUN_PCI_ENUM \
 204                BOOTENV_RUN_NVME_INIT \
 205                BOOTENV_SHARED_BLKDEV_BODY(nvme)
 206#define BOOTENV_DEV_NVME        BOOTENV_DEV_BLKDEV
 207#define BOOTENV_DEV_NAME_NVME   BOOTENV_DEV_NAME_BLKDEV
 208#else
 209#define BOOTENV_RUN_NVME_INIT
 210#define BOOTENV_SET_NVME_NEED_INIT
 211#define BOOTENV_SHARED_NVME
 212#define BOOTENV_DEV_NVME \
 213        BOOT_TARGET_DEVICES_references_NVME_without_CONFIG_NVME
 214#define BOOTENV_DEV_NAME_NVME \
 215        BOOT_TARGET_DEVICES_references_NVME_without_CONFIG_NVME
 216#endif
 217
 218#ifdef CONFIG_SCSI
 219#define BOOTENV_RUN_SCSI_INIT "run scsi_init; "
 220#define BOOTENV_SET_SCSI_NEED_INIT "scsi_need_init=; "
 221#define BOOTENV_SHARED_SCSI \
 222        "scsi_init=" \
 223                "if ${scsi_need_init}; then " \
 224                        "scsi_need_init=false; " \
 225                        "scsi scan; " \
 226                "fi\0" \
 227        \
 228        "scsi_boot=" \
 229                BOOTENV_RUN_SCSI_INIT \
 230                BOOTENV_SHARED_BLKDEV_BODY(scsi)
 231#define BOOTENV_DEV_SCSI        BOOTENV_DEV_BLKDEV
 232#define BOOTENV_DEV_NAME_SCSI   BOOTENV_DEV_NAME_BLKDEV
 233#else
 234#define BOOTENV_RUN_SCSI_INIT
 235#define BOOTENV_SET_SCSI_NEED_INIT
 236#define BOOTENV_SHARED_SCSI
 237#define BOOTENV_DEV_SCSI \
 238        BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_SCSI
 239#define BOOTENV_DEV_NAME_SCSI \
 240        BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_SCSI
 241#endif
 242
 243#ifdef CONFIG_IDE
 244#define BOOTENV_RUN_IDE_INIT "run ide_init; "
 245#define BOOTENV_SET_IDE_NEED_INIT "setenv ide_need_init; "
 246#define BOOTENV_SHARED_IDE \
 247        "ide_init=" \
 248                "if ${ide_need_init}; then " \
 249                        "setenv ide_need_init false; " \
 250                        "ide reset; " \
 251                "fi\0" \
 252        \
 253        "ide_boot=" \
 254                BOOTENV_RUN_IDE_INIT \
 255                BOOTENV_SHARED_BLKDEV_BODY(ide)
 256#define BOOTENV_DEV_IDE         BOOTENV_DEV_BLKDEV
 257#define BOOTENV_DEV_NAME_IDE    BOOTENV_DEV_NAME_BLKDEV
 258#else
 259#define BOOTENV_RUN_IDE_INIT
 260#define BOOTENV_SET_IDE_NEED_INIT
 261#define BOOTENV_SHARED_IDE
 262#define BOOTENV_DEV_IDE \
 263        BOOT_TARGET_DEVICES_references_IDE_without_CONFIG_IDE
 264#define BOOTENV_DEV_NAME_IDE \
 265        BOOT_TARGET_DEVICES_references_IDE_without_CONFIG_IDE
 266#endif
 267
 268#if defined(CONFIG_PCI)
 269#define BOOTENV_RUN_PCI_ENUM "run boot_pci_enum; "
 270#define BOOTENV_SHARED_PCI \
 271        "boot_pci_enum=pci enum\0"
 272#else
 273#define BOOTENV_RUN_PCI_ENUM
 274#define BOOTENV_SHARED_PCI
 275#endif
 276
 277#ifdef CONFIG_CMD_USB
 278#define BOOTENV_RUN_NET_USB_START "run boot_net_usb_start; "
 279#define BOOTENV_SHARED_USB \
 280        "boot_net_usb_start=usb start\0" \
 281        "usb_boot=" \
 282                "usb start; " \
 283                BOOTENV_SHARED_BLKDEV_BODY(usb)
 284#define BOOTENV_DEV_USB         BOOTENV_DEV_BLKDEV
 285#define BOOTENV_DEV_NAME_USB    BOOTENV_DEV_NAME_BLKDEV
 286#else
 287#define BOOTENV_RUN_NET_USB_START
 288#define BOOTENV_SHARED_USB
 289#define BOOTENV_DEV_USB \
 290        BOOT_TARGET_DEVICES_references_USB_without_CONFIG_CMD_USB
 291#define BOOTENV_DEV_NAME_USB \
 292        BOOT_TARGET_DEVICES_references_USB_without_CONFIG_CMD_USB
 293#endif
 294
 295#ifdef CONFIG_CMD_VIRTIO
 296#define BOOTENV_RUN_VIRTIO_INIT "run virtio_init; "
 297#define BOOTENV_SET_VIRTIO_NEED_INIT "virtio_need_init=; "
 298#define BOOTENV_SHARED_VIRTIO \
 299        "virtio_init=" \
 300                "if ${virtio_need_init}; then " \
 301                        "virtio_need_init=false; " \
 302                        "virtio scan; " \
 303                "fi\0" \
 304        \
 305        "virtio_boot=" \
 306                BOOTENV_RUN_PCI_ENUM \
 307                BOOTENV_RUN_VIRTIO_INIT \
 308                BOOTENV_SHARED_BLKDEV_BODY(virtio)
 309#define BOOTENV_DEV_VIRTIO      BOOTENV_DEV_BLKDEV
 310#define BOOTENV_DEV_NAME_VIRTIO BOOTENV_DEV_NAME_BLKDEV
 311#else
 312#define BOOTENV_RUN_VIRTIO_INIT
 313#define BOOTENV_SET_VIRTIO_NEED_INIT
 314#define BOOTENV_SHARED_VIRTIO
 315#define BOOTENV_DEV_VIRTIO \
 316        BOOT_TARGET_DEVICES_references_VIRTIO_without_CONFIG_CMD_VIRTIO
 317#define BOOTENV_DEV_NAME_VIRTIO \
 318        BOOT_TARGET_DEVICES_references_VIRTIO_without_CONFIG_CMD_VIRTIO
 319#endif
 320
 321#if defined(CONFIG_CMD_DHCP)
 322#if defined(CONFIG_EFI_LOADER)
 323/* http://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml */
 324#if defined(CONFIG_ARM64) || defined(__aarch64__)
 325#define BOOTENV_EFI_PXE_ARCH "0xb"
 326#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00011:UNDI:003000"
 327#elif defined(CONFIG_ARM) || defined(__arm__)
 328#define BOOTENV_EFI_PXE_ARCH "0xa"
 329#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00010:UNDI:003000"
 330#elif defined(CONFIG_X86) || defined(__x86_64__)
 331#define BOOTENV_EFI_PXE_ARCH "0x7"
 332#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00007:UNDI:003000"
 333#elif defined(__i386__)
 334#define BOOTENV_EFI_PXE_ARCH "0x6"
 335#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00006:UNDI:003000"
 336#elif defined(CONFIG_ARCH_RV32I) || ((defined(__riscv) && __riscv_xlen == 32))
 337#define BOOTENV_EFI_PXE_ARCH "0x19"
 338#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00025:UNDI:003000"
 339#elif defined(CONFIG_ARCH_RV64I) || ((defined(__riscv) && __riscv_xlen == 64))
 340#define BOOTENV_EFI_PXE_ARCH "0x1b"
 341#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00027:UNDI:003000"
 342#elif defined(CONFIG_SANDBOX)
 343# error "sandbox EFI support is only supported on ARM and x86"
 344#else
 345#error Please specify an EFI client identifier
 346#endif
 347
 348/*
 349 * Ask the dhcp server for an EFI binary. If we get one, check for a
 350 * device tree in the same folder. Then boot everything. If the file was
 351 * not an EFI binary, we just return from the bootefi command and continue.
 352 */
 353#define BOOTENV_EFI_RUN_DHCP \
 354        "setenv efi_fdtfile ${fdtfile}; "                                 \
 355        BOOTENV_EFI_SET_FDTFILE_FALLBACK                                  \
 356        "setenv efi_old_vci ${bootp_vci};"                                \
 357        "setenv efi_old_arch ${bootp_arch};"                              \
 358        "setenv bootp_vci " BOOTENV_EFI_PXE_VCI ";"                       \
 359        "setenv bootp_arch " BOOTENV_EFI_PXE_ARCH ";"                     \
 360        "if dhcp ${kernel_addr_r}; then "                                 \
 361                "tftpboot ${fdt_addr_r} dtb/${efi_fdtfile};"              \
 362                "if fdt addr ${fdt_addr_r}; then "                        \
 363                        "bootefi ${kernel_addr_r} ${fdt_addr_r}; "        \
 364                "else "                                                   \
 365                        "bootefi ${kernel_addr_r} ${fdtcontroladdr};"     \
 366                "fi;"                                                     \
 367        "fi;"                                                             \
 368        "setenv bootp_vci ${efi_old_vci};"                                \
 369        "setenv bootp_arch ${efi_old_arch};"                              \
 370        "setenv efi_fdtfile;"                                             \
 371        "setenv efi_old_arch;"                                            \
 372        "setenv efi_old_vci;"
 373#else
 374#define BOOTENV_EFI_RUN_DHCP
 375#endif
 376#define BOOTENV_DEV_DHCP(devtypeu, devtypel, instance) \
 377        "bootcmd_dhcp=" \
 378                "devtype=" #devtypel "; " \
 379                BOOTENV_RUN_NET_USB_START \
 380                BOOTENV_RUN_PCI_ENUM \
 381                "if dhcp ${scriptaddr} ${boot_script_dhcp}; then " \
 382                        "source ${scriptaddr}; " \
 383                "fi;" \
 384                BOOTENV_EFI_RUN_DHCP \
 385                "\0"
 386#define BOOTENV_DEV_NAME_DHCP(devtypeu, devtypel, instance) \
 387        "dhcp "
 388#else
 389#define BOOTENV_DEV_DHCP \
 390        BOOT_TARGET_DEVICES_references_DHCP_without_CONFIG_CMD_DHCP
 391#define BOOTENV_DEV_NAME_DHCP \
 392        BOOT_TARGET_DEVICES_references_DHCP_without_CONFIG_CMD_DHCP
 393#endif
 394
 395#if defined(CONFIG_CMD_DHCP) && defined(CONFIG_CMD_PXE)
 396#define BOOTENV_DEV_PXE(devtypeu, devtypel, instance) \
 397        "bootcmd_pxe=" \
 398                BOOTENV_RUN_NET_USB_START \
 399                BOOTENV_RUN_PCI_ENUM \
 400                "dhcp; " \
 401                "if pxe get; then " \
 402                        "pxe boot; " \
 403                "fi\0"
 404#define BOOTENV_DEV_NAME_PXE(devtypeu, devtypel, instance) \
 405        "pxe "
 406#else
 407#define BOOTENV_DEV_PXE \
 408        BOOT_TARGET_DEVICES_references_PXE_without_CONFIG_CMD_DHCP_or_PXE
 409#define BOOTENV_DEV_NAME_PXE \
 410        BOOT_TARGET_DEVICES_references_PXE_without_CONFIG_CMD_DHCP_or_PXE
 411#endif
 412
 413#define BOOTENV_DEV_NAME(devtypeu, devtypel, instance) \
 414        BOOTENV_DEV_NAME_##devtypeu(devtypeu, devtypel, instance)
 415#define BOOTENV_BOOT_TARGETS \
 416        "boot_targets=" BOOT_TARGET_DEVICES(BOOTENV_DEV_NAME) "\0"
 417
 418#define BOOTENV_DEV(devtypeu, devtypel, instance) \
 419        BOOTENV_DEV_##devtypeu(devtypeu, devtypel, instance)
 420#define BOOTENV \
 421        BOOTENV_SHARED_HOST \
 422        BOOTENV_SHARED_MMC \
 423        BOOTENV_SHARED_PCI \
 424        BOOTENV_SHARED_USB \
 425        BOOTENV_SHARED_SATA \
 426        BOOTENV_SHARED_SCSI \
 427        BOOTENV_SHARED_NVME \
 428        BOOTENV_SHARED_IDE \
 429        BOOTENV_SHARED_UBIFS \
 430        BOOTENV_SHARED_EFI \
 431        BOOTENV_SHARED_VIRTIO \
 432        "boot_prefixes=/ /boot/\0" \
 433        "boot_scripts=boot.scr.uimg boot.scr\0" \
 434        "boot_script_dhcp=boot.scr.uimg\0" \
 435        BOOTENV_BOOT_TARGETS \
 436        \
 437        "boot_syslinux_conf=extlinux/extlinux.conf\0" \
 438        "boot_extlinux="                                                  \
 439                "sysboot ${devtype} ${devnum}:${distro_bootpart} any "    \
 440                        "${scriptaddr} ${prefix}${boot_syslinux_conf}\0"  \
 441        \
 442        "scan_dev_for_extlinux="                                          \
 443                "if test -e ${devtype} "                                  \
 444                                "${devnum}:${distro_bootpart} "           \
 445                                "${prefix}${boot_syslinux_conf}; then "   \
 446                        "echo Found ${prefix}${boot_syslinux_conf}; "     \
 447                        "run boot_extlinux; "                             \
 448                        "echo SCRIPT FAILED: continuing...; "             \
 449                "fi\0"                                                    \
 450        \
 451        "boot_a_script="                                                  \
 452                "load ${devtype} ${devnum}:${distro_bootpart} "           \
 453                        "${scriptaddr} ${prefix}${script}; "              \
 454                "source ${scriptaddr}\0"                                  \
 455        \
 456        "scan_dev_for_scripts="                                           \
 457                "for script in ${boot_scripts}; do "                      \
 458                        "if test -e ${devtype} "                          \
 459                                        "${devnum}:${distro_bootpart} "   \
 460                                        "${prefix}${script}; then "       \
 461                                "echo Found U-Boot script "               \
 462                                        "${prefix}${script}; "            \
 463                                "run boot_a_script; "                     \
 464                                "echo SCRIPT FAILED: continuing...; "     \
 465                        "fi; "                                            \
 466                "done\0"                                                  \
 467        \
 468        "scan_dev_for_boot="                                              \
 469                "echo Scanning ${devtype} "                               \
 470                                "${devnum}:${distro_bootpart}...; "       \
 471                "for prefix in ${boot_prefixes}; do "                     \
 472                        "run scan_dev_for_extlinux; "                     \
 473                        "run scan_dev_for_scripts; "                      \
 474                "done;"                                                   \
 475                SCAN_DEV_FOR_EFI                                          \
 476                "\0"                                                      \
 477        \
 478        "scan_dev_for_boot_part="                                         \
 479                "part list ${devtype} ${devnum} -bootable devplist; "     \
 480                "env exists devplist || setenv devplist 1; "              \
 481                "for distro_bootpart in ${devplist}; do "                 \
 482                        "if fstype ${devtype} "                           \
 483                                        "${devnum}:${distro_bootpart} "   \
 484                                        "bootfstype; then "               \
 485                                "run scan_dev_for_boot; "                 \
 486                        "fi; "                                            \
 487                "done; "                                                  \
 488                "setenv devplist\0"                                       \
 489        \
 490        BOOT_TARGET_DEVICES(BOOTENV_DEV)                                  \
 491        \
 492        "distro_bootcmd=" BOOTENV_SET_SCSI_NEED_INIT                      \
 493                BOOTENV_SET_NVME_NEED_INIT                                \
 494                BOOTENV_SET_IDE_NEED_INIT                                 \
 495                BOOTENV_SET_VIRTIO_NEED_INIT                              \
 496                "for target in ${boot_targets}; do "                      \
 497                        "run bootcmd_${target}; "                         \
 498                "done\0"
 499
 500#ifndef CONFIG_BOOTCOMMAND
 501#define CONFIG_BOOTCOMMAND "run distro_bootcmd"
 502#endif
 503
 504#endif  /* _CONFIG_CMD_DISTRO_BOOTCMD_H */
 505