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_XPL_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_64) 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 #ifndef SCAN_DEV_FOR_BOOT_PARTS 198 #define SCAN_DEV_FOR_BOOT_PARTS \ 199 "part list ${devtype} ${devnum} -bootable devplist; " 200 #endif 201 202 #ifdef CONFIG_SATA 203 #define BOOTENV_SHARED_SATA BOOTENV_SHARED_BLKDEV(sata) 204 #define BOOTENV_DEV_SATA BOOTENV_DEV_BLKDEV 205 #define BOOTENV_DEV_NAME_SATA BOOTENV_DEV_NAME_BLKDEV 206 #elif defined(CONFIG_XPL_BUILD) 207 #define BOOTENV_SHARED_SATA 208 #define BOOTENV_DEV_SATA BOOTENV_DEV_BLKDEV_NONE 209 #define BOOTENV_DEV_NAME_SATA BOOTENV_DEV_NAME_BLKDEV_NONE 210 #else 211 #define BOOTENV_SHARED_SATA 212 #define BOOTENV_DEV_SATA \ 213 BOOT_TARGET_DEVICES_references_SATA_without_CONFIG_SATA 214 #define BOOTENV_DEV_NAME_SATA \ 215 BOOT_TARGET_DEVICES_references_SATA_without_CONFIG_SATA 216 #endif 217 218 #ifdef CONFIG_NVME 219 #define BOOTENV_RUN_NVME_INIT "run nvme_init; " 220 #define BOOTENV_SET_NVME_NEED_INIT "setenv nvme_need_init; " 221 #define BOOTENV_SHARED_NVME \ 222 "nvme_init=" \ 223 "if ${nvme_need_init}; then " \ 224 "setenv nvme_need_init false; " \ 225 "nvme scan; " \ 226 "fi\0" \ 227 \ 228 "nvme_boot=" \ 229 BOOTENV_RUN_PCI_ENUM \ 230 BOOTENV_RUN_NVME_INIT \ 231 BOOTENV_SHARED_BLKDEV_BODY(nvme) 232 #define BOOTENV_DEV_NVME BOOTENV_DEV_BLKDEV 233 #define BOOTENV_DEV_NAME_NVME BOOTENV_DEV_NAME_BLKDEV 234 #else 235 #define BOOTENV_RUN_NVME_INIT 236 #define BOOTENV_SET_NVME_NEED_INIT 237 #define BOOTENV_SHARED_NVME 238 #define BOOTENV_DEV_NVME \ 239 BOOT_TARGET_DEVICES_references_NVME_without_CONFIG_NVME 240 #define BOOTENV_DEV_NAME_NVME \ 241 BOOT_TARGET_DEVICES_references_NVME_without_CONFIG_NVME 242 #endif 243 244 #ifdef CONFIG_SCSI 245 #define BOOTENV_RUN_SCSI_INIT "run scsi_init; " 246 #define BOOTENV_SET_SCSI_NEED_INIT "scsi_need_init=; " 247 #define BOOTENV_SHARED_SCSI \ 248 "scsi_init=" \ 249 "if ${scsi_need_init}; then " \ 250 "scsi_need_init=false; " \ 251 "scsi scan; " \ 252 "fi\0" \ 253 \ 254 "scsi_boot=" \ 255 BOOTENV_RUN_PCI_ENUM \ 256 BOOTENV_RUN_SCSI_INIT \ 257 BOOTENV_SHARED_BLKDEV_BODY(scsi) 258 #define BOOTENV_DEV_SCSI BOOTENV_DEV_BLKDEV 259 #define BOOTENV_DEV_NAME_SCSI BOOTENV_DEV_NAME_BLKDEV 260 #else 261 #define BOOTENV_RUN_SCSI_INIT 262 #define BOOTENV_SET_SCSI_NEED_INIT 263 #define BOOTENV_SHARED_SCSI 264 #define BOOTENV_DEV_SCSI \ 265 BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_SCSI 266 #define BOOTENV_DEV_NAME_SCSI \ 267 BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_SCSI 268 #endif 269 270 #ifdef CONFIG_IDE 271 #define BOOTENV_RUN_IDE_INIT "run ide_init; " 272 #define BOOTENV_SET_IDE_NEED_INIT "setenv ide_need_init; " 273 #define BOOTENV_SHARED_IDE \ 274 "ide_init=" \ 275 "if ${ide_need_init}; then " \ 276 "setenv ide_need_init false; " \ 277 "ide reset; " \ 278 "fi\0" \ 279 \ 280 "ide_boot=" \ 281 BOOTENV_RUN_IDE_INIT \ 282 BOOTENV_SHARED_BLKDEV_BODY(ide) 283 #define BOOTENV_DEV_IDE BOOTENV_DEV_BLKDEV 284 #define BOOTENV_DEV_NAME_IDE BOOTENV_DEV_NAME_BLKDEV 285 #else 286 #define BOOTENV_RUN_IDE_INIT 287 #define BOOTENV_SET_IDE_NEED_INIT 288 #define BOOTENV_SHARED_IDE 289 #define BOOTENV_DEV_IDE \ 290 BOOT_TARGET_DEVICES_references_IDE_without_CONFIG_IDE 291 #define BOOTENV_DEV_NAME_IDE \ 292 BOOT_TARGET_DEVICES_references_IDE_without_CONFIG_IDE 293 #endif 294 295 #if defined(CONFIG_PCI) 296 #define BOOTENV_RUN_PCI_ENUM "run boot_pci_enum; " 297 #define BOOTENV_SHARED_PCI \ 298 "boot_pci_enum=pci enum\0" 299 #else 300 #define BOOTENV_RUN_PCI_ENUM 301 #define BOOTENV_SHARED_PCI 302 #endif 303 304 #ifdef CONFIG_CMD_USB 305 #define BOOTENV_RUN_NET_USB_START "run boot_net_usb_start; " 306 #define BOOTENV_SHARED_USB \ 307 "boot_net_usb_start=usb start\0" \ 308 "usb_boot=" \ 309 "usb start; " \ 310 BOOTENV_SHARED_BLKDEV_BODY(usb) 311 #define BOOTENV_DEV_USB BOOTENV_DEV_BLKDEV 312 #define BOOTENV_DEV_NAME_USB BOOTENV_DEV_NAME_BLKDEV 313 #elif defined(CONFIG_XPL_BUILD) 314 #define BOOTENV_RUN_NET_USB_START 315 #define BOOTENV_SHARED_USB 316 #define BOOTENV_DEV_USB BOOTENV_DEV_BLKDEV_NONE 317 #define BOOTENV_DEV_NAME_USB BOOTENV_DEV_NAME_BLKDEV_NONE 318 #else 319 #define BOOTENV_RUN_NET_USB_START 320 #define BOOTENV_SHARED_USB 321 #define BOOTENV_DEV_USB \ 322 BOOT_TARGET_DEVICES_references_USB_without_CONFIG_CMD_USB 323 #define BOOTENV_DEV_NAME_USB \ 324 BOOT_TARGET_DEVICES_references_USB_without_CONFIG_CMD_USB 325 #endif 326 327 #ifdef CONFIG_CMD_VIRTIO 328 #define BOOTENV_RUN_VIRTIO_INIT "run virtio_init; " 329 #define BOOTENV_SET_VIRTIO_NEED_INIT "virtio_need_init=; " 330 #define BOOTENV_SHARED_VIRTIO \ 331 "virtio_init=" \ 332 "if ${virtio_need_init}; then " \ 333 "virtio_need_init=false; " \ 334 "virtio scan; " \ 335 "fi\0" \ 336 \ 337 "virtio_boot=" \ 338 BOOTENV_RUN_PCI_ENUM \ 339 BOOTENV_RUN_VIRTIO_INIT \ 340 BOOTENV_SHARED_BLKDEV_BODY(virtio) 341 #define BOOTENV_DEV_VIRTIO BOOTENV_DEV_BLKDEV 342 #define BOOTENV_DEV_NAME_VIRTIO BOOTENV_DEV_NAME_BLKDEV 343 #else 344 #define BOOTENV_RUN_VIRTIO_INIT 345 #define BOOTENV_SET_VIRTIO_NEED_INIT 346 #define BOOTENV_SHARED_VIRTIO 347 #define BOOTENV_DEV_VIRTIO \ 348 BOOT_TARGET_DEVICES_references_VIRTIO_without_CONFIG_CMD_VIRTIO 349 #define BOOTENV_DEV_NAME_VIRTIO \ 350 BOOT_TARGET_DEVICES_references_VIRTIO_without_CONFIG_CMD_VIRTIO 351 #endif 352 353 #if defined(CONFIG_CMD_DHCP) 354 #if defined(CONFIG_EFI_LOADER) 355 /* http://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml */ 356 #if defined(CONFIG_ARM64) || defined(__aarch64__) 357 #define BOOTENV_EFI_PXE_ARCH "0xb" 358 #define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00011:UNDI:003000" 359 #elif defined(CONFIG_ARM) || defined(__arm__) 360 #define BOOTENV_EFI_PXE_ARCH "0xa" 361 #define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00010:UNDI:003000" 362 #elif defined(CONFIG_X86) || defined(__x86_64__) 363 #define BOOTENV_EFI_PXE_ARCH "0x7" 364 #define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00007:UNDI:003000" 365 #elif defined(__i386__) 366 #define BOOTENV_EFI_PXE_ARCH "0x6" 367 #define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00006:UNDI:003000" 368 #elif defined(CONFIG_ARCH_RV32I) || ((defined(__riscv) && __riscv_xlen == 32)) 369 #define BOOTENV_EFI_PXE_ARCH "0x19" 370 #define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00025:UNDI:003000" 371 #elif defined(CONFIG_ARCH_RV64I) || ((defined(__riscv) && __riscv_xlen == 64)) 372 #define BOOTENV_EFI_PXE_ARCH "0x1b" 373 #define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00027:UNDI:003000" 374 #elif defined(CONFIG_SANDBOX) 375 # error "sandbox EFI support is only supported on ARM and x86" 376 #else 377 #error Please specify an EFI client identifier 378 #endif 379 380 /* 381 * Ask the dhcp server for an EFI binary. If we get one, check for a 382 * device tree in the same folder. Then boot everything. If the file was 383 * not an EFI binary, we just return from the bootefi command and continue. 384 */ 385 #define BOOTENV_EFI_RUN_DHCP \ 386 "setenv efi_fdtfile ${fdtfile}; " \ 387 BOOTENV_EFI_SET_FDTFILE_FALLBACK \ 388 "setenv efi_old_vci ${bootp_vci};" \ 389 "setenv efi_old_arch ${bootp_arch};" \ 390 "setenv bootp_vci " BOOTENV_EFI_PXE_VCI ";" \ 391 "setenv bootp_arch " BOOTENV_EFI_PXE_ARCH ";" \ 392 "if dhcp ${kernel_addr_r}; then " \ 393 "tftpboot ${fdt_addr_r} dtb/${efi_fdtfile};" \ 394 "if fdt addr -q ${fdt_addr_r}; then " \ 395 "bootefi ${kernel_addr_r} ${fdt_addr_r}; " \ 396 "else " \ 397 "bootefi ${kernel_addr_r} ${fdtcontroladdr};" \ 398 "fi;" \ 399 "fi;" \ 400 "setenv bootp_vci ${efi_old_vci};" \ 401 "setenv bootp_arch ${efi_old_arch};" \ 402 "setenv efi_fdtfile;" \ 403 "setenv efi_old_arch;" \ 404 "setenv efi_old_vci;" 405 #else 406 #define BOOTENV_EFI_RUN_DHCP 407 #endif 408 #define BOOTENV_DEV_DHCP(devtypeu, devtypel, instance) \ 409 "bootcmd_dhcp=" \ 410 "devtype=" #devtypel "; " \ 411 BOOTENV_RUN_NET_USB_START \ 412 BOOTENV_RUN_PCI_ENUM \ 413 "if dhcp ${scriptaddr} ${boot_script_dhcp}; then " \ 414 "source ${scriptaddr}; " \ 415 "fi;" \ 416 BOOTENV_EFI_RUN_DHCP \ 417 "\0" 418 #define BOOTENV_DEV_NAME_DHCP(devtypeu, devtypel, instance) \ 419 "dhcp " 420 #elif defined(CONFIG_XPL_BUILD) 421 #define BOOTENV_DEV_DHCP BOOTENV_DEV_BLKDEV_NONE 422 #define BOOTENV_DEV_NAME_DHCP BOOTENV_DEV_NAME_BLKDEV_NONE 423 #else 424 #define BOOTENV_DEV_DHCP \ 425 BOOT_TARGET_DEVICES_references_DHCP_without_CONFIG_CMD_DHCP 426 #define BOOTENV_DEV_NAME_DHCP \ 427 BOOT_TARGET_DEVICES_references_DHCP_without_CONFIG_CMD_DHCP 428 #endif 429 430 #if defined(CONFIG_CMD_DHCP) && defined(CONFIG_CMD_PXE) 431 #define BOOTENV_DEV_PXE(devtypeu, devtypel, instance) \ 432 "bootcmd_pxe=" \ 433 BOOTENV_RUN_NET_USB_START \ 434 BOOTENV_RUN_PCI_ENUM \ 435 "dhcp; " \ 436 "if pxe get; then " \ 437 "pxe boot; " \ 438 "fi\0" 439 #define BOOTENV_DEV_NAME_PXE(devtypeu, devtypel, instance) \ 440 "pxe " 441 #elif defined(CONFIG_XPL_BUILD) 442 #define BOOTENV_DEV_PXE BOOTENV_DEV_BLKDEV_NONE 443 #define BOOTENV_DEV_NAME_PXE BOOTENV_DEV_NAME_BLKDEV_NONE 444 #else 445 #define BOOTENV_DEV_PXE \ 446 BOOT_TARGET_DEVICES_references_PXE_without_CONFIG_CMD_DHCP_or_PXE 447 #define BOOTENV_DEV_NAME_PXE \ 448 BOOT_TARGET_DEVICES_references_PXE_without_CONFIG_CMD_DHCP_or_PXE 449 #endif 450 451 #if defined(CONFIG_CMD_EXTENSION) 452 #define BOOTENV_RUN_EXTENSION_INIT "run extension_init; " 453 #define BOOTENV_RUN_EXTENSION_APPLY "run extension_apply; " 454 #define BOOTENV_SET_EXTENSION_NEED_INIT \ 455 "extension_need_init=; " \ 456 "setenv extension_overlay_addr ${fdtoverlay_addr_r}; " 457 #define BOOTENV_SHARED_EXTENSION \ 458 "extension_init=" \ 459 "echo Extension init...; " \ 460 "if ${extension_need_init}; then " \ 461 "extension_need_init=false; " \ 462 "extension scan; " \ 463 "fi\0" \ 464 \ 465 "extension_overlay_cmd=" \ 466 "load ${devtype} ${devnum}:${distro_bootpart} " \ 467 "${extension_overlay_addr} ${prefix}${extension_overlay_name}\0" \ 468 "extension_apply=" \ 469 "if fdt addr -q ${fdt_addr_r}; then " \ 470 "extension apply all; " \ 471 "fi\0" 472 #else 473 #define BOOTENV_RUN_EXTENSION_INIT 474 #define BOOTENV_RUN_EXTENSION_APPLY 475 #define BOOTENV_SET_EXTENSION_NEED_INIT 476 #define BOOTENV_SHARED_EXTENSION 477 #endif 478 479 #define BOOTENV_DEV_NAME(devtypeu, devtypel, instance, ...) \ 480 BOOTENV_DEV_NAME_##devtypeu(devtypeu, devtypel, instance, ## __VA_ARGS__) 481 #define BOOTENV_BOOT_TARGETS \ 482 "boot_targets=" BOOT_TARGET_DEVICES(BOOTENV_DEV_NAME) "\0" 483 484 #define BOOTENV_DEV(devtypeu, devtypel, instance, ...) \ 485 BOOTENV_DEV_##devtypeu(devtypeu, devtypel, instance, ## __VA_ARGS__) 486 #define BOOTENV \ 487 BOOTENV_SHARED_HOST \ 488 BOOTENV_SHARED_MMC \ 489 BOOTENV_SHARED_PCI \ 490 BOOTENV_SHARED_USB \ 491 BOOTENV_SHARED_SATA \ 492 BOOTENV_SHARED_SCSI \ 493 BOOTENV_SHARED_NVME \ 494 BOOTENV_SHARED_IDE \ 495 BOOTENV_SHARED_UBIFS \ 496 BOOTENV_SHARED_EFI \ 497 BOOTENV_SHARED_VIRTIO \ 498 BOOTENV_SHARED_EXTENSION \ 499 "boot_prefixes=/ /boot/\0" \ 500 "boot_scripts=boot.scr.uimg boot.scr\0" \ 501 "boot_script_dhcp=boot.scr.uimg\0" \ 502 BOOTENV_BOOT_TARGETS \ 503 \ 504 "boot_syslinux_conf=extlinux/extlinux.conf\0" \ 505 "boot_extlinux=" \ 506 "sysboot ${devtype} ${devnum}:${distro_bootpart} any " \ 507 "${scriptaddr} ${prefix}${boot_syslinux_conf}\0" \ 508 \ 509 "scan_dev_for_extlinux=" \ 510 "if test -e ${devtype} " \ 511 "${devnum}:${distro_bootpart} " \ 512 "${prefix}${boot_syslinux_conf}; then " \ 513 "echo Found ${prefix}${boot_syslinux_conf}; " \ 514 "run boot_extlinux; " \ 515 "echo EXTLINUX FAILED: continuing...; " \ 516 "fi\0" \ 517 \ 518 "boot_a_script=" \ 519 "load ${devtype} ${devnum}:${distro_bootpart} " \ 520 "${scriptaddr} ${prefix}${script}; " \ 521 "source ${scriptaddr}\0" \ 522 \ 523 "scan_dev_for_scripts=" \ 524 "for script in ${boot_scripts}; do " \ 525 "if test -e ${devtype} " \ 526 "${devnum}:${distro_bootpart} " \ 527 "${prefix}${script}; then " \ 528 "echo Found U-Boot script " \ 529 "${prefix}${script}; " \ 530 "run boot_a_script; " \ 531 "echo SCRIPT FAILED: continuing...; " \ 532 "fi; " \ 533 "done\0" \ 534 \ 535 "scan_dev_for_boot=" \ 536 "echo Scanning ${devtype} " \ 537 "${devnum}:${distro_bootpart}...; " \ 538 "for prefix in ${boot_prefixes}; do " \ 539 "run scan_dev_for_extlinux; " \ 540 "run scan_dev_for_scripts; " \ 541 "done;" \ 542 SCAN_DEV_FOR_EFI \ 543 "\0" \ 544 \ 545 "scan_dev_for_boot_part=" \ 546 SCAN_DEV_FOR_BOOT_PARTS \ 547 "env exists devplist || setenv devplist 1; " \ 548 "for distro_bootpart in ${devplist}; do " \ 549 "if fstype ${devtype} " \ 550 "${devnum}:${distro_bootpart} " \ 551 "bootfstype; then " \ 552 "part uuid ${devtype} " \ 553 "${devnum}:${distro_bootpart} " \ 554 "distro_bootpart_uuid ; " \ 555 "run scan_dev_for_boot; " \ 556 "fi; " \ 557 "done; " \ 558 "setenv devplist\0" \ 559 \ 560 BOOT_TARGET_DEVICES(BOOTENV_DEV) \ 561 \ 562 "distro_bootcmd=" BOOTENV_SET_SCSI_NEED_INIT \ 563 BOOTENV_SET_NVME_NEED_INIT \ 564 BOOTENV_SET_IDE_NEED_INIT \ 565 BOOTENV_SET_VIRTIO_NEED_INIT \ 566 BOOTENV_SET_EXTENSION_NEED_INIT \ 567 "for target in ${boot_targets}; do " \ 568 "run bootcmd_${target}; " \ 569 "done\0" 570 571 #endif /* _CONFIG_CMD_DISTRO_BOOTCMD_H */ 572