Commit 2a43201a13bc690b5f15a1a998514d932db2f1b0
Committed by
Tom Rini
1 parent
5426716231
Exists in
v2017.01-smarct4x
and in
37 other branches
config: introduce a generic $bootcmd
This generic $bootcmd, and associated support macros, automatically searches a defined set of storage devices (or network protocols) for an extlinux configuration file or U-Boot boot script in various standardized locations. Distros that install such a boot config file/script in those standard locations will get easy-to-set-up booting on HW that enables this generic $bootcmd. Boards can define the set of devices from which boot is attempted, and the order in which they are attempted. Users may later customize this set/order by edting $boot_targets. Users may interrupt the boot process and boot from a specific device simply by executing e.g.: $ run bootcmd_mmc1 or: $ run bootcmd_pxe This patch was originally written by Dennis Gilmore based on Tegra and rpi_b boot scripts. I have made the following modifications since then: * Boards must define the BOOT_TARGET_DEVICES macro in order to specify the set of devices (and order) from which to attempt boot. If needed, we can define a default directly in config_distro_bootcmd.h. * Removed $env_import and related variables; nothing used them, and I think it's better for boards to pre-load an environment customization file using CONFIG_PREBOOT if they need. * Renamed a bunch of variables to suit my whims:-) Signed-off-by: Dennis Gilmore <dennis@ausil.us> Signed-off-by: Stephen Warren <swarren@nvidia.com> Reviewed-by: Marek Vasut <marex@denx.de> Acked-by: Simon Glass <sjg@chromium.org>
Showing 1 changed file with 197 additions and 0 deletions Side-by-side Diff
include/config_distro_bootcmd.h
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 | +#define BOOTENV_SHARED_BLKDEV_BODY(devtypel) \ | |
14 | + "if " #devtypel " dev ${devnum}; then " \ | |
15 | + "setenv devtype " #devtypel "; " \ | |
16 | + "run scan_dev_for_boot; " \ | |
17 | + "fi\0" | |
18 | + | |
19 | +#define BOOTENV_SHARED_BLKDEV(devtypel) \ | |
20 | + #devtypel "_boot=" \ | |
21 | + BOOTENV_SHARED_BLKDEV_BODY(devtypel) | |
22 | + | |
23 | +#define BOOTENV_DEV_BLKDEV(devtypeu, devtypel, instance) \ | |
24 | + "bootcmd_" #devtypel #instance "=" \ | |
25 | + "setenv devnum " #instance "; " \ | |
26 | + "run " #devtypel "_boot\0" | |
27 | + | |
28 | +#define BOOTENV_DEV_NAME_BLKDEV(devtypeu, devtypel, instance) \ | |
29 | + #devtypel #instance " " | |
30 | + | |
31 | +#ifdef CONFIG_CMD_MMC | |
32 | +#define BOOTENV_SHARED_MMC BOOTENV_SHARED_BLKDEV(mmc) | |
33 | +#define BOOTENV_DEV_MMC BOOTENV_DEV_BLKDEV | |
34 | +#define BOOTENV_DEV_NAME_MMC BOOTENV_DEV_NAME_BLKDEV | |
35 | +#else | |
36 | +#define BOOTENV_SHARED_MMC | |
37 | +#define BOOTENV_DEV_MMC \ | |
38 | + BOOT_TARGET_DEVICES_references_MMC_without_CONFIG_CMD_MMC | |
39 | +#define BOOTENV_DEV_NAME_MMC \ | |
40 | + BOOT_TARGET_DEVICES_references_MMC_without_CONFIG_CMD_MMC | |
41 | +#endif | |
42 | + | |
43 | +#ifdef CONFIG_CMD_SATA | |
44 | +#define BOOTENV_SHARED_SATA BOOTENV_SHARED_BLKDEV(sata) | |
45 | +#define BOOTENV_DEV_SATA BOOTENV_DEV_BLKDEV | |
46 | +#define BOOTENV_DEV_NAME_SATA BOOTENV_DEV_NAME_BLKDEV | |
47 | +#else | |
48 | +#define BOOTENV_SHARED_SATA | |
49 | +#define BOOTENV_DEV_SATA \ | |
50 | + BOOT_TARGET_DEVICES_references_SATA_without_CONFIG_CMD_SATA | |
51 | +#define BOOTENV_DEV_NAME_SATA \ | |
52 | + BOOT_TARGET_DEVICES_references_SATA_without_CONFIG_CMD_SATA | |
53 | +#endif | |
54 | + | |
55 | +#ifdef CONFIG_CMD_SCSI | |
56 | +#define BOOTENV_SHARED_SCSI BOOTENV_SHARED_BLKDEV(scsi) | |
57 | +#define BOOTENV_DEV_SCSI BOOTENV_DEV_BLKDEV | |
58 | +#define BOOTENV_DEV_NAME_SCSI BOOTENV_DEV_NAME_BLKDEV | |
59 | +#else | |
60 | +#define BOOTENV_SHARED_SCSI | |
61 | +#define BOOTENV_DEV_SCSI \ | |
62 | + BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_CMD_SCSI | |
63 | +#define BOOTENV_DEV_NAME_SCSI \ | |
64 | + BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_CMD_SCSI | |
65 | +#endif | |
66 | + | |
67 | +#ifdef CONFIG_CMD_IDE | |
68 | +#define BOOTENV_SHARED_IDE BOOTENV_SHARED_BLKDEV(ide) | |
69 | +#define BOOTENV_DEV_IDE BOOTENV_DEV_BLKDEV | |
70 | +#define BOOTENV_DEV_NAME_IDE BOOTENV_DEV_NAME_BLKDEV | |
71 | +#else | |
72 | +#define BOOTENV_SHARED_IDE | |
73 | +#define BOOTENV_DEV_IDE \ | |
74 | + BOOT_TARGET_DEVICES_references_IDE_without_CONFIG_CMD_IDE | |
75 | +#define BOOTENV_DEV_NAME_IDE \ | |
76 | + BOOT_TARGET_DEVICES_references_IDE_without_CONFIG_CMD_IDE | |
77 | +#endif | |
78 | + | |
79 | +#ifdef CONFIG_CMD_USB | |
80 | +#define BOOTENV_RUN_USB_INIT "run usb_init; " | |
81 | +#define BOOTENV_SET_USB_NEED_INIT "setenv usb_need_init; " | |
82 | +#define BOOTENV_SHARED_USB \ | |
83 | + "usb_init=" \ | |
84 | + "if ${usb_need_init}; then " \ | |
85 | + "setenv usb_need_init false; " \ | |
86 | + "usb start 0; " \ | |
87 | + "fi\0" \ | |
88 | + \ | |
89 | + "usb_boot=" \ | |
90 | + BOOTENV_RUN_USB_INIT \ | |
91 | + BOOTENV_SHARED_BLKDEV_BODY(usb) | |
92 | +#define BOOTENV_DEV_USB BOOTENV_DEV_BLKDEV | |
93 | +#define BOOTENV_DEV_NAME_USB BOOTENV_DEV_NAME_BLKDEV | |
94 | +#else | |
95 | +#define BOOTENV_RUN_USB_INIT | |
96 | +#define BOOTENV_SET_USB_NEED_INIT | |
97 | +#define BOOTENV_SHARED_USB | |
98 | +#define BOOTENV_DEV_USB \ | |
99 | + BOOT_TARGET_DEVICES_references_USB_without_CONFIG_CMD_USB | |
100 | +#define BOOTENV_DEV_NAME_USB \ | |
101 | + BOOT_TARGET_DEVICES_references_USB_without_CONFIG_CMD_USB | |
102 | +#endif | |
103 | + | |
104 | +#if defined(CONFIG_CMD_DHCP) | |
105 | +#define BOOTENV_DEV_DHCP(devtypeu, devtypel, instance) \ | |
106 | + "bootcmd_dhcp=" \ | |
107 | + BOOTENV_RUN_USB_INIT \ | |
108 | + "if dhcp ${scriptaddr} boot.scr.uimg; then " \ | |
109 | + "source ${scriptaddr}; " \ | |
110 | + "fi\0" | |
111 | +#define BOOTENV_DEV_NAME_DHCP(devtypeu, devtypel, instance) \ | |
112 | + "dhcp " | |
113 | +#else | |
114 | +#define BOOTENV_DEV_DHCP \ | |
115 | + BOOT_TARGET_DEVICES_references_DHCP_without_CONFIG_CMD_DHCP | |
116 | +#define BOOTENV_DEV_NAME_DHCP \ | |
117 | + BOOT_TARGET_DEVICES_references_DHCP_without_CONFIG_CMD_DHCP | |
118 | +#endif | |
119 | + | |
120 | +#if defined(CONFIG_CMD_DHCP) && defined(CONFIG_CMD_PXE) | |
121 | +#define BOOTENV_DEV_PXE(devtypeu, devtypel, instance) \ | |
122 | + "bootcmd_pxe=" \ | |
123 | + BOOTENV_RUN_USB_INIT \ | |
124 | + "dhcp; " \ | |
125 | + "if pxe get; then " \ | |
126 | + "pxe boot; " \ | |
127 | + "fi\0" | |
128 | +#define BOOTENV_DEV_NAME_PXE(devtypeu, devtypel, instance) \ | |
129 | + "pxe " | |
130 | +#else | |
131 | +#define BOOTENV_DEV_PXE \ | |
132 | + BOOT_TARGET_DEVICES_references_PXE_without_CONFIG_CMD_DHCP_or_PXE | |
133 | +#define BOOTENV_DEV_NAME_PXE \ | |
134 | + BOOT_TARGET_DEVICES_references_PXE_without_CONFIG_CMD_DHCP_or_PXE | |
135 | +#endif | |
136 | + | |
137 | +#define BOOTENV_DEV_NAME(devtypeu, devtypel, instance) \ | |
138 | + BOOTENV_DEV_NAME_##devtypeu(devtypeu, devtypel, instance) | |
139 | +#define BOOTENV_BOOT_TARGETS \ | |
140 | + "boot_targets=" BOOT_TARGET_DEVICES(BOOTENV_DEV_NAME) "\0" | |
141 | + | |
142 | +#define BOOTENV_DEV(devtypeu, devtypel, instance) \ | |
143 | + BOOTENV_DEV_##devtypeu(devtypeu, devtypel, instance) | |
144 | +#define BOOTENV \ | |
145 | + BOOTENV_SHARED_MMC \ | |
146 | + BOOTENV_SHARED_USB \ | |
147 | + BOOTENV_SHARED_SATA \ | |
148 | + BOOTENV_SHARED_SCSI \ | |
149 | + BOOTENV_SHARED_IDE \ | |
150 | + "boot_prefixes=/ /boot/\0" \ | |
151 | + "boot_scripts=boot.scr.uimg boot.scr\0" \ | |
152 | + BOOTENV_BOOT_TARGETS \ | |
153 | + "bootpart=1\0" \ | |
154 | + \ | |
155 | + "boot_extlinux=" \ | |
156 | + "sysboot ${devtype} ${devnum}:${bootpart} any " \ | |
157 | + "${scriptaddr} ${prefix}extlinux/extlinux.conf\0" \ | |
158 | + \ | |
159 | + "scan_dev_for_extlinux=" \ | |
160 | + "if test -e ${devtype} ${devnum}:${bootpart} " \ | |
161 | + "${prefix}extlinux/extlinux.conf; then " \ | |
162 | + "echo Found ${prefix}extlinux/extlinux.conf; " \ | |
163 | + "run boot_extlinux; " \ | |
164 | + "echo SCRIPT FAILED: continuing...; " \ | |
165 | + "fi\0" \ | |
166 | + \ | |
167 | + "boot_a_script=" \ | |
168 | + "load ${devtype} ${devnum}:${bootpart} " \ | |
169 | + "${scriptaddr} ${prefix}${script}; " \ | |
170 | + "source ${scriptaddr}\0" \ | |
171 | + \ | |
172 | + "scan_dev_for_scripts=" \ | |
173 | + "for script in ${boot_scripts}; do " \ | |
174 | + "if test -e ${devtype} ${devnum}:${bootpart} " \ | |
175 | + "${prefix}${script}; then " \ | |
176 | + "echo Found U-Boot script " \ | |
177 | + "${prefix}${script}; " \ | |
178 | + "run boot_a_script; " \ | |
179 | + "echo SCRIPT FAILED: continuing...; " \ | |
180 | + "fi; " \ | |
181 | + "done\0" \ | |
182 | + \ | |
183 | + "scan_dev_for_boot=" \ | |
184 | + "echo Scanning ${devtype} ${devnum}...; " \ | |
185 | + "for prefix in ${boot_prefixes}; do " \ | |
186 | + "run scan_dev_for_extlinux; " \ | |
187 | + "run scan_dev_for_scripts; " \ | |
188 | + "done\0" \ | |
189 | + \ | |
190 | + BOOT_TARGET_DEVICES(BOOTENV_DEV) \ | |
191 | + \ | |
192 | + "bootcmd=" BOOTENV_SET_USB_NEED_INIT \ | |
193 | + "for target in ${boot_targets}; do " \ | |
194 | + "run bootcmd_${target}; " \ | |
195 | + "done\0" | |
196 | + | |
197 | +#endif /* _CONFIG_CMD_DISTRO_BOOTCMD_H */ |