blob: c57b717caaf3f7a948b4ae0ff41b867547fda433 [file] [log] [blame]
Simon Glassea754aa2021-10-21 21:08:45 -06001.. SPDX-License-Identifier: GPL-2.0+
2
3Environment Variables
4=====================
5
Simon Glass40b9e0d2021-10-21 21:08:50 -06006U-Boot supports user configuration using environment variables which
Simon Glass5ba9e012021-10-21 21:08:49 -06007can be made persistent by saving to persistent storage, for example flash
8memory.
Simon Glassea754aa2021-10-21 21:08:45 -06009
Simon Glass40b9e0d2021-10-21 21:08:50 -060010Environment variables are set using "env set" (alias "setenv"), printed using
Simon Glass5ba9e012021-10-21 21:08:49 -060011"env print" (alias "printenv"), and saved to persistent storage using
12"env save" (alias "saveenv"). Using "env set"
Simon Glassea754aa2021-10-21 21:08:45 -060013without a value can be used to delete a variable from the
Simon Glass5ba9e012021-10-21 21:08:49 -060014environment. As long as you don't save the environment, you are
Simon Glassea754aa2021-10-21 21:08:45 -060015working with an in-memory copy. In case the Flash area containing the
16environment is erased by accident, a default environment is provided.
17
Patrick Delaunayfe869e12022-04-14 19:07:05 +020018See :doc:`cmd/env` for details.
19
Simon Glass5ba9e012021-10-21 21:08:49 -060020Some configuration is controlled by Environment Variables, so that setting the
21variable can adjust the behaviour of U-Boot (e.g. autoboot delay, autoloading
22from tftp).
Simon Glassea754aa2021-10-21 21:08:45 -060023
Simon Glass86b9c3e2021-10-21 21:08:46 -060024Text-based Environment
25----------------------
26
27The default environment for a board is created using a `.env` environment file
28using a simple text format. The base filename for this is defined by
29`CONFIG_ENV_SOURCE_FILE`, or `CONFIG_SYS_BOARD` if that is empty.
30
31The file must be in the board directory and have a .env extension, so
32assuming that there is a board vendor, the resulting filename is therefore::
33
34 board/<vendor>/<board>/<CONFIG_ENV_SOURCE_FILE>.env
35
36or::
37
38 board/<vendor>/<board>/<CONFIG_SYS_BOARD>.env
39
40This is a plain text file where you can type your environment variables in
41the form `var=value`. Blank lines and multi-line variables are supported.
42The conversion script looks for a line that starts in column 1 with a string
43and has an equals sign immediately afterwards. Spaces before the = are not
44permitted. It is a good idea to indent your scripts so that only the 'var='
45appears at the start of a line.
46
47To add additional text to a variable you can use `var+=value`. This text is
48merged into the variable during the make process and made available as a
49single value to U-Boot. Variables can contain `+` characters but in the unlikely
50event that you want to have a variable name ending in plus, put a backslash
51before the `+` so that the script knows you are not adding to an existing
52variable but assigning to a new one::
53
54 maximum\+=value
55
56This file can include C-style comments. Blank lines and multi-line
57variables are supported, and you can use normal C preprocessor directives
58and CONFIG defines from your board config also.
59
60For example, for snapper9260 you would create a text file called
61`board/bluewater/snapper9260.env` containing the environment text.
62
63Example::
64
65 stdout=serial
Simon Glassb86986c2022-10-18 07:46:31 -060066 #ifdef CONFIG_VIDEO
Simon Glass0f9b86f2022-10-16 15:59:22 -060067 stdout+=,vidconsole
Simon Glass86b9c3e2021-10-21 21:08:46 -060068 #endif
69 bootcmd=
70 /* U-Boot script for booting */
71
72 if [ -z ${tftpserverip} ]; then
73 echo "Use 'setenv tftpserverip a.b.c.d' to set IP address."
74 fi
75
76 usb start; setenv autoload n; bootp;
77 tftpboot ${tftpserverip}:
78 bootm
79 failed=
80 /* Print a message when boot fails */
81 echo CONFIG_SYS_BOARD boot failed - please check your image
82 echo Load address is CONFIG_SYS_LOAD_ADDR
83
Simon Glass63af90e2023-07-30 21:01:46 -060084Settings which are common to a group of boards can use #include to bring in
85a common file in the `include/env` directory, containing environment
86settings. For example::
87
88 #include <env/ti/mmc.env>
89
Simon Glass86b9c3e2021-10-21 21:08:46 -060090If CONFIG_ENV_SOURCE_FILE is empty and the default filename is not present, then
91the old-style C environment is used instead. See below.
92
93Old-style C environment
94-----------------------
95
96Traditionally, the default environment is created in `include/env_default.h`,
97and can be augmented by various `CONFIG` defines. See that file for details. In
Tom Rini0613c362022-12-04 10:03:50 -050098particular you can define `CFG_EXTRA_ENV_SETTINGS` in your board file
Simon Glass86b9c3e2021-10-21 21:08:46 -060099to add environment variables.
100
101Board maintainers are encouraged to migrate to the text-based environment as it
102is easier to maintain. The distro-board script still requires the old-style
Simon Glassf26a9662023-07-30 21:01:44 -0600103environments, so use :doc:`../develop/bootstd` instead.
Simon Glass86b9c3e2021-10-21 21:08:46 -0600104
105
106List of environment variables
107-----------------------------
108
Simon Glass40b9e0d2021-10-21 21:08:50 -0600109Some device configuration options can be set using environment variables. In
110many cases the value in the default environment comes from a CONFIG option - see
Simon Glass5ba9e012021-10-21 21:08:49 -0600111`include/env_default.h`) for this.
112
Simon Glass86b9c3e2021-10-21 21:08:46 -0600113This is most-likely not complete:
Simon Glassea754aa2021-10-21 21:08:45 -0600114
Heinrich Schuchardt0e219432022-09-10 09:16:37 +0200115autostart
116 If set to "yes" (actually any string starting with 1, y, Y, t, or T) an
117 image loaded with one of the commands listed below will be automatically
118 started by internally invoking the bootm command.
119
120 * bootelf - Boot from an ELF image in memory
121 * bootp - boot image via network using BOOTP/TFTP protocol
122 * dhcp - boot image via network using DHCP/TFTP protocol
123 * diskboot - boot from ide device
124 * nboot - boot from NAND device
125 * nfs - boot image via network using NFS protocol
126 * rarpboot - boot image via network using RARP/TFTP protocol
127 * scsiboot - boot from SCSI device
128 * tftpboot - boot image via network using TFTP protocol
129 * usbboot - boot from USB device
130
131 If the environment variable autostart is not set to a value starting with
132 1, y, Y, t, or T, an image passed to the "bootm" command will be copied to
133 the load address (and eventually uncompressed), but NOT be started.
134 This can be used to load and uncompress arbitrary data.
135
Simon Glassea754aa2021-10-21 21:08:45 -0600136baudrate
Simon Glass40b9e0d2021-10-21 21:08:50 -0600137 Used to set the baudrate of the UART - it defaults to CONFIG_BAUDRATE (which
138 defaults to 115200).
Simon Glassea754aa2021-10-21 21:08:45 -0600139
140bootdelay
Simon Glass40b9e0d2021-10-21 21:08:50 -0600141 Delay before automatically running bootcmd. During this time the user
142 can choose to enter the shell (or the boot menu if
143 CONFIG_AUTOBOOT_MENU_SHOW=y):
144
145 - 0 to autoboot with no delay, but you can stop it by key input.
146 - -1 to disable autoboot.
147 - -2 to autoboot with no delay and not check for abort
148
149 The default value is defined by CONFIG_BOOTDELAY.
150 The value of 'bootdelay' is overridden by the /config/bootdelay value in
151 the device-tree if CONFIG_OF_CONTROL=y.
Simon Glassea754aa2021-10-21 21:08:45 -0600152
153bootcmd
Simon Glass40b9e0d2021-10-21 21:08:50 -0600154 The command that is run if the user does not enter the shell during the
155 boot delay.
Simon Glassea754aa2021-10-21 21:08:45 -0600156
157bootargs
Simon Glass40b9e0d2021-10-21 21:08:50 -0600158 Command line arguments passed when booting an operating system or binary
159 image
Simon Glassea754aa2021-10-21 21:08:45 -0600160
161bootfile
162 Name of the image to load with TFTP
163
164bootm_low
165 Memory range available for image processing in the bootm
166 command can be restricted. This variable is given as
167 a hexadecimal number and defines lowest address allowed
168 for use by the bootm command. See also "bootm_size"
169 environment variable. Address defined by "bootm_low" is
170 also the base of the initial memory mapping for the Linux
Tom Rini65cc0e22022-11-16 13:10:41 -0500171 kernel -- see the description of CFG_SYS_BOOTMAPSZ and
Simon Glassea754aa2021-10-21 21:08:45 -0600172 bootm_mapsize.
173
174bootm_mapsize
175 Size of the initial memory mapping for the Linux kernel.
176 This variable is given as a hexadecimal number and it
177 defines the size of the memory region starting at base
178 address bootm_low that is accessible by the Linux kernel
Tom Rini65cc0e22022-11-16 13:10:41 -0500179 during early boot. If unset, CFG_SYS_BOOTMAPSZ is used
Simon Glassea754aa2021-10-21 21:08:45 -0600180 as the default value if it is defined, and bootm_size is
181 used otherwise.
182
183bootm_size
184 Memory range available for image processing in the bootm
185 command can be restricted. This variable is given as
186 a hexadecimal number and defines the size of the region
187 allowed for use by the bootm command. See also "bootm_low"
188 environment variable.
189
190bootstopkeysha256, bootdelaykey, bootstopkey
191 See README.autoboot
192
193updatefile
194 Location of the software update file on a TFTP server, used
195 by the automatic software update feature. Please refer to
196 documentation in doc/README.update for more details.
197
198autoload
199 if set to "no" (any string beginning with 'n'),
Simon Glass40b9e0d2021-10-21 21:08:50 -0600200 "bootp" and "dhcp" will just load perform a lookup of the
Simon Glassea754aa2021-10-21 21:08:45 -0600201 configuration from the BOOTP server, but not try to
Simon Glass754a7222022-03-11 16:22:39 -0700202 load any image.
Simon Glassea754aa2021-10-21 21:08:45 -0600203
Simon Glassea754aa2021-10-21 21:08:45 -0600204fdt_high
205 if set this restricts the maximum address that the
206 flattened device tree will be copied into upon boot.
207 For example, if you have a system with 1 GB memory
208 at physical address 0x10000000, while Linux kernel
209 only recognizes the first 704 MB as low memory, you
210 may need to set fdt_high as 0x3C000000 to have the
211 device tree blob be copied to the maximum address
212 of the 704 MB low memory, so that Linux kernel can
213 access it during the boot procedure.
214
Simon Glass40b9e0d2021-10-21 21:08:50 -0600215 If this is set to the special value 0xffffffff (32-bit machines) or
216 0xffffffffffffffff (64-bit machines) then
Simon Glassea754aa2021-10-21 21:08:45 -0600217 the fdt will not be copied at all on boot. For this
218 to work it must reside in writable memory, have
Michal Simeke6ff9982023-09-08 09:11:31 +0200219 sufficient padding on the end of it for U-Boot to
Simon Glassea754aa2021-10-21 21:08:45 -0600220 add the information it needs into it, and the memory
Tom Rini556af512022-06-20 10:31:28 -0400221 must be accessible by the kernel. This usage is strongly discouraged
222 however as it also stops U-Boot from ensuring the device tree starting
223 address is properly aligned and a misaligned tree will cause OS failures.
Simon Glassea754aa2021-10-21 21:08:45 -0600224
225fdtcontroladdr
226 if set this is the address of the control flattened
227 device tree used by U-Boot when CONFIG_OF_CONTROL is
228 defined.
229
230initrd_high
231 restrict positioning of initrd images:
232 If this variable is not set, initrd images will be
233 copied to the highest possible address in RAM; this
234 is usually what you want since it allows for
235 maximum initrd size. If for some reason you want to
236 make sure that the initrd image is loaded below the
Tom Rini65cc0e22022-11-16 13:10:41 -0500237 CFG_SYS_BOOTMAPSZ limit, you can set this environment
Simon Glassea754aa2021-10-21 21:08:45 -0600238 variable to a value of "no" or "off" or "0".
239 Alternatively, you can set it to a maximum upper
240 address to use (U-Boot will still check that it
241 does not overwrite the U-Boot stack and data).
242
243 For instance, when you have a system with 16 MB
244 RAM, and want to reserve 4 MB from use by Linux,
245 you can do this by adding "mem=12M" to the value of
246 the "bootargs" variable. However, now you must make
247 sure that the initrd image is placed in the first
248 12 MB as well - this can be done with::
249
250 setenv initrd_high 00c00000
251
Simon Glass40b9e0d2021-10-21 21:08:50 -0600252 If you set initrd_high to 0xffffffff (32-bit machines) or
253 0xffffffffffffffff (64-bit machines), this is an
Simon Glassea754aa2021-10-21 21:08:45 -0600254 indication to U-Boot that all addresses are legal
255 for the Linux kernel, including addresses in flash
256 memory. In this case U-Boot will NOT COPY the
257 ramdisk at all. This may be useful to reduce the
258 boot time on your system, but requires that this
Tom Rini556af512022-06-20 10:31:28 -0400259 feature is supported by your Linux kernel. This usage however requires
260 that the user ensure that there will be no overlap with other parts of the
261 image such as the Linux kernel BSS. It should not be enabled by default
262 and only done as part of optimizing a deployment.
Simon Glassea754aa2021-10-21 21:08:45 -0600263
264ipaddr
265 IP address; needed for tftpboot command
266
267loadaddr
268 Default load address for commands like "bootp",
Tom Rini556af512022-06-20 10:31:28 -0400269 "rarpboot", "tftpboot", "loadb" or "diskboot". Note that the optimal
270 default values here will vary between architectures. On 32bit ARM for
271 example, some offset from start of memory is used as the Linux kernel
272 zImage has a self decompressor and it's best if we stay out of where that
273 will be working.
Simon Glassea754aa2021-10-21 21:08:45 -0600274
275loads_echo
276 see CONFIG_LOADS_ECHO
277
278serverip
279 TFTP server IP address; needed for tftpboot command
280
281bootretry
282 see CONFIG_BOOT_RETRY_TIME
283
284bootdelaykey
285 see CONFIG_AUTOBOOT_DELAY_STR
286
287bootstopkey
288 see CONFIG_AUTOBOOT_STOP_STR
289
290ethprime
Simon Glass40b9e0d2021-10-21 21:08:50 -0600291 controls which network interface is used first.
Simon Glassea754aa2021-10-21 21:08:45 -0600292
293ethact
294 controls which interface is currently active.
295 For example you can do the following::
296
297 => setenv ethact FEC
298 => ping 192.168.0.1 # traffic sent on FEC
299 => setenv ethact SCC
300 => ping 10.0.0.1 # traffic sent on SCC
301
302ethrotate
303 When set to "no" U-Boot does not go through all
304 available network interfaces.
Simon Glass40b9e0d2021-10-21 21:08:50 -0600305 It just stays at the currently selected interface. When unset or set to
306 anything other than "no", U-Boot does go through all
307 available network interfaces.
Simon Glassea754aa2021-10-21 21:08:45 -0600308
309netretry
310 When set to "no" each network operation will
311 either succeed or fail without retrying.
312 When set to "once" the network operation will
313 fail when all the available network interfaces
314 are tried once without success.
315 Useful on scripts which control the retry operation
316 themselves.
317
Simon Glassea754aa2021-10-21 21:08:45 -0600318silent_linux
319 If set then Linux will be told to boot silently, by
Simon Glass40b9e0d2021-10-21 21:08:50 -0600320 adding 'console=' to its command line. If "yes" it will be
Simon Glassea754aa2021-10-21 21:08:45 -0600321 made silent. If "no" it will not be made silent. If
322 unset, then it will be made silent if the U-Boot console
323 is silent.
324
325tftpsrcp
326 If this is set, the value is used for TFTP's
327 UDP source port.
328
329tftpdstp
330 If this is set, the value is used for TFTP's UDP
Simon Glass40b9e0d2021-10-21 21:08:50 -0600331 destination port instead of the default port 69.
Simon Glassea754aa2021-10-21 21:08:45 -0600332
333tftpblocksize
334 Block size to use for TFTP transfers; if not set,
335 we use the TFTP server's default block size
336
337tftptimeout
338 Retransmission timeout for TFTP packets (in milli-
339 seconds, minimum value is 1000 = 1 second). Defines
340 when a packet is considered to be lost so it has to
341 be retransmitted. The default is 5000 = 5 seconds.
342 Lowering this value may make downloads succeed
343 faster in networks with high packet loss rates or
344 with unreliable TFTP servers.
345
346tftptimeoutcountmax
347 maximum count of TFTP timeouts (no
348 unit, minimum value = 0). Defines how many timeouts
349 can happen during a single file transfer before that
350 transfer is aborted. The default is 10, and 0 means
351 'no timeouts allowed'. Increasing this value may help
352 downloads succeed with high packet loss rates, or with
353 unreliable TFTP servers or client hardware.
354
355tftpwindowsize
356 if this is set, the value is used for TFTP's
357 window size as described by RFC 7440.
358 This means the count of blocks we can receive before
359 sending ack to server.
360
361vlan
362 When set to a value < 4095 the traffic over
363 Ethernet is encapsulated/received over 802.1q
364 VLAN tagged frames.
365
Simon Glass5ba9e012021-10-21 21:08:49 -0600366 Note: This appears not to be used in U-Boot. See `README.VLAN`.
367
Simon Glassea754aa2021-10-21 21:08:45 -0600368bootpretryperiod
369 Period during which BOOTP/DHCP sends retries.
370 Unsigned value, in milliseconds. If not set, the period will
371 be either the default (28000), or a value based on
372 CONFIG_NET_RETRY_COUNT, if defined. This value has
Chris Packhamf1533c42022-05-25 13:08:51 +1200373 precedence over the value based on CONFIG_NET_RETRY_COUNT.
Simon Glassea754aa2021-10-21 21:08:45 -0600374
375memmatches
376 Number of matches found by the last 'ms' command, in hex
377
378memaddr
379 Address of the last match found by the 'ms' command, in hex,
380 or 0 if none
381
382mempos
383 Index position of the last match found by the 'ms' command,
384 in units of the size (.b, .w, .l) of the search
385
386zbootbase
387 (x86 only) Base address of the bzImage 'setup' block
388
389zbootaddr
390 (x86 only) Address of the loaded bzImage, typically
391 BZIMAGE_LOAD_ADDR which is 0x100000
392
393
394Image locations
395---------------
396
397The following image location variables contain the location of images
398used in booting. The "Image" column gives the role of the image and is
399not an environment variable name. The other columns are environment
400variable names. "File Name" gives the name of the file on a TFTP
401server, "RAM Address" gives the location in RAM the image will be
402loaded to, and "Flash Location" gives the image's address in NOR
403flash or offset in NAND flash.
404
405*Note* - these variables don't have to be defined for all boards, some
406boards currently use other variables for these purposes, and some
407boards use these variables for other purposes.
408
Simon Glass5ba9e012021-10-21 21:08:49 -0600409Also note that most of these variables are just a commonly used set of variable
410names, used in some other variable definitions, but are not hard-coded anywhere
411in U-Boot code.
412
Simon Glassea754aa2021-10-21 21:08:45 -0600413================= ============== ================ ==============
414Image File Name RAM Address Flash Location
415================= ============== ================ ==============
Simon Glassea754aa2021-10-21 21:08:45 -0600416Linux kernel bootfile kernel_addr_r kernel_addr
417device tree blob fdtfile fdt_addr_r fdt_addr
418ramdisk ramdiskfile ramdisk_addr_r ramdisk_addr
419================= ============== ================ ==============
420
Tom Rinibf893582022-07-11 14:32:13 -0400421When setting the RAM addresses for `kernel_addr_r`, `fdt_addr_r` and
422`ramdisk_addr_r` there are several types of constraints to keep in mind. The
423one type of constraint is payload requirement. For example, a device tree MUST
424be loaded at an 8-byte aligned address as that is what the specification
425requires. In a similar manner, the operating system may define restrictions on
426where in memory space payloads can be. This is documented for example in Linux,
427with both the `Booting ARM Linux`_ and `Booting AArch64 Linux`_ documents.
428Finally, there are practical constraints. We do not know the size of a given
429payload a user will use but each payload must not overlap or it will corrupt
430the other payload. A similar problem can happen when a payload ends up being in
431the OS BSS area. For these reasons we need to ensure our default values here
432are both unlikely to lead to failure to boot and sufficiently explained so that
433they can be optimized for boot time or adjusted for smaller memory
434configurations.
435
436On different architectures we will have different constraints. It is important
437that we follow whatever documented requirements are available to best ensure
438forward compatibility. What follows are examples to highlight how to provide
439reasonable default values in different cases.
440
441Texas Instruments OMAP2PLUS (ARMv7) example
442^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
443
444On these families of processors we are on a 32bit ARMv7 core. As booting some
445form of Linux is our most common payload we will also keep in mind the
446documented requirements for booting that Linux provides. These values are also
447known to be fine for booting a number of other operating systems (or their
448loaders). In this example we define the following variables and values::
449
450 loadaddr=0x82000000
451 kernel_addr_r=${loadaddr}
452 fdt_addr_r=0x88000000
453 ramdisk_addr_r=0x88080000
454 bootm_size=0x10000000
455
456The first thing to keep in mind is that DRAM starts at 0x80000000. We set a
45732MiB buffer from the start of memory as our default load address and set
458``kernel_addr_r`` to that. This is because the Linux ``zImage`` decompressor
459will typically then be able to avoid doing a relocation itself. It also MUST be
460within the first 128MiB of memory. The next value is we set ``fdt_addr_r`` to
461be at 128MiB offset from the start of memory. This location is suggested by the
462kernel documentation and is exceedingly unlikely to be overwritten by the
463kernel itself given other architectural constraints. We then allow for the
464device tree to be up to 512KiB in size before placing the ramdisk in memory. We
465then say that everything should be within the first 256MiB of memory so that
466U-Boot can relocate things as needed to ensure proper alignment. We pick 256MiB
467as our value here because we know there are very few platforms on in this
468family with less memory. It could be as high as 768MiB and still ensure that
469everything would be visible to the kernel, but again we go with what we assume
470is the safest assumption.
Simon Glassea754aa2021-10-21 21:08:45 -0600471
472Automatically updated variables
473-------------------------------
474
475The following environment variables may be used and automatically
476updated by the network boot commands ("bootp" and "rarpboot"),
477depending the information provided by your boot server:
478
479========= ===================================================
480Variable Notes
481========= ===================================================
482bootfile see above
483dnsip IP address of your Domain Name Server
484dnsip2 IP address of your secondary Domain Name Server
485gatewayip IP address of the Gateway (Router) to use
486hostname Target hostname
487ipaddr See above
488netmask Subnet Mask
489rootpath Pathname of the root filesystem on the NFS server
490serverip see above
491========= ===================================================
492
493
494Special environment variables
495-----------------------------
496
497There are two special Environment Variables:
498
499serial#
500 contains hardware identification information such as type string and/or
501 serial number
502ethaddr
Simon Glass40b9e0d2021-10-21 21:08:50 -0600503 Ethernet address. If CONFIG_REGEX=y, also eth*addr (where * is an integer).
Simon Glassea754aa2021-10-21 21:08:45 -0600504
505These variables can be set only once (usually during manufacturing of
506the board). U-Boot refuses to delete or overwrite these variables
Simon Glass40b9e0d2021-10-21 21:08:50 -0600507once they have been set, unless CONFIG_ENV_OVERWRITE is enabled in the board
508configuration.
Simon Glassea754aa2021-10-21 21:08:45 -0600509
510Also:
511
512ver
513 Contains the U-Boot version string as printed
514 with the "version" command. This variable is
515 readonly (see CONFIG_VERSION_VARIABLE).
516
517Please note that changes to some configuration parameters may take
Simon Glass40b9e0d2021-10-21 21:08:50 -0600518only effect after the next boot (yes, that's just like Windows).
Simon Glass1df02d12021-10-21 21:08:48 -0600519
520
521External environment file
522-------------------------
523
524The `CONFIG_USE_DEFAULT_ENV_FILE` option provides a way to bypass the
525environment generation in U-Boot. If enabled, then `CONFIG_DEFAULT_ENV_FILE`
526provides the name of a file which is converted into the environment,
527completely bypassing the standard environment variables in `env_default.h`.
528
529The format is the same as accepted by the mkenvimage tool, with lines containing
530key=value pairs. Blank lines and lines beginning with # are ignored.
531
532Future work may unify this feature with the text-based environment, perhaps
533moving the contents of `env_default.h` to a text file.
Simon Glass40b9e0d2021-10-21 21:08:50 -0600534
535Implementation
536--------------
537
538See :doc:`../develop/environment` for internal development details.
Tom Rinibf893582022-07-11 14:32:13 -0400539
540.. _`Booting ARM Linux`: https://www.kernel.org/doc/html/latest/arm/booting.html
541.. _`Booting AArch64 Linux`: https://www.kernel.org/doc/html/latest/arm64/booting.html