| /* | 
|  * Copyright 2010-2011 Calxeda, Inc. | 
|  * | 
|  * SPDX-License-Identifier:    GPL-2.0+ | 
|  */ | 
|   | 
| The 'pxe' commands provide a near subset of the functionality provided by | 
| the PXELINUX boot loader. This allows U-Boot based systems to be controlled | 
| remotely using the same PXE based techniques that many non U-Boot based servers | 
| use. | 
|   | 
| Commands | 
| ======== | 
|   | 
| pxe get | 
| ------- | 
|      syntax: pxe get | 
|   | 
|      follows PXELINUX's rules for retrieving configuration files from a tftp | 
|      server, and supports a subset of PXELINUX's config file syntax. | 
|   | 
|      Environment | 
|      ----------- | 
|      'pxe get' requires two environment variables to be set: | 
|   | 
|      pxefile_addr_r - should be set to a location in RAM large enough to hold | 
|      pxe files while they're being processed. Up to 16 config files may be | 
|      held in memory at once. The exact number and size of the files varies with | 
|      how the system is being used. A typical config file is a few hundred bytes | 
|      long. | 
|   | 
|      bootfile,serverip - these two are typically set in the DHCP response | 
|      handler, and correspond to fields in the DHCP response. | 
|   | 
|      'pxe get' optionally supports these two environment variables being set: | 
|   | 
|      ethaddr - this is the standard MAC address for the ethernet adapter in use. | 
|      'pxe get' uses it to look for a configuration file specific to a system's | 
|      MAC address. | 
|   | 
|      pxeuuid - this is a UUID in standard form using lower case hexadecimal | 
|      digits, for example, 550e8400-e29b-41d4-a716-446655440000. 'pxe get' uses | 
|      it to look for a configuration file based on the system's UUID. | 
|   | 
|      File Paths | 
|      ---------- | 
|      'pxe get' repeatedly tries to download config files until it either | 
|      successfully downloads one or runs out of paths to try. The order and | 
|      contents of paths it tries mirrors exactly that of PXELINUX - you can | 
|      read in more detail about it at: | 
|   | 
|      http://syslinux.zytor.com/wiki/index.php/Doc/pxelinux | 
|   | 
| pxe boot | 
| -------- | 
|      syntax: pxe boot [pxefile_addr_r] | 
|   | 
|      Interprets a pxe file stored in memory. | 
|   | 
|      pxefile_addr_r is an optional argument giving the location of the pxe file. | 
|      The file must be terminated with a NUL byte. | 
|   | 
|      Environment | 
|      ----------- | 
|      There are some environment variables that may need to be set, depending | 
|      on conditions. | 
|   | 
|      pxefile_addr_r - if the optional argument pxefile_addr_r is not supplied, | 
|      an environment variable named pxefile_addr_r must be supplied. This is | 
|      typically the same value as is used for the 'pxe get' command. | 
|   | 
|      bootfile - typically set in the DHCP response handler based on the | 
|      same field in the DHCP respone, this path is used to generate the base | 
|      directory that all other paths to files retrieved by 'pxe boot' will use. | 
|      If no bootfile is specified, paths used in pxe files will be used as is. | 
|   | 
|      serverip - typically set in the DHCP response handler, this is the IP | 
|      address of the tftp server from which other files will be retrieved. | 
|   | 
|      kernel_addr_r, initrd_addr_r - locations in RAM at which 'pxe boot' will | 
|      store the kernel(or FIT image) and initrd it retrieves from tftp. These | 
|      locations will be passed to the bootm command to boot the kernel. These | 
|      environment variables are required to be set. | 
|   | 
|      fdt_addr_r - location in RAM at which 'pxe boot' will store the fdt blob it | 
|      retrieves from tftp. The retrieval is possible if 'fdt' label is defined in | 
|      pxe file and 'fdt_addr_r' is set. If retrieval is possible, 'fdt_addr_r' | 
|      will be passed to bootm command to boot the kernel. | 
|   | 
|      fdt_addr - the location of a fdt blob. 'fdt_addr' will be passed to bootm | 
|      command if it is set and 'fdt_addr_r' is not passed to bootm command. | 
|   | 
| pxe file format | 
| =============== | 
| The pxe file format is nearly a subset of the PXELINUX file format; see | 
| http://syslinux.zytor.com/wiki/index.php/PXELINUX. It's composed of one line | 
| commands - global commands, and commands specific to labels. Lines begining | 
| with # are treated as comments. White space between and at the beginning of | 
| lines is ignored. | 
|   | 
| The size of pxe files and the number of labels is only limited by the amount | 
| of RAM available to U-Boot. Memory for labels is dynamically allocated as | 
| they're parsed, and memory for pxe files is statically allocated, and its | 
| location is given by the pxefile_addr_r environment variable. The pxe code is | 
| not aware of the size of the pxefile memory and will outgrow it if pxe files | 
| are too large. | 
|   | 
| Supported global commands | 
| ------------------------- | 
| Unrecognized commands are ignored. | 
|   | 
| default <label>        - the label named here is treated as the default and is | 
|               the first label 'pxe boot' attempts to boot. | 
|   | 
| menu title <string> - sets a title for the menu of labels being displayed. | 
|   | 
| menu include <path> - use tftp to retrieve the pxe file at <path>, which | 
|               is then immediately parsed as if the start of its | 
|               contents were the next line in the current file. nesting | 
|               of include up to 16 files deep is supported. | 
|   | 
| prompt <flag>        - if 1, always prompt the user to enter a label to boot | 
|               from. if 0, only prompt the user if timeout expires. | 
|   | 
| timeout <num>        - wait for user input for <num>/10 seconds before | 
|               auto-booting a node. | 
|   | 
| label <name>        - begin a label definition. labels continue until | 
|               a command not recognized as a label command is seen, | 
|               or EOF is reached. | 
|   | 
| Supported label commands | 
| ------------------------ | 
| labels end when a command not recognized as a label command is reached, or EOF. | 
|   | 
| menu default        - set this label as the default label to boot; this is | 
|               the same behavior as the global default command but | 
|               specified in a different way | 
|   | 
| kernel <path>        - if this label is chosen, use tftp to retrieve the kernel | 
|               (or FIT image) at <path>. it will be stored at the address | 
|               indicated in the kernel_addr_r environment variable, and | 
|               that address will be passed to bootm to boot this kernel. | 
|   | 
| append <string>        - use <string> as the kernel command line when booting this | 
|               label. | 
|   | 
| initrd <path>        - if this label is chosen, use tftp to retrieve the initrd | 
|               at <path>. it will be stored at the address indicated in | 
|               the initrd_addr_r environment variable, and that address | 
|               will be passed to bootm. | 
|   | 
| fdt <path>        - if this label is chosen, use tftp to retrieve the fdt blob | 
|               at <path>. it will be stored at the address indicated in | 
|               the fdt_addr_r environment variable, and that address will | 
|               be passed to bootm. | 
|   | 
| fdtdir <path>        - if this label is chosen, use tftp to retrieve a fdt blob | 
|               relative to <path>. If the fdtfile environment variable | 
|               is set, <path>/<fdtfile> is retrieved. Otherwise, the | 
|               filename is generated from the soc and board environment | 
|               variables, i.e. <path>/<soc>-<board>.dtb is retrieved. | 
|               If the fdt command is specified, fdtdir is ignored. | 
|   | 
| localboot <flag>    - Run the command defined by "localcmd" in the environment. | 
|               <flag> is ignored and is only here to match the syntax of | 
|               PXELINUX config files. | 
|   | 
| Example | 
| ------- | 
| Here's a couple of example files to show how this works. | 
|   | 
| ------------/tftpboot/pxelinux.cfg/menus/base.menu----------- | 
| menu title Linux selections | 
|   | 
| # This is the default label | 
| label install | 
|     menu label Default Install Image | 
|     kernel kernels/install.bin | 
|     append console=ttyAMA0,38400 debug earlyprintk | 
|     initrd initrds/uzInitrdDebInstall | 
|   | 
| # Just another label | 
| label linux-2.6.38 | 
|     kernel kernels/linux-2.6.38.bin | 
|     append root=/dev/sdb1 | 
|   | 
| # The locally installed kernel | 
| label local | 
|     menu label Locally installed kernel | 
|     append root=/dev/sdb1 | 
|     localboot 1 | 
| ------------------------------------------------------------- | 
|   | 
| ------------/tftpboot/pxelinux.cfg/default------------------- | 
| menu include pxelinux.cfg/menus/base.menu | 
| timeout 500 | 
|   | 
| default linux-2.6.38 | 
| ------------------------------------------------------------- | 
|   | 
| When a pxe client retrieves and boots the default pxe file, | 
| 'pxe boot' will wait for user input for 5 seconds before booting | 
| the linux-2.6.38 label, which will cause /tftpboot/kernels/linux-2.6.38.bin | 
| to be downloaded, and boot with the command line "root=/dev/sdb1" | 
|   | 
| Differences with PXELINUX | 
| ========================= | 
| The biggest difference between U-Boot's pxe and PXELINUX is that since | 
| U-Boot's pxe support is written entirely in C, it can run on any platform | 
| with network support in U-Boot. Here are some other differences between | 
| PXELINUX and U-Boot's pxe support. | 
|   | 
| - U-Boot's pxe does not support the PXELINUX DHCP option codes specified | 
|   in RFC 5071, but could be extended to do so. | 
|   | 
| - when U-Boot's pxe fails to boot, it will return control to U-Boot, | 
|   allowing another command to run, other U-Boot command, instead of resetting | 
|   the machine like PXELINUX. | 
|   | 
| - U-Boot's pxe doesn't rely on or provide an UNDI/PXE stack in memory, it | 
|   only uses U-Boot. | 
|   | 
| - U-Boot's pxe doesn't provide the full menu implementation that PXELINUX | 
|   does, only a simple text based menu using the commands described in | 
|   this README.    With PXELINUX, it's possible to have a graphical boot | 
|   menu, submenus, passwords, etc. U-Boot's pxe could be extended to support | 
|   a more robust menuing system like that of PXELINUX's. | 
|   | 
| - U-Boot's pxe expects U-Boot uimg's as kernels.  Anything that would work | 
|   with the 'bootm' command in U-Boot could work with the 'pxe boot' command. | 
|   | 
| - U-Boot's pxe only recognizes a single file on the initrd command line.  It | 
|   could be extended to support multiple. | 
|   | 
| - in U-Boot's pxe, the localboot command doesn't necessarily cause a local | 
|   disk boot - it will do whatever is defined in the 'localcmd' env | 
|   variable. And since it doesn't support a full UNDI/PXE stack, the | 
|   type field is ignored. | 
|   | 
| - the interactive prompt in U-Boot's pxe only allows you to choose a label | 
|   from the menu.  If you want to boot something not listed, you can ctrl+c | 
|   out of 'pxe boot' and use existing U-Boot commands to accomplish it. |