Dennis Gilmore | ffb4f6f | 2015-01-22 11:34:20 -0700 | [diff] [blame] | 1 | /* |
| 2 | * (C) Copyright 2014 Red Hat Inc. |
| 3 | * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. |
| 4 | * |
| 5 | * SPDX-License-Identifier: GPL-2.0+ |
| 6 | */ |
| 7 | |
| 8 | Generic Distro Configuration Concept |
| 9 | ==================================== |
| 10 | |
| 11 | Linux distributions are faced with supporting a variety of boot mechanisms, |
| 12 | environments or bootloaders (PC BIOS, EFI, U-Boot, Barebox, ...). This makes |
| 13 | life complicated. Worse, bootloaders such as U-Boot have a configurable set |
| 14 | of features, and each board chooses to enable a different set of features. |
| 15 | Hence, distros typically need to have board-specific knowledge in order to |
| 16 | set up a bootable system. |
| 17 | |
| 18 | This document defines a common set of U-Boot features that are required for |
| 19 | a distro to support the board in a generic fashion. Any board wishing to |
| 20 | allow distros to install and boot in an out-of-the-box fashion should enable |
| 21 | all these features. Linux distros can then create a single set of boot |
| 22 | support/install logic that targets these features. This will allow distros |
| 23 | to install on many boards without the need for board-specific logic. |
| 24 | |
| 25 | In fact, some of these features can be implemented by any bootloader, thus |
| 26 | decoupling distro install/boot logic from any knowledge of the bootloader. |
| 27 | |
| 28 | This model assumes that boards will load boot configuration files from a |
| 29 | regular storage mechanism (eMMC, SD card, USB Disk, SATA disk, etc.) with |
| 30 | a standard partitioning scheme (MBR, GPT). Boards that cannnot support this |
| 31 | storage model are outside the scope of this document, and may still need |
| 32 | board-specific installer/boot-configuration support in a distro. |
| 33 | |
| 34 | To some extent, this model assumes that a board has a separate boot flash |
| 35 | that contains U-Boot, and that the user has somehow installed U-Boot to this |
| 36 | flash before running the distro installer. Even on boards that do not conform |
| 37 | to this aspect of the model, the extent of the board-specific support in the |
| 38 | distro installer logic would be to install a board-specific U-Boot package to |
| 39 | the boot partition partition during installation. This distro-supplied U-Boot |
| 40 | can still implement the same features as on any other board, and hence the |
| 41 | distro's boot configuration file generation logic can still be board-agnostic. |
| 42 | |
| 43 | Locating Bootable Disks |
| 44 | ----------------------- |
| 45 | |
| 46 | Typical desktop/server PCs search all (or a user-defined subset of) attached |
| 47 | storage devices for a bootable partition, then load the bootloader or boot |
| 48 | configuration files from there. A U-Boot board port that enables the features |
| 49 | mentioned in this document will search for boot configuration files in the |
| 50 | same way. |
| 51 | |
| 52 | Thus, distros do not need to manipulate any kind of bootloader-specific |
| 53 | configuration data to indicate which storage device the system should boot |
| 54 | from. |
| 55 | |
| 56 | Distros simply need to install the boot configuration files (see next |
| 57 | section) in an ext2/3/4 or FAT partition, mark the partition bootable (via |
| 58 | the MBR bootable flag, or GPT legacy_bios_bootable attribute), and U-Boot (or |
| 59 | any other bootloader) will find those boot files and execute them. This is |
| 60 | conceptually identical to creating a grub2 configuration file on a desktop |
| 61 | PC. |
| 62 | |
| 63 | Note that in the absense of any partition that is explicitly marked bootable, |
| 64 | U-Boot falls back to searching the first valid partition of a disk for boot |
| 65 | configuration files. Other bootloaders are recommended to do the same, since |
| 66 | I believe that partition table bootable flags aren't so commonly used outside |
| 67 | the realm of x86 PCs. |
| 68 | |
| 69 | U-Boot can also search for boot configuration files from a TFTP server. |
| 70 | |
| 71 | Boot Configuration Files |
| 72 | ------------------------ |
| 73 | |
| 74 | The standard format for boot configuration files is that of extlinux.conf, as |
| 75 | handled by U-Boot's "syslinux" (disk) or "pxe boot" (network). This is roughly |
| 76 | as specified at: |
| 77 | |
| 78 | http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/ |
| 79 | |
| 80 | ... with the exceptions that the BootLoaderSpec document: |
| 81 | |
| 82 | * Prescribes a separate configuration per boot menu option, whereas U-Boot |
| 83 | lumps all options into a single extlinux.conf file. Hence, U-Boot searches |
| 84 | for /extlinux/extlinux.conf then /boot/extlinux/extlinux.conf on disk, or |
| 85 | pxelinux.cfg/default over the network. |
| 86 | |
| 87 | * Does not document the fdtdir option, which automatically selects the DTB to |
| 88 | pass to the kernel. |
| 89 | |
| 90 | One example extlinux.conf generated by the Fedora installer is: |
| 91 | |
| 92 | ------------------------------------------------------------ |
| 93 | # extlinux.conf generated by anaconda |
| 94 | |
| 95 | ui menu.c32 |
| 96 | |
| 97 | menu autoboot Welcome to Fedora. Automatic boot in # second{,s}. Press a key for options. |
| 98 | menu title Fedora Boot Options. |
| 99 | menu hidden |
| 100 | |
| 101 | timeout 50 |
| 102 | #totaltimeout 9000 |
| 103 | |
| 104 | default Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae) 22 (Rawhide) |
| 105 | |
| 106 | label Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl) 22 (Rawhide) |
| 107 | kernel /boot/vmlinuz-3.17.0-0.rc4.git2.1.fc22.armv7hl |
| 108 | append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8 LANG=en_US.UTF-8 drm.debug=0xf |
| 109 | fdtdir /boot/dtb-3.17.0-0.rc4.git2.1.fc22.armv7hl |
| 110 | initrd /boot/initramfs-3.17.0-0.rc4.git2.1.fc22.armv7hl.img |
| 111 | |
| 112 | label Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae) 22 (Rawhide) |
| 113 | kernel /boot/vmlinuz-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae |
| 114 | append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8 LANG=en_US.UTF-8 drm.debug=0xf |
| 115 | fdtdir /boot/dtb-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae |
| 116 | initrd /boot/initramfs-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae.img |
| 117 | |
| 118 | label Fedora-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc (0-rescue-8f6ba7b039524e0eb957d2c9203f04bc) |
| 119 | kernel /boot/vmlinuz-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc |
| 120 | initrd /boot/initramfs-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc.img |
| 121 | append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8 |
| 122 | fdtdir /boot/dtb-3.16.0-0.rc6.git1.1.fc22.armv7hl+lpae |
| 123 | ------------------------------------------------------------ |
| 124 | |
| 125 | Another hand-crafted network boot configuration file is: |
| 126 | |
| 127 | ------------------------------------------------------------ |
| 128 | TIMEOUT 100 |
| 129 | |
| 130 | MENU TITLE TFTP boot options |
| 131 | |
| 132 | LABEL jetson-tk1-emmc |
| 133 | MENU LABEL ../zImage root on Jetson TK1 eMMC |
| 134 | LINUX ../zImage |
| 135 | FDTDIR ../ |
| 136 | APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=80a5a8e9-c744-491a-93c1-4f4194fd690b |
| 137 | |
| 138 | LABEL venice2-emmc |
| 139 | MENU LABEL ../zImage root on Venice2 eMMC |
| 140 | LINUX ../zImage |
| 141 | FDTDIR ../ |
| 142 | APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=5f71e06f-be08-48ed-b1ef-ee4800cc860f |
| 143 | |
| 144 | LABEL sdcard |
| 145 | MENU LABEL ../zImage, root on 2GB sdcard |
| 146 | LINUX ../zImage |
| 147 | FDTDIR ../ |
| 148 | APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=b2f82cda-2535-4779-b467-094a210fbae7 |
| 149 | |
| 150 | LABEL fedora-installer-fk |
| 151 | MENU LABEL Fedora installer w/ Fedora kernel |
| 152 | LINUX fedora-installer/vmlinuz |
| 153 | INITRD fedora-installer/initrd.img.orig |
| 154 | FDTDIR fedora-installer/dtb |
| 155 | APPEND loglevel=8 ip=dhcp inst.repo=http://10.0.0.2/mirrors/fedora/linux/development/rawhide/armhfp/os/ rd.shell cma=64M |
| 156 | ------------------------------------------------------------ |
| 157 | |
| 158 | U-Boot Implementation |
| 159 | ===================== |
| 160 | |
| 161 | Enabling the distro options |
| 162 | --------------------------- |
| 163 | |
| 164 | In your board configuration file, include the following: |
| 165 | |
| 166 | ------------------------------------------------------------ |
| 167 | #ifndef CONFIG_SPL_BUILD |
| 168 | #include <config_distro_defaults.h> |
| 169 | #include <config_distro_bootcmd.h> |
| 170 | #endif |
| 171 | ------------------------------------------------------------ |
| 172 | |
| 173 | The first of those headers primarily enables a core set of U-Boot features, |
| 174 | such as support for MBR and GPT partitions, ext* and FAT filesystems, booting |
| 175 | raw zImage and initrd (rather than FIT- or uImage-wrapped files), etc. Network |
| 176 | boot support is also enabled here, which is useful in order to boot distro |
| 177 | installers given that distros do not commonly distribute bootable install |
| 178 | media for non-PC targets at present. |
| 179 | |
| 180 | Finally, a few options that are mostly relevant only when using U-Boot- |
| 181 | specific boot.scr scripts are enabled. This enables distros to generate a |
| 182 | U-Boot-specific boot.scr script rather than extlinux.conf as the boot |
| 183 | configuration file. While doing so is fully supported, and |
| 184 | <config_distro_defaults.h> exposes enough parameterization to boot.scr to |
| 185 | allow for board-agnostic boot.scr content, this document recommends that |
| 186 | distros generate extlinux.conf rather than boot.scr. extlinux.conf is intended |
| 187 | to work across multiple bootloaders, whereas boot.scr will only work with |
| 188 | U-Boot. TODO: document the contract between U-Boot and boot.scr re: which |
| 189 | environment variables a generic boot.scr may rely upon. |
| 190 | |
| 191 | The second of those headers sets up the default environment so that $bootcmd |
| 192 | is defined in a way that searches attached disks for boot configuration files, |
| 193 | and executes them if found. |
| 194 | |
| 195 | Required Environment Variables |
| 196 | ------------------------------ |
| 197 | |
| 198 | The U-Boot "syslinux" and "pxe boot" commands require a number of environment |
| 199 | variables be set. Default values for these variables are often hard-coded into |
| 200 | CONFIG_EXTRA_ENV_SETTINGS in the board's U-Boot configuration file, so that |
| 201 | the user doesn't have to configure them. |
| 202 | |
| 203 | fdt_addr: |
| 204 | |
| 205 | Mandatory for any system that provides the DTB in HW (e.g. ROM) and wishes |
| 206 | to pass that DTB to Linux, rather than loading a DTB from the boot |
| 207 | filesystem. Prohibited for any other system. |
| 208 | |
| 209 | If specified a DTB to boot the system must be available at the given |
| 210 | address. |
| 211 | |
| 212 | fdt_addr_r: |
| 213 | |
| 214 | Mandatory. The location in RAM where the DTB will be loaded or copied to when |
| 215 | processing the fdtdir/devicetreedir or fdt/devicetree options in |
| 216 | extlinux.conf. |
| 217 | |
| 218 | This is mandatory even when fdt_addr is provided, since extlinux.conf must |
| 219 | always be able to provide a DTB which overrides any copy provided by the HW. |
| 220 | |
| 221 | A size of 1MB for the FDT/DTB seems reasonable. |
| 222 | |
| 223 | ramdisk_addr_r: |
| 224 | |
| 225 | Mandatory. The location in RAM where the initial ramdisk will be loaded to |
| 226 | when processing the initrd option in extlinux.conf. |
| 227 | |
| 228 | It is recommended that this location be highest in RAM out of fdt_addr_, |
| 229 | kernel_addr_r, and ramdisk_addr_r, so that the RAM disk can vary in size |
| 230 | and use any available RAM. |
| 231 | |
| 232 | kernel_addr_r: |
| 233 | |
| 234 | Mandatory. The location in RAM where the kernel will be loaded to when |
| 235 | processing the kernel option in the extlinux.conf. |
| 236 | |
| 237 | The kernel should be located within the first 128M of RAM in order for the |
| 238 | kernel CONFIG_AUTO_ZRELADDR option to work, which is likely enabled on any |
| 239 | distro kernel. Since the kernel will decompress itself to 0x8000 after the |
| 240 | start of RAM, kernel_addr_rshould not overlap that area, or the kernel will |
| 241 | have to copy itself somewhere else first before decompression. |
| 242 | |
| 243 | A size of 16MB for the kernel is likely adequate. |
| 244 | |
| 245 | pxe_addr_r: |
| 246 | |
| 247 | Mandatory. The location in RAM where extlinux.conf will be loaded to prior |
| 248 | to processing. |
| 249 | |
| 250 | A size of 1MB for extlinux.conf is more than adequate. |
| 251 | |
| 252 | scriptaddr: |
| 253 | |
| 254 | Mandatory, if the boot script is boot.scr rather than extlinux.conf. The |
| 255 | location in RAM where boot.scr will be loaded to prior to execution. |
| 256 | |
| 257 | A size of 1MB for extlinux.conf is more than adequate. |
| 258 | |
| 259 | For suggestions on memory locations for ARM systems, you must follow the |
| 260 | guidelines specified in Documentation/arm/Booting in the Linux kernel tree. |
| 261 | |
| 262 | For a commented example of setting these values, please see the definition of |
| 263 | MEM_LAYOUT_ENV_SETTINGS in include/configs/tegra124-common.h. |
| 264 | |
| 265 | Boot Target Configuration |
| 266 | ------------------------- |
| 267 | |
| 268 | <config_distro_bootcmd.h> defines $bootcmd and many helper command variables |
| 269 | that automatically search attached disks for boot configuration files and |
| 270 | execute them. Boards must provide configure <config_distro_bootcmd.h> so that |
| 271 | it supports the correct set of possible boot device types. To provide this |
| 272 | configuration, simply define macro BOOT_TARGET_DEVICES prior to including |
| 273 | <config_distro_bootcmd.h>. For example: |
| 274 | |
| 275 | ------------------------------------------------------------ |
| 276 | #ifndef CONFIG_SPL_BUILD |
| 277 | #define BOOT_TARGET_DEVICES(func) \ |
| 278 | func(MMC, mmc, 1) \ |
| 279 | func(MMC, mmc, 0) \ |
| 280 | func(USB, usb, 0) \ |
| 281 | func(PXE, pxe, na) \ |
| 282 | func(DHCP, dhcp, na) |
| 283 | #include <config_distro_bootcmd.h> |
| 284 | #endif |
| 285 | ------------------------------------------------------------ |
| 286 | |
| 287 | Each entry in the macro defines a single boot device (e.g. a specific eMMC |
| 288 | device or SD card) or type of boot device (e.g. USB disk). The parameters to |
| 289 | the func macro (passed in by the internal implementation of the header) are: |
| 290 | |
| 291 | - Upper-case disk type (MMC, SATA, SCSI, IDE, USB, DHCP, PXE). |
| 292 | - Lower-case disk type (same options as above). |
| 293 | - ID of the specific disk (MMC only) or ignored for other types. |
| 294 | |
| 295 | User Configuration |
| 296 | ================== |
| 297 | |
| 298 | Once the user has installed U-Boot, it is expected that the environment will |
| 299 | be reset to the default values in order to enable $bootcmd and friends, as set |
| 300 | up by <config_distro_bootcmd.h>. After this, various environment variables may |
| 301 | be altered to influence the boot process: |
| 302 | |
| 303 | boot_targets: |
| 304 | |
| 305 | The list of boot locations searched. |
| 306 | |
| 307 | Example: mmc0, mmc1, usb, pxe |
| 308 | |
| 309 | Entries may be removed or re-ordered in this list to affect the boot order. |
| 310 | |
| 311 | boot_prefixes: |
| 312 | |
| 313 | For disk-based booting, the list of directories within a partition that are |
| 314 | searched for boot configuration files (extlinux.conf, boot.scr). |
| 315 | |
| 316 | Example: / /boot/ |
| 317 | |
| 318 | Entries may be removed or re-ordered in this list to affect the set of |
| 319 | directories which are searched. |
| 320 | |
| 321 | boot_scripts: |
| 322 | |
| 323 | The name of U-Boot style boot.scr files that $bootcmd searches for. |
| 324 | |
| 325 | Example: boot.scr.uimg boot.scr |
| 326 | |
| 327 | (Typically we expect extlinux.conf to be used, but execution of boot.scr is |
| 328 | maintained for backwards-compatibility.) |
| 329 | |
| 330 | Entries may be removed or re-ordered in this list to affect the set of |
| 331 | filenames which are supported. |
| 332 | |
| 333 | scan_dev_for_extlinux: |
| 334 | |
| 335 | If you want to disable extlinux.conf on all disks, set the value to something |
| 336 | innocuous, e.g. setenv scan_dev_for_extlinux true. |
| 337 | |
| 338 | scan_dev_for_scripts: |
| 339 | |
| 340 | If you want to disable boot.scr on all disks, set the value to something |
| 341 | innocuous, e.g. setenv scan_dev_for_scripts true. |