Merge branch '2020-05-25-misc-fixes'
[oweals/u-boot.git] / doc / README.chromium-chainload
1 Running U-Boot from coreboot on Chromebooks
2 ===========================================
3
4 U-Boot can be used as a secondary boot loader in a few situations such as from
5 UEFI and coreboot (see README.x86). Recent Chromebooks use coreboot even on
6 ARM platforms to start up the machine.
7
8 This document aims to provide a guide to booting U-Boot on a Chromebook. It
9 is only a starting point, and there are many guides on the interwebs. But
10 placing this information in the U-Boot tree should make it easier to find for
11 those who use U-Boot habitually.
12
13 Most of these platforms are supported by U-Boot natively, but it is risky to
14 replace the ROM unless you have a servo board and cable to restore it with.
15
16
17 For all of these the standard U-Boot build instructions apply. For example on
18 ARM:
19
20    sudo apt install gcc-arm-linux-gnueabi
21    mkdir b
22    make O=b/nyan_big CROSS_COMPILE=arm-linux-gnueabi- nyan-big_defconfig all
23
24 You can obtain the vbutil_kernel utility here:
25
26    https://drive.google.com/open?id=0B7WYZbZ9zd-3dHlVVXo4VXE2T0U
27
28
29 Snow (Samsung ARM Chromebook)
30 -----------------------------
31
32 See here:
33
34 https://www.chromium.org/chromium-os/firmware-porting-guide/using-nv-u-boot-on-the-samsung-arm-chromebook
35
36
37 Nyan-big
38 --------
39
40 Compiled based on information here:
41 https://lists.denx.de/pipermail/u-boot/2015-March/209530.html
42 https://git.collabora.com/cgit/user/tomeu/u-boot.git/commit/?h=nyan-big
43 https://lists.denx.de/pipermail/u-boot/2017-May/289491.html
44 https://github.com/chromeos-nvidia-androidtv/gnu-linux-on-acer-chromebook-13#copy-data-to-the-sd-card
45
46 1. Build U-Boot
47
48    mkdir b
49    make -j8 O=b/nyan-big CROSS_COMPILE=arm-linux-gnueabi- nyan-big_defconfig all
50
51
52 2. Select a .its file
53
54 Select something from doc/chromium which matches your board, or create your
55 own.
56
57 Note that the device tree node is required, even though it is not actually
58 used by U-Boot. This is because the Chromebook expects to pass it to the
59 kernel, and crashes if it is not present.
60
61
62 3. Build and sign an image
63
64    ./b/nyan-big/tools/mkimage -f doc/chromium/nyan-big.its u-boot-chromium.fit
65    echo test >dummy.txt
66    vbutil_kernel --arch arm --keyblock doc/chromium/devkeys/kernel.keyblock \
67         --signprivate doc/chromium/devkeys/kernel_data_key.vbprivk \
68         --version 1 --config dummy.txt --vmlinuz u-boot-chromium.fit \
69         --bootloader dummy.txt --pack u-boot.kpart
70
71
72 4. Prepare an SD card
73
74    DISK=/dev/sdc   # Replace with your actual SD card device
75    sudo cgpt create $DISK
76    sudo cgpt add -b 34 -s 32768 -P 1 -S 1 -t kernel $DISK
77    sudo cgpt add -b 32802 -s 2000000 -t rootfs $DISK
78    sudo gdisk $DISK   # Enter command 'w' to write a protective MBR to the disk
79
80
81 5. Write U-Boot to the SD card
82
83    sudo dd if=u-boot.kpart of=/dev/sdc1; sync
84
85
86 6. Start it up
87
88 Reboot the device in dev mode. Make sure that you have USB booting enabled. To
89 do this, login as root (via Ctrl-Alt-forward_arrow) and type
90 'enable_dev_usb_boot'. You only need to do this once.
91
92 Reboot the device with the SD card inserted. Press Clrl-U at the developer
93 mode screen. It should show something like the following on the display:
94
95    U-Boot 2017.07-00637-g242eb42-dirty (May 22 2017 - 06:14:21 -0600)
96
97    Model: Acer Chromebook 13 CB5-311
98    Board: Google/NVIDIA Nyan-big, ID: 1
99
100    Net:   No ethernet found.
101    Hit any key to stop autoboot:  0
102    Tegra124 (Nyan-big) #
103
104
105 7. Known problems
106
107 On the serial console the word MMC is chopped at the start of the line:
108
109 C:   sdhci@700b0000: 2, sdhci@700b0400: 1, sdhci@700b0600: 0
110
111 This is likely due to some problem with change-over of the serial driver
112 during relocation (or perhaps updating the clock setup in board_init()).
113
114
115 9. Notes
116
117 To check that you copied the u-boot.its file correctly, use these commands.
118 You should see that the data at 0x100 in u-boot-chromium.fit is the first few
119 bytes of U-Boot:
120
121    hd u-boot-chromium.fit |head -20
122    ...
123    00000100  b8 00 00 ea 14 f0 9f e5  14 f0 9f e5 14 f0 9f e5  |................|
124
125    hd b/nyan-big/u-boot.bin |head
126    00000000  b8 00 00 ea 14 f0 9f e5  14 f0 9f e5 14 f0 9f e5  |................|
127
128
129 The 'data' property of the FIT is set up to start at offset 0x100 bytes into
130 the file. The change to CONFIG_SYS_TEXT_BASE is also an offset of 0x100 bytes
131 from the load address. If this changes, you either need to modify U-Boot to be
132 fully relocatable, or expect it to hang.
133
134
135 chromebook_jerry
136 ----------------
137
138 The instruction are similar to those for Nyan with changes as noted below:
139
140 1. Patch U-Boot
141
142 Open include/configs/rk3288_common.h
143
144 Change:
145
146 #define CONFIG_SYS_TEXT_BASE            0x00100000
147
148 to:
149
150 #define CONFIG_SYS_TEXT_BASE            0x02000100
151
152
153
154 2. Build U-Boot
155
156    mkdir b
157    make -j8 O=b/chromebook_jerry CROSS_COMPILE=arm-linux-gnueabi- \
158         chromebook_jerry_defconfig all
159
160
161 3. See above
162
163 4. Build and sign an image
164
165    ./b/chromebook_jerry/tools/mkimage -f doc/chromium/chromebook_jerry.its \
166         u-boot-chromium.fit
167    echo test >dummy.txt
168    vbutil_kernel --arch arm --keyblock doc/chromium/devkeys/kernel.keyblock \
169         --signprivate doc/chromium/devkeys/kernel_data_key.vbprivk \
170         --version 1 --config dummy.txt --vmlinuz u-boot-chromium.fit \
171         --bootloader dummy.txt --pack u-boot.kpart
172
173
174 5. See above
175
176 6. See above
177
178 7. Start it up
179
180 Reboot the device in dev mode. Make sure that you have USB booting enabled. To
181 do this, login as root (via Ctrl-Alt-forward_arrow) and type
182 'enable_dev_usb_boot'. You only need to do this once.
183
184 Reboot the device with the SD card inserted. Press Clrl-U at the developer
185 mode screen. It should show something like the following on the display:
186
187    U-Boot 2017.05-00649-g72acdbf-dirty (May 29 2017 - 14:57:05 -0600)
188
189    Model: Google Jerry
190    Net:   Net Initialization Skipped
191    No ethernet found.
192    Hit any key to stop autoboot:  0
193
194
195 8. Known problems
196
197 None as yet.
198
199
200 9. Notes
201
202 None as yet.
203
204
205 Other notes
206 ===========
207
208 flashrom
209 --------
210
211    Used to make a backup of your firmware, or to replace it.
212
213    See: https://www.chromium.org/chromium-os/packages/cros-flashrom
214
215
216 coreboot
217 --------
218
219 Coreboot itself is not designed to actually boot an OS. Instead, a program
220 called Depthcharge is used. This originally came out of U-Boot and was then
221 heavily hacked and modified such that is is almost unrecognisable. It does
222 include a very small part of the U-Boot command-line interface but is not
223 usable as a general-purpose boot loader.
224
225 In addition, it has a very unusual design in that it does not do device init
226 itself, but instead relies on coreboot. This is similar to (in U-Boot) having
227 a SPI driver with an empty probe() method, relying on whatever was set up
228 beforehand. It can be quite hard to figure out between these two code bases
229 what settings are actually used. When chain-loading into U-Boot we must be
230 careful to reinit anything that U-Boot expects. If not, some peripherals (or
231 the whole machine) may not work. This makes the process of chainloading more
232 complicated than it could be on some platforms.
233
234 Finally, it supports only a subset of the U-Boot's FIT format. In particular
235 it uses a fixed address to load the FIT and does not support load/exec
236 addresses. This means that U-Boot must be able to boot from whatever
237 address Depthcharge happens to use (it is the CONFIG_KERNEL_START setting
238 in Depthcharge). In practice this means that the data in the kernel@1 FIT node
239 (see above) must start at the same address as U-Boot's CONFIG_SYS_TEXT_BASE.