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_NONE(devtypeu, devtypel, instance) 39 40#define BOOTENV_DEV_BLKDEV(devtypeu, devtypel, instance) \ 41 "bootcmd_" #devtypel #instance "=" \ 42 "devnum=" #instance "; " \ 43 "run " #devtypel "_boot\0" 44 45#define BOOTENV_DEV_NAME_BLKDEV_NONE(devtypeu, devtypel, instance) 46 47#define BOOTENV_DEV_NAME_BLKDEV(devtypeu, devtypel, instance) \ 48 #devtypel #instance " " 49 50#ifdef CONFIG_SANDBOX 51#define BOOTENV_SHARED_HOST BOOTENV_SHARED_BLKDEV(host) 52#define BOOTENV_DEV_HOST BOOTENV_DEV_BLKDEV 53#define BOOTENV_DEV_NAME_HOST BOOTENV_DEV_NAME_BLKDEV 54#else 55#define BOOTENV_SHARED_HOST 56#define BOOTENV_DEV_HOST \ 57 BOOT_TARGET_DEVICES_references_HOST_without_CONFIG_SANDBOX 58#define BOOTENV_DEV_NAME_HOST \ 59 BOOT_TARGET_DEVICES_references_HOST_without_CONFIG_SANDBOX 60#endif 61 62#ifdef CONFIG_CMD_MMC 63#define BOOTENV_SHARED_MMC BOOTENV_SHARED_BLKDEV(mmc) 64#define BOOTENV_DEV_MMC BOOTENV_DEV_BLKDEV 65#define BOOTENV_DEV_NAME_MMC BOOTENV_DEV_NAME_BLKDEV 66#elif defined(CONFIG_SPL_BUILD) 67#define BOOTENV_SHARED_MMC 68#define BOOTENV_DEV_MMC BOOTENV_DEV_BLKDEV_NONE 69#define BOOTENV_DEV_NAME_MMC BOOTENV_DEV_NAME_BLKDEV_NONE 70#else 71#define BOOTENV_SHARED_MMC 72#define BOOTENV_DEV_MMC \ 73 BOOT_TARGET_DEVICES_references_MMC_without_CONFIG_CMD_MMC 74#define BOOTENV_DEV_NAME_MMC \ 75 BOOT_TARGET_DEVICES_references_MMC_without_CONFIG_CMD_MMC 76#endif 77 78#ifdef CONFIG_CMD_UBIFS 79#define BOOTENV_SHARED_UBIFS \ 80 "ubifs_boot=" \ 81 "if ubi part ${bootubipart} ${bootubioff} && " \ 82 "ubifsmount ubi0:${bootubivol}; " \ 83 "then " \ 84 "devtype=ubi; " \ 85 "devnum=ubi0; " \ 86 "bootfstype=ubifs; " \ 87 "distro_bootpart=${bootubivol}; " \ 88 "run scan_dev_for_boot; " \ 89 "ubifsumount; " \ 90 "fi\0" 91#define BOOTENV_DEV_UBIFS_BOOTUBIOFF(off) #off /* type check, throw error when called with more args */ 92#define BOOTENV_DEV_UBIFS(devtypeu, devtypel, instance, bootubipart, bootubivol, ...) \ 93 "bootcmd_ubifs" #instance "=" \ 94 "bootubipart=" #bootubipart "; " \ 95 "bootubivol=" #bootubivol "; " \ 96 "bootubioff=" BOOTENV_DEV_UBIFS_BOOTUBIOFF(__VA_ARGS__) "; " \ 97 "run ubifs_boot\0" 98#define BOOTENV_DEV_NAME_UBIFS(devtypeu, devtypel, instance, ...) \ 99 #devtypel #instance " " 100#else 101#define BOOTENV_SHARED_UBIFS 102#define BOOTENV_DEV_UBIFS \ 103 BOOT_TARGET_DEVICES_references_UBIFS_without_CONFIG_CMD_UBIFS 104#define BOOTENV_DEV_NAME_UBIFS \ 105 BOOT_TARGET_DEVICES_references_UBIFS_without_CONFIG_CMD_UBIFS 106#endif 107 108#ifdef CONFIG_EFI_LOADER 109#if defined(CONFIG_ARM64) 110#define BOOTEFI_NAME "bootaa64.efi" 111#elif defined(CONFIG_ARM) 112#define BOOTEFI_NAME "bootarm.efi" 113#elif defined(CONFIG_X86_RUN_32BIT) 114#define BOOTEFI_NAME "bootia32.efi" 115#elif defined(CONFIG_X86_RUN_64BIT) 116#define BOOTEFI_NAME "bootx64.efi" 117#elif defined(CONFIG_ARCH_RV32I) 118#define BOOTEFI_NAME "bootriscv32.efi" 119#elif defined(CONFIG_ARCH_RV64I) 120#define BOOTEFI_NAME "bootriscv64.efi" 121#endif 122#endif 123 124#ifdef BOOTEFI_NAME 125#if defined(CONFIG_ARM) && !defined(CONFIG_ARM64) 126/* 127 * On 32bit ARM systems there is a reasonable number of systems that follow 128 * the $soc-$board$boardver.dtb name scheme for their device trees. Use that 129 * scheme if we don't have an explicit fdtfile variable. 130 */ 131#define BOOTENV_EFI_SET_FDTFILE_FALLBACK \ 132 "if test -z \"${fdtfile}\" -a -n \"${soc}\"; then " \ 133 "setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; " \ 134 "fi; " 135#else 136#ifndef BOOTENV_EFI_SET_FDTFILE_FALLBACK 137#define BOOTENV_EFI_SET_FDTFILE_FALLBACK 138#endif 139#endif 140 141#ifdef CONFIG_CMD_BOOTEFI_BOOTMGR 142#define BOOTENV_EFI_BOOTMGR \ 143 "boot_efi_bootmgr=" \ 144 "if fdt addr -q ${fdt_addr_r}; then " \ 145 "bootefi bootmgr ${fdt_addr_r};" \ 146 "else " \ 147 "bootefi bootmgr;" \ 148 "fi\0" 149#else 150#define BOOTENV_EFI_BOOTMGR 151#endif 152 153#define BOOTENV_SHARED_EFI \ 154 BOOTENV_EFI_BOOTMGR \ 155 \ 156 "boot_efi_binary=" \ 157 "load ${devtype} ${devnum}:${distro_bootpart} " \ 158 "${kernel_addr_r} efi/boot/"BOOTEFI_NAME"; " \ 159 "if fdt addr -q ${fdt_addr_r}; then " \ 160 "bootefi ${kernel_addr_r} ${fdt_addr_r};" \ 161 "else " \ 162 "bootefi ${kernel_addr_r} ${fdtcontroladdr};" \ 163 "fi\0" \ 164 \ 165 "load_efi_dtb=" \ 166 "load ${devtype} ${devnum}:${distro_bootpart} " \ 167 "${fdt_addr_r} ${prefix}${efi_fdtfile}\0" \ 168 \ 169 "efi_dtb_prefixes=/ /dtb/ /dtb/current/\0" \ 170 "scan_dev_for_efi=" \ 171 "setenv efi_fdtfile ${fdtfile}; " \ 172 BOOTENV_EFI_SET_FDTFILE_FALLBACK \ 173 BOOTENV_RUN_EXTENSION_INIT \ 174 "for prefix in ${efi_dtb_prefixes}; do " \ 175 "if test -e ${devtype} " \ 176 "${devnum}:${distro_bootpart} " \ 177 "${prefix}${efi_fdtfile}; then " \ 178 "run load_efi_dtb; " \ 179 BOOTENV_RUN_EXTENSION_APPLY \ 180 "fi;" \ 181 "done;" \ 182 "run boot_efi_bootmgr;" \ 183 "if test -e ${devtype} ${devnum}:${distro_bootpart} " \ 184 "efi/boot/"BOOTEFI_NAME"; then " \ 185 "echo Found EFI removable media binary " \ 186 "efi/boot/"BOOTEFI_NAME"; " \ 187 "run boot_efi_binary; " \ 188 "echo EFI LOAD FAILED: continuing...; " \ 189 "fi; " \ 190 "setenv efi_fdtfile\0" 191#define SCAN_DEV_FOR_EFI "run scan_dev_for_efi;" 192#else 193#define BOOTENV_SHARED_EFI 194#define SCAN_DEV_FOR_EFI 195#endif 196 197#ifdef CONFIG_SATA 198#define BOOTENV_SHARED_SATA BOOTENV_SHARED_BLKDEV(sata) 199#define BOOTENV_DEV_SATA BOOTENV_DEV_BLKDEV 200#define BOOTENV_DEV_NAME_SATA BOOTENV_DEV_NAME_BLKDEV 201#elif defined(CONFIG_SPL_BUILD) 202#define BOOTENV_SHARED_SATA 203#define BOOTENV_DEV_SATA BOOTENV_DEV_BLKDEV_NONE 204#define BOOTENV_DEV_NAME_SATA BOOTENV_DEV_NAME_BLKDEV_NONE 205#else 206#define BOOTENV_SHARED_SATA 207#define BOOTENV_DEV_SATA \ 208 BOOT_TARGET_DEVICES_references_SATA_without_CONFIG_SATA 209#define BOOTENV_DEV_NAME_SATA \ 210 BOOT_TARGET_DEVICES_references_SATA_without_CONFIG_SATA 211#endif 212 213#ifdef CONFIG_NVME 214#define BOOTENV_RUN_NVME_INIT "run nvme_init; " 215#define BOOTENV_SET_NVME_NEED_INIT "setenv nvme_need_init; " 216#define BOOTENV_SHARED_NVME \ 217 "nvme_init=" \ 218 "if ${nvme_need_init}; then " \ 219 "setenv nvme_need_init false; " \ 220 "nvme scan; " \ 221 "fi\0" \ 222 \ 223 "nvme_boot=" \ 224 BOOTENV_RUN_PCI_ENUM \ 225 BOOTENV_RUN_NVME_INIT \ 226 BOOTENV_SHARED_BLKDEV_BODY(nvme) 227#define BOOTENV_DEV_NVME BOOTENV_DEV_BLKDEV 228#define BOOTENV_DEV_NAME_NVME BOOTENV_DEV_NAME_BLKDEV 229#else 230#define BOOTENV_RUN_NVME_INIT 231#define BOOTENV_SET_NVME_NEED_INIT 232#define BOOTENV_SHARED_NVME 233#define BOOTENV_DEV_NVME \ 234 BOOT_TARGET_DEVICES_references_NVME_without_CONFIG_NVME 235#define BOOTENV_DEV_NAME_NVME \ 236 BOOT_TARGET_DEVICES_references_NVME_without_CONFIG_NVME 237#endif 238 239#ifdef CONFIG_SCSI 240#define BOOTENV_RUN_SCSI_INIT "run scsi_init; " 241#define BOOTENV_SET_SCSI_NEED_INIT "scsi_need_init=; " 242#define BOOTENV_SHARED_SCSI \ 243 "scsi_init=" \ 244 "if ${scsi_need_init}; then " \ 245 "scsi_need_init=false; " \ 246 "scsi scan; " \ 247 "fi\0" \ 248 \ 249 "scsi_boot=" \ 250 BOOTENV_RUN_PCI_ENUM \ 251 BOOTENV_RUN_SCSI_INIT \ 252 BOOTENV_SHARED_BLKDEV_BODY(scsi) 253#define BOOTENV_DEV_SCSI BOOTENV_DEV_BLKDEV 254#define BOOTENV_DEV_NAME_SCSI BOOTENV_DEV_NAME_BLKDEV 255#else 256#define BOOTENV_RUN_SCSI_INIT 257#define BOOTENV_SET_SCSI_NEED_INIT 258#define BOOTENV_SHARED_SCSI 259#define BOOTENV_DEV_SCSI \ 260 BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_SCSI 261#define BOOTENV_DEV_NAME_SCSI \ 262 BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_SCSI 263#endif 264 265#ifdef CONFIG_IDE 266#define BOOTENV_RUN_IDE_INIT "run ide_init; " 267#define BOOTENV_SET_IDE_NEED_INIT "setenv ide_need_init; " 268#define BOOTENV_SHARED_IDE \ 269 "ide_init=" \ 270 "if ${ide_need_init}; then " \ 271 "setenv ide_need_init false; " \ 272 "ide reset; " \ 273 "fi\0" \ 274 \ 275 "ide_boot=" \ 276 BOOTENV_RUN_IDE_INIT \ 277 BOOTENV_SHARED_BLKDEV_BODY(ide) 278#define BOOTENV_DEV_IDE BOOTENV_DEV_BLKDEV 279#define BOOTENV_DEV_NAME_IDE BOOTENV_DEV_NAME_BLKDEV 280#else 281#define BOOTENV_RUN_IDE_INIT 282#define BOOTENV_SET_IDE_NEED_INIT 283#define BOOTENV_SHARED_IDE 284#define BOOTENV_DEV_IDE \ 285 BOOT_TARGET_DEVICES_references_IDE_without_CONFIG_IDE 286#define BOOTENV_DEV_NAME_IDE \ 287 BOOT_TARGET_DEVICES_references_IDE_without_CONFIG_IDE 288#endif 289 290#if defined(CONFIG_PCI) 291#define BOOTENV_RUN_PCI_ENUM "run boot_pci_enum; " 292#define BOOTENV_SHARED_PCI \ 293 "boot_pci_enum=pci enum\0" 294#else 295#define BOOTENV_RUN_PCI_ENUM 296#define BOOTENV_SHARED_PCI 297#endif 298 299#ifdef CONFIG_CMD_USB 300#define BOOTENV_RUN_NET_USB_START "run boot_net_usb_start; " 301#define BOOTENV_SHARED_USB \ 302 "boot_net_usb_start=usb start\0" \ 303 "usb_boot=" \ 304 "usb start; " \ 305 BOOTENV_SHARED_BLKDEV_BODY(usb) 306#define BOOTENV_DEV_USB BOOTENV_DEV_BLKDEV 307#define BOOTENV_DEV_NAME_USB BOOTENV_DEV_NAME_BLKDEV 308#elif defined(CONFIG_SPL_BUILD) 309#define BOOTENV_RUN_NET_USB_START 310#define BOOTENV_SHARED_USB 311#define BOOTENV_DEV_USB BOOTENV_DEV_BLKDEV_NONE 312#define BOOTENV_DEV_NAME_USB BOOTENV_DEV_NAME_BLKDEV_NONE 313#else 314#define BOOTENV_RUN_NET_USB_START 315#define BOOTENV_SHARED_USB 316#define BOOTENV_DEV_USB \ 317 BOOT_TARGET_DEVICES_references_USB_without_CONFIG_CMD_USB 318#define BOOTENV_DEV_NAME_USB \ 319 BOOT_TARGET_DEVICES_references_USB_without_CONFIG_CMD_USB 320#endif 321 322#ifdef CONFIG_CMD_VIRTIO 323#define BOOTENV_RUN_VIRTIO_INIT "run virtio_init; " 324#define BOOTENV_SET_VIRTIO_NEED_INIT "virtio_need_init=; " 325#define BOOTENV_SHARED_VIRTIO \ 326 "virtio_init=" \ 327 "if ${virtio_need_init}; then " \ 328 "virtio_need_init=false; " \ 329 "virtio scan; " \ 330 "fi\0" \ 331 \ 332 "virtio_boot=" \ 333 BOOTENV_RUN_PCI_ENUM \ 334 BOOTENV_RUN_VIRTIO_INIT \ 335 BOOTENV_SHARED_BLKDEV_BODY(virtio) 336#define BOOTENV_DEV_VIRTIO BOOTENV_DEV_BLKDEV 337#define BOOTENV_DEV_NAME_VIRTIO BOOTENV_DEV_NAME_BLKDEV 338#else 339#define BOOTENV_RUN_VIRTIO_INIT 340#define BOOTENV_SET_VIRTIO_NEED_INIT 341#define BOOTENV_SHARED_VIRTIO 342#define BOOTENV_DEV_VIRTIO \ 343 BOOT_TARGET_DEVICES_references_VIRTIO_without_CONFIG_CMD_VIRTIO 344#define BOOTENV_DEV_NAME_VIRTIO \ 345 BOOT_TARGET_DEVICES_references_VIRTIO_without_CONFIG_CMD_VIRTIO 346#endif 347 348#if defined(CONFIG_CMD_DHCP) 349#if defined(CONFIG_EFI_LOADER) 350/* http://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml */ 351#if defined(CONFIG_ARM64) || defined(__aarch64__) 352#define BOOTENV_EFI_PXE_ARCH "0xb" 353#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00011:UNDI:003000" 354#elif defined(CONFIG_ARM) || defined(__arm__) 355#define BOOTENV_EFI_PXE_ARCH "0xa" 356#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00010:UNDI:003000" 357#elif defined(CONFIG_X86) || defined(__x86_64__) 358#define BOOTENV_EFI_PXE_ARCH "0x7" 359#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00007:UNDI:003000" 360#elif defined(__i386__) 361#define BOOTENV_EFI_PXE_ARCH "0x6" 362#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00006:UNDI:003000" 363#elif defined(CONFIG_ARCH_RV32I) || ((defined(__riscv) && __riscv_xlen == 32)) 364#define BOOTENV_EFI_PXE_ARCH "0x19" 365#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00025:UNDI:003000" 366#elif defined(CONFIG_ARCH_RV64I) || ((defined(__riscv) && __riscv_xlen == 64)) 367#define BOOTENV_EFI_PXE_ARCH "0x1b" 368#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00027:UNDI:003000" 369#elif defined(CONFIG_SANDBOX) 370# error "sandbox EFI support is only supported on ARM and x86" 371#else 372#error Please specify an EFI client identifier 373#endif 374 375/* 376 * Ask the dhcp server for an EFI binary. If we get one, check for a 377 * device tree in the same folder. Then boot everything. If the file was 378 * not an EFI binary, we just return from the bootefi command and continue. 379 */ 380#define BOOTENV_EFI_RUN_DHCP \ 381 "setenv efi_fdtfile ${fdtfile}; " \ 382 BOOTENV_EFI_SET_FDTFILE_FALLBACK \ 383 "setenv efi_old_vci ${bootp_vci};" \ 384 "setenv efi_old_arch ${bootp_arch};" \ 385 "setenv bootp_vci " BOOTENV_EFI_PXE_VCI ";" \ 386 "setenv bootp_arch " BOOTENV_EFI_PXE_ARCH ";" \ 387 "if dhcp ${kernel_addr_r}; then " \ 388 "tftpboot ${fdt_addr_r} dtb/${efi_fdtfile};" \ 389 "if fdt addr -q ${fdt_addr_r}; then " \ 390 "bootefi ${kernel_addr_r} ${fdt_addr_r}; " \ 391 "else " \ 392 "bootefi ${kernel_addr_r} ${fdtcontroladdr};" \ 393 "fi;" \ 394 "fi;" \ 395 "setenv bootp_vci ${efi_old_vci};" \ 396 "setenv bootp_arch ${efi_old_arch};" \ 397 "setenv efi_fdtfile;" \ 398 "setenv efi_old_arch;" \ 399 "setenv efi_old_vci;" 400#else 401#define BOOTENV_EFI_RUN_DHCP 402#endif 403#define BOOTENV_DEV_DHCP(devtypeu, devtypel, instance) \ 404 "bootcmd_dhcp=" \ 405 "devtype=" #devtypel "; " \ 406 BOOTENV_RUN_NET_USB_START \ 407 BOOTENV_RUN_PCI_ENUM \ 408 "if dhcp ${scriptaddr} ${boot_script_dhcp}; then " \ 409 "source ${scriptaddr}; " \ 410 "fi;" \ 411 BOOTENV_EFI_RUN_DHCP \ 412 "\0" 413#define BOOTENV_DEV_NAME_DHCP(devtypeu, devtypel, instance) \ 414 "dhcp " 415#elif defined(CONFIG_SPL_BUILD) 416#define BOOTENV_DEV_DHCP BOOTENV_DEV_BLKDEV_NONE 417#define BOOTENV_DEV_NAME_DHCP BOOTENV_DEV_NAME_BLKDEV_NONE 418#else 419#define BOOTENV_DEV_DHCP \ 420 BOOT_TARGET_DEVICES_references_DHCP_without_CONFIG_CMD_DHCP 421#define BOOTENV_DEV_NAME_DHCP \ 422 BOOT_TARGET_DEVICES_references_DHCP_without_CONFIG_CMD_DHCP 423#endif 424 425#if defined(CONFIG_CMD_DHCP) && defined(CONFIG_CMD_PXE) 426#define BOOTENV_DEV_PXE(devtypeu, devtypel, instance) \ 427 "bootcmd_pxe=" \ 428 BOOTENV_RUN_NET_USB_START \ 429 BOOTENV_RUN_PCI_ENUM \ 430 "dhcp; " \ 431 "if pxe get; then " \ 432 "pxe boot; " \ 433 "fi\0" 434#define BOOTENV_DEV_NAME_PXE(devtypeu, devtypel, instance) \ 435 "pxe " 436#elif defined(CONFIG_SPL_BUILD) 437#define BOOTENV_DEV_PXE BOOTENV_DEV_BLKDEV_NONE 438#define BOOTENV_DEV_NAME_PXE BOOTENV_DEV_NAME_BLKDEV_NONE 439#else 440#define BOOTENV_DEV_PXE \ 441 BOOT_TARGET_DEVICES_references_PXE_without_CONFIG_CMD_DHCP_or_PXE 442#define BOOTENV_DEV_NAME_PXE \ 443 BOOT_TARGET_DEVICES_references_PXE_without_CONFIG_CMD_DHCP_or_PXE 444#endif 445 446#if defined(CONFIG_CMD_EXTENSION) 447#define BOOTENV_RUN_EXTENSION_INIT "run extension_init; " 448#define BOOTENV_RUN_EXTENSION_APPLY "run extension_apply; " 449#define BOOTENV_SET_EXTENSION_NEED_INIT \ 450 "extension_need_init=; " \ 451 "setenv extension_overlay_addr ${fdtoverlay_addr_r}; " 452#define BOOTENV_SHARED_EXTENSION \ 453 "extension_init=" \ 454 "echo Extension init...; " \ 455 "if ${extension_need_init}; then " \ 456 "extension_need_init=false; " \ 457 "extension scan; " \ 458 "fi\0" \ 459 \ 460 "extension_overlay_cmd=" \ 461 "load ${devtype} ${devnum}:${distro_bootpart} " \ 462 "${extension_overlay_addr} ${prefix}${extension_overlay_name}\0" \ 463 "extension_apply=" \ 464 "if fdt addr -q ${fdt_addr_r}; then " \ 465 "extension apply all; " \ 466 "fi\0" 467#else 468#define BOOTENV_RUN_EXTENSION_INIT 469#define BOOTENV_RUN_EXTENSION_APPLY 470#define BOOTENV_SET_EXTENSION_NEED_INIT 471#define BOOTENV_SHARED_EXTENSION 472#endif 473 474#define BOOTENV_DEV_NAME(devtypeu, devtypel, instance, ...) \ 475 BOOTENV_DEV_NAME_##devtypeu(devtypeu, devtypel, instance, ## __VA_ARGS__) 476#define BOOTENV_BOOT_TARGETS \ 477 "boot_targets=" BOOT_TARGET_DEVICES(BOOTENV_DEV_NAME) "\0" 478 479#define BOOTENV_DEV(devtypeu, devtypel, instance, ...) \ 480 BOOTENV_DEV_##devtypeu(devtypeu, devtypel, instance, ## __VA_ARGS__) 481#define BOOTENV \ 482 BOOTENV_SHARED_HOST \ 483 BOOTENV_SHARED_MMC \ 484 BOOTENV_SHARED_PCI \ 485 BOOTENV_SHARED_USB \ 486 BOOTENV_SHARED_SATA \ 487 BOOTENV_SHARED_SCSI \ 488 BOOTENV_SHARED_NVME \ 489 BOOTENV_SHARED_IDE \ 490 BOOTENV_SHARED_UBIFS \ 491 BOOTENV_SHARED_EFI \ 492 BOOTENV_SHARED_VIRTIO \ 493 BOOTENV_SHARED_EXTENSION \ 494 "boot_prefixes=/ /boot/\0" \ 495 "boot_scripts=boot.scr.uimg boot.scr\0" \ 496 "boot_script_dhcp=boot.scr.uimg\0" \ 497 BOOTENV_BOOT_TARGETS \ 498 \ 499 "boot_syslinux_conf=extlinux/extlinux.conf\0" \ 500 "boot_extlinux=" \ 501 "sysboot ${devtype} ${devnum}:${distro_bootpart} any " \ 502 "${scriptaddr} ${prefix}${boot_syslinux_conf}\0" \ 503 \ 504 "scan_dev_for_extlinux=" \ 505 "if test -e ${devtype} " \ 506 "${devnum}:${distro_bootpart} " \ 507 "${prefix}${boot_syslinux_conf}; then " \ 508 "echo Found ${prefix}${boot_syslinux_conf}; " \ 509 "run boot_extlinux; " \ 510 "echo EXTLINUX FAILED: continuing...; " \ 511 "fi\0" \ 512 \ 513 "boot_a_script=" \ 514 "load ${devtype} ${devnum}:${distro_bootpart} " \ 515 "${scriptaddr} ${prefix}${script}; " \ 516 "source ${scriptaddr}\0" \ 517 \ 518 "scan_dev_for_scripts=" \ 519 "for script in ${boot_scripts}; do " \ 520 "if test -e ${devtype} " \ 521 "${devnum}:${distro_bootpart} " \ 522 "${prefix}${script}; then " \ 523 "echo Found U-Boot script " \ 524 "${prefix}${script}; " \ 525 "run boot_a_script; " \ 526 "echo SCRIPT FAILED: continuing...; " \ 527 "fi; " \ 528 "done\0" \ 529 \ 530 "scan_dev_for_boot=" \ 531 "echo Scanning ${devtype} " \ 532 "${devnum}:${distro_bootpart}...; " \ 533 "for prefix in ${boot_prefixes}; do " \ 534 "run scan_dev_for_extlinux; " \ 535 "run scan_dev_for_scripts; " \ 536 "done;" \ 537 SCAN_DEV_FOR_EFI \ 538 "\0" \ 539 \ 540 "scan_dev_for_boot_part=" \ 541 "part list ${devtype} ${devnum} -bootable devplist; " \ 542 "env exists devplist || setenv devplist 1; " \ 543 "for distro_bootpart in ${devplist}; do " \ 544 "if fstype ${devtype} " \ 545 "${devnum}:${distro_bootpart} " \ 546 "bootfstype; then " \ 547 "part uuid ${devtype} " \ 548 "${devnum}:${distro_bootpart} " \ 549 "distro_bootpart_uuid ; " \ 550 "run scan_dev_for_boot; " \ 551 "fi; " \ 552 "done; " \ 553 "setenv devplist\0" \ 554 \ 555 BOOT_TARGET_DEVICES(BOOTENV_DEV) \ 556 \ 557 "distro_bootcmd=" BOOTENV_SET_SCSI_NEED_INIT \ 558 BOOTENV_SET_NVME_NEED_INIT \ 559 BOOTENV_SET_IDE_NEED_INIT \ 560 BOOTENV_SET_VIRTIO_NEED_INIT \ 561 BOOTENV_SET_EXTENSION_NEED_INIT \ 562 "for target in ${boot_targets}; do " \ 563 "run bootcmd_${target}; " \ 564 "done\0" 565 566#endif /* _CONFIG_CMD_DISTRO_BOOTCMD_H */ 567