uboot/include/config_distro_bootcmd.h
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2014
   3 * NVIDIA Corporation <www.nvidia.com>
   4 *
   5 * Copyright 2014 Red Hat, Inc.
   6 *
   7 * SPDX-License-Identifier:     GPL-2.0+
   8 */
   9
  10#ifndef _CONFIG_CMD_DISTRO_BOOTCMD_H
  11#define _CONFIG_CMD_DISTRO_BOOTCMD_H
  12
  13/*
  14 * A note on error handling: It is possible for BOOT_TARGET_DEVICES to
  15 * reference a device that is not enabled in the U-Boot configuration, e.g.
  16 * it may include MMC in the list without CONFIG_CMD_MMC being enabled. Given
  17 * that BOOT_TARGET_DEVICES is a macro that's expanded by the C pre-processor
  18 * at compile time, it's not  possible to detect and report such problems via
  19 * a simple #ifdef/#error combination. Still, the code needs to report errors.
  20 * The best way I've found to do this is to make BOOT_TARGET_DEVICES expand to
  21 * reference a non-existent symbol, and have the name of that symbol encode
  22 * the error message. Consequently, this file contains references to e.g.
  23 * BOOT_TARGET_DEVICES_references_MMC_without_CONFIG_CMD_MMC. Given the
  24 * prevalence of capitals here, this looks like a pre-processor macro and
  25 * hence seems like it should be all capitals, but it's really an error
  26 * message that includes some other pre-processor symbols in the text.
  27 */
  28
  29/* We need the part command */
  30#define CONFIG_PARTITION_UUIDS
  31#define CONFIG_CMD_PART
  32
  33#define BOOTENV_SHARED_BLKDEV_BODY(devtypel) \
  34                "if " #devtypel " dev ${devnum}; then " \
  35                        "setenv devtype " #devtypel "; " \
  36                        "run scan_dev_for_boot_part; " \
  37                "fi\0"
  38
  39#define BOOTENV_SHARED_BLKDEV(devtypel) \
  40        #devtypel "_boot=" \
  41        BOOTENV_SHARED_BLKDEV_BODY(devtypel)
  42
  43#define BOOTENV_DEV_BLKDEV(devtypeu, devtypel, instance) \
  44        "bootcmd_" #devtypel #instance "=" \
  45                "setenv devnum " #instance "; " \
  46                "run " #devtypel "_boot\0"
  47
  48#define BOOTENV_DEV_NAME_BLKDEV(devtypeu, devtypel, instance) \
  49        #devtypel #instance " "
  50
  51#ifdef CONFIG_SANDBOX
  52#define BOOTENV_SHARED_HOST     BOOTENV_SHARED_BLKDEV(host)
  53#define BOOTENV_DEV_HOST        BOOTENV_DEV_BLKDEV
  54#define BOOTENV_DEV_NAME_HOST   BOOTENV_DEV_NAME_BLKDEV
  55#else
  56#define BOOTENV_SHARED_HOST
  57#define BOOTENV_DEV_HOST \
  58        BOOT_TARGET_DEVICES_references_HOST_without_CONFIG_SANDBOX
  59#define BOOTENV_DEV_NAME_HOST \
  60        BOOT_TARGET_DEVICES_references_HOST_without_CONFIG_SANDBOX
  61#endif
  62
  63#ifdef CONFIG_CMD_MMC
  64#define BOOTENV_SHARED_MMC      BOOTENV_SHARED_BLKDEV(mmc)
  65#define BOOTENV_DEV_MMC         BOOTENV_DEV_BLKDEV
  66#define BOOTENV_DEV_NAME_MMC    BOOTENV_DEV_NAME_BLKDEV
  67#else
  68#define BOOTENV_SHARED_MMC
  69#define BOOTENV_DEV_MMC \
  70        BOOT_TARGET_DEVICES_references_MMC_without_CONFIG_CMD_MMC
  71#define BOOTENV_DEV_NAME_MMC \
  72        BOOT_TARGET_DEVICES_references_MMC_without_CONFIG_CMD_MMC
  73#endif
  74
  75#ifdef CONFIG_CMD_UBIFS
  76#define BOOTENV_SHARED_UBIFS \
  77        "ubifs_boot=" \
  78                "if ubi part UBI && ubifsmount ubi${devnum}:boot; then "  \
  79                        "setenv devtype ubi; "                            \
  80                        "setenv bootpart 0; "                             \
  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#endif
  99#endif
 100
 101#ifdef BOOTEFI_NAME
 102#if defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
 103/*
 104 * On 32bit ARM systems there is a reasonable number of systems that follow
 105 * the $soc-$board$boardver.dtb name scheme for their device trees. Use that
 106 * scheme if we don't have an explicit fdtfile variable.
 107 */
 108#define BOOTENV_EFI_SET_FDTFILE_FALLBACK                                  \
 109        "if test -z \"${fdtfile}\" -a -n \"${soc}\"; then "               \
 110          "setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; "           \
 111        "fi; "
 112#else
 113#define BOOTENV_EFI_SET_FDTFILE_FALLBACK
 114#endif
 115
 116
 117#define BOOTENV_SHARED_EFI                                                \
 118        "boot_efi_binary="                                                \
 119                "load ${devtype} ${devnum}:${distro_bootpart} "           \
 120                        "${kernel_addr_r} efi/boot/"BOOTEFI_NAME"; "      \
 121                "if fdt addr ${fdt_addr_r}; then "                        \
 122                        "bootefi ${kernel_addr_r} ${fdt_addr_r};"         \
 123                "else "                                                    \
 124                        "bootefi ${kernel_addr_r} ${fdtcontroladdr};"     \
 125                "fi\0"                                                    \
 126        \
 127        "load_efi_dtb="                                                   \
 128                "load ${devtype} ${devnum}:${distro_bootpart} "           \
 129                        "${fdt_addr_r} ${prefix}${efi_fdtfile}\0"         \
 130        \
 131        "efi_dtb_prefixes=/ /dtb/ /dtb/current/\0"                        \
 132        "scan_dev_for_efi="                                               \
 133                "setenv efi_fdtfile ${fdtfile}; "                         \
 134                BOOTENV_EFI_SET_FDTFILE_FALLBACK                          \
 135                "for prefix in ${efi_dtb_prefixes}; do "                  \
 136                        "if test -e ${devtype} "                          \
 137                                        "${devnum}:${distro_bootpart} "   \
 138                                        "${prefix}${efi_fdtfile}; then "  \
 139                                "run load_efi_dtb; "                      \
 140                        "fi;"                                             \
 141                "done;"                                                   \
 142                "if test -e ${devtype} ${devnum}:${distro_bootpart} "     \
 143                                        "efi/boot/"BOOTEFI_NAME"; then "  \
 144                                "echo Found EFI removable media binary "  \
 145                                        "efi/boot/"BOOTEFI_NAME"; "       \
 146                                "run boot_efi_binary; "                   \
 147                                "echo EFI LOAD FAILED: continuing...; "   \
 148                "fi; "                                                    \
 149                "setenv efi_fdtfile\0"
 150#define SCAN_DEV_FOR_EFI "run scan_dev_for_efi;"
 151#else
 152#define BOOTENV_SHARED_EFI
 153#define SCAN_DEV_FOR_EFI
 154#endif
 155
 156#ifdef CONFIG_CMD_SATA
 157#define BOOTENV_SHARED_SATA     BOOTENV_SHARED_BLKDEV(sata)
 158#define BOOTENV_DEV_SATA        BOOTENV_DEV_BLKDEV
 159#define BOOTENV_DEV_NAME_SATA   BOOTENV_DEV_NAME_BLKDEV
 160#else
 161#define BOOTENV_SHARED_SATA
 162#define BOOTENV_DEV_SATA \
 163        BOOT_TARGET_DEVICES_references_SATA_without_CONFIG_CMD_SATA
 164#define BOOTENV_DEV_NAME_SATA \
 165        BOOT_TARGET_DEVICES_references_SATA_without_CONFIG_CMD_SATA
 166#endif
 167
 168#ifdef CONFIG_SCSI
 169#define BOOTENV_RUN_SCSI_INIT "run scsi_init; "
 170#define BOOTENV_SET_SCSI_NEED_INIT "setenv scsi_need_init; "
 171#define BOOTENV_SHARED_SCSI \
 172        "scsi_init=" \
 173                "if ${scsi_need_init}; then " \
 174                        "setenv scsi_need_init false; " \
 175                        "scsi scan; " \
 176                "fi\0" \
 177        \
 178        "scsi_boot=" \
 179                BOOTENV_RUN_SCSI_INIT \
 180                BOOTENV_SHARED_BLKDEV_BODY(scsi)
 181#define BOOTENV_DEV_SCSI        BOOTENV_DEV_BLKDEV
 182#define BOOTENV_DEV_NAME_SCSI   BOOTENV_DEV_NAME_BLKDEV
 183#else
 184#define BOOTENV_RUN_SCSI_INIT
 185#define BOOTENV_SET_SCSI_NEED_INIT
 186#define BOOTENV_SHARED_SCSI
 187#define BOOTENV_DEV_SCSI \
 188        BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_SCSI
 189#define BOOTENV_DEV_NAME_SCSI \
 190        BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_SCSI
 191#endif
 192
 193#ifdef CONFIG_CMD_IDE
 194#define BOOTENV_SHARED_IDE      BOOTENV_SHARED_BLKDEV(ide)
 195#define BOOTENV_DEV_IDE         BOOTENV_DEV_BLKDEV
 196#define BOOTENV_DEV_NAME_IDE    BOOTENV_DEV_NAME_BLKDEV
 197#else
 198#define BOOTENV_SHARED_IDE
 199#define BOOTENV_DEV_IDE \
 200        BOOT_TARGET_DEVICES_references_IDE_without_CONFIG_CMD_IDE
 201#define BOOTENV_DEV_NAME_IDE \
 202        BOOT_TARGET_DEVICES_references_IDE_without_CONFIG_CMD_IDE
 203#endif
 204
 205#if defined(CONFIG_CMD_PCI_ENUM) || defined(CONFIG_DM_PCI)
 206#define BOOTENV_RUN_NET_PCI_ENUM "run boot_net_pci_enum; "
 207#define BOOTENV_SHARED_PCI \
 208        "boot_net_pci_enum=pci enum\0"
 209#else
 210#define BOOTENV_RUN_NET_PCI_ENUM
 211#define BOOTENV_SHARED_PCI
 212#endif
 213
 214#ifdef CONFIG_CMD_USB
 215#define BOOTENV_RUN_NET_USB_START "run boot_net_usb_start; "
 216#define BOOTENV_SHARED_USB \
 217        "boot_net_usb_start=usb start\0" \
 218        "usb_boot=" \
 219                "usb start; " \
 220                BOOTENV_SHARED_BLKDEV_BODY(usb)
 221#define BOOTENV_DEV_USB         BOOTENV_DEV_BLKDEV
 222#define BOOTENV_DEV_NAME_USB    BOOTENV_DEV_NAME_BLKDEV
 223#else
 224#define BOOTENV_RUN_NET_USB_START
 225#define BOOTENV_SHARED_USB
 226#define BOOTENV_DEV_USB \
 227        BOOT_TARGET_DEVICES_references_USB_without_CONFIG_CMD_USB
 228#define BOOTENV_DEV_NAME_USB \
 229        BOOT_TARGET_DEVICES_references_USB_without_CONFIG_CMD_USB
 230#endif
 231
 232#if defined(CONFIG_CMD_DHCP)
 233#if defined(CONFIG_EFI_LOADER)
 234#if defined(CONFIG_ARM64)
 235#define BOOTENV_EFI_PXE_ARCH "0xb"
 236#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00011:UNDI:003000"
 237#elif defined(CONFIG_ARM)
 238#define BOOTENV_EFI_PXE_ARCH "0xa"
 239#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00010:UNDI:003000"
 240#elif defined(CONFIG_X86)
 241/* Always assume we're running 64bit */
 242#define BOOTENV_EFI_PXE_ARCH "0x7"
 243#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00007:UNDI:003000"
 244#else
 245#error Please specify an EFI client identifier
 246#endif
 247
 248/*
 249 * Ask the dhcp server for an EFI binary. If we get one, check for a
 250 * device tree in the same folder. Then boot everything. If the file was
 251 * not an EFI binary, we just return from the bootefi command and continue.
 252 */
 253#define BOOTENV_EFI_RUN_DHCP \
 254        "setenv efi_fdtfile ${fdtfile}; "                                 \
 255        BOOTENV_EFI_SET_FDTFILE_FALLBACK                                  \
 256        "setenv efi_old_vci ${bootp_vci};"                                \
 257        "setenv efi_old_arch ${bootp_arch};"                              \
 258        "setenv bootp_vci " BOOTENV_EFI_PXE_VCI ";"                       \
 259        "setenv bootp_arch " BOOTENV_EFI_PXE_ARCH ";"                     \
 260        "if dhcp ${kernel_addr_r}; then "                                 \
 261                "tftpboot ${fdt_addr_r} dtb/${efi_fdtfile};"              \
 262                "if fdt addr ${fdt_addr_r}; then "                        \
 263                        "bootefi ${kernel_addr_r} ${fdt_addr_r}; "        \
 264                "else "                                                   \
 265                        "bootefi ${kernel_addr_r} ${fdtcontroladdr};"     \
 266                "fi;"                                                     \
 267        "fi;"                                                             \
 268        "setenv bootp_vci ${efi_old_vci};"                                \
 269        "setenv bootp_arch ${efi_old_arch};"                              \
 270        "setenv efi_fdtfile;"                                             \
 271        "setenv efi_old_arch;"                                            \
 272        "setenv efi_old_vci;"
 273#else
 274#define BOOTENV_EFI_RUN_DHCP
 275#endif
 276#define BOOTENV_DEV_DHCP(devtypeu, devtypel, instance) \
 277        "bootcmd_dhcp=" \
 278                BOOTENV_RUN_NET_USB_START \
 279                BOOTENV_RUN_NET_PCI_ENUM \
 280                "if dhcp ${scriptaddr} ${boot_script_dhcp}; then " \
 281                        "source ${scriptaddr}; " \
 282                "fi;" \
 283                BOOTENV_EFI_RUN_DHCP \
 284                "\0"
 285#define BOOTENV_DEV_NAME_DHCP(devtypeu, devtypel, instance) \
 286        "dhcp "
 287#else
 288#define BOOTENV_DEV_DHCP \
 289        BOOT_TARGET_DEVICES_references_DHCP_without_CONFIG_CMD_DHCP
 290#define BOOTENV_DEV_NAME_DHCP \
 291        BOOT_TARGET_DEVICES_references_DHCP_without_CONFIG_CMD_DHCP
 292#endif
 293
 294#if defined(CONFIG_CMD_DHCP) && defined(CONFIG_CMD_PXE)
 295#define BOOTENV_DEV_PXE(devtypeu, devtypel, instance) \
 296        "bootcmd_pxe=" \
 297                BOOTENV_RUN_NET_USB_START \
 298                BOOTENV_RUN_NET_PCI_ENUM \
 299                "dhcp; " \
 300                "if pxe get; then " \
 301                        "pxe boot; " \
 302                "fi\0"
 303#define BOOTENV_DEV_NAME_PXE(devtypeu, devtypel, instance) \
 304        "pxe "
 305#else
 306#define BOOTENV_DEV_PXE \
 307        BOOT_TARGET_DEVICES_references_PXE_without_CONFIG_CMD_DHCP_or_PXE
 308#define BOOTENV_DEV_NAME_PXE \
 309        BOOT_TARGET_DEVICES_references_PXE_without_CONFIG_CMD_DHCP_or_PXE
 310#endif
 311
 312#define BOOTENV_DEV_NAME(devtypeu, devtypel, instance) \
 313        BOOTENV_DEV_NAME_##devtypeu(devtypeu, devtypel, instance)
 314#define BOOTENV_BOOT_TARGETS \
 315        "boot_targets=" BOOT_TARGET_DEVICES(BOOTENV_DEV_NAME) "\0"
 316
 317#define BOOTENV_DEV(devtypeu, devtypel, instance) \
 318        BOOTENV_DEV_##devtypeu(devtypeu, devtypel, instance)
 319#define BOOTENV \
 320        BOOTENV_SHARED_HOST \
 321        BOOTENV_SHARED_MMC \
 322        BOOTENV_SHARED_PCI \
 323        BOOTENV_SHARED_USB \
 324        BOOTENV_SHARED_SATA \
 325        BOOTENV_SHARED_SCSI \
 326        BOOTENV_SHARED_IDE \
 327        BOOTENV_SHARED_UBIFS \
 328        BOOTENV_SHARED_EFI \
 329        "boot_prefixes=/ /boot/\0" \
 330        "boot_scripts=boot.scr.uimg boot.scr\0" \
 331        "boot_script_dhcp=boot.scr.uimg\0" \
 332        BOOTENV_BOOT_TARGETS \
 333        \
 334        "boot_extlinux="                                                  \
 335                "sysboot ${devtype} ${devnum}:${distro_bootpart} any "    \
 336                        "${scriptaddr} ${prefix}extlinux/extlinux.conf\0" \
 337        \
 338        "scan_dev_for_extlinux="                                          \
 339                "if test -e ${devtype} "                                  \
 340                                "${devnum}:${distro_bootpart} "           \
 341                                "${prefix}extlinux/extlinux.conf; then "  \
 342                        "echo Found ${prefix}extlinux/extlinux.conf; "    \
 343                        "run boot_extlinux; "                             \
 344                        "echo SCRIPT FAILED: continuing...; "             \
 345                "fi\0"                                                    \
 346        \
 347        "boot_a_script="                                                  \
 348                "load ${devtype} ${devnum}:${distro_bootpart} "           \
 349                        "${scriptaddr} ${prefix}${script}; "              \
 350                "source ${scriptaddr}\0"                                  \
 351        \
 352        "scan_dev_for_scripts="                                           \
 353                "for script in ${boot_scripts}; do "                      \
 354                        "if test -e ${devtype} "                          \
 355                                        "${devnum}:${distro_bootpart} "   \
 356                                        "${prefix}${script}; then "       \
 357                                "echo Found U-Boot script "               \
 358                                        "${prefix}${script}; "            \
 359                                "run boot_a_script; "                     \
 360                                "echo SCRIPT FAILED: continuing...; "     \
 361                        "fi; "                                            \
 362                "done\0"                                                  \
 363        \
 364        "scan_dev_for_boot="                                              \
 365                "echo Scanning ${devtype} "                               \
 366                                "${devnum}:${distro_bootpart}...; "       \
 367                "for prefix in ${boot_prefixes}; do "                     \
 368                        "run scan_dev_for_extlinux; "                     \
 369                        "run scan_dev_for_scripts; "                      \
 370                "done;"                                                   \
 371                SCAN_DEV_FOR_EFI                                          \
 372                "\0"                                                      \
 373        \
 374        "scan_dev_for_boot_part="                                         \
 375                "part list ${devtype} ${devnum} -bootable devplist; "     \
 376                "env exists devplist || setenv devplist 1; "              \
 377                "for distro_bootpart in ${devplist}; do "                 \
 378                        "if fstype ${devtype} "                           \
 379                                        "${devnum}:${distro_bootpart} "   \
 380                                        "bootfstype; then "               \
 381                                "run scan_dev_for_boot; "                 \
 382                        "fi; "                                            \
 383                "done\0"                                                  \
 384        \
 385        BOOT_TARGET_DEVICES(BOOTENV_DEV)                                  \
 386        \
 387        "distro_bootcmd=" BOOTENV_SET_SCSI_NEED_INIT                      \
 388                "for target in ${boot_targets}; do "                      \
 389                        "run bootcmd_${target}; "                         \
 390                "done\0"
 391
 392#ifndef CONFIG_BOOTCOMMAND
 393#define CONFIG_BOOTCOMMAND "run distro_bootcmd"
 394#endif
 395
 396#endif  /* _CONFIG_CMD_DISTRO_BOOTCMD_H */
 397