Commit ffb4f6f95a0b63a0e8eab81e006a26c9cd99ac5d

Authored by Dennis Gilmore
Committed by Tom Rini
1 parent ef2d17fe21

add README.distro file

Add documentation on how to setup a system to use the generic distro
configs and boot commands. This spells out what is needed to make a
system conformant, but does not limit the board to only the defaults.

Signed-off-by: Dennis Gilmore <dennis@ausil.us>
[swarren, added concept, user config, BOOT_TARGET_DEVICES sections.
edited the rest]
Signed-off-by: Stephen Warren <swarren@nvidia.com>

Showing 1 changed file with 341 additions and 0 deletions Side-by-side Diff

  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.