blob: 89d3e7ba0e4b7c217da11156c5bc4e75267be85e [file] [log] [blame]
Bin Meng89ad2bb2019-07-18 00:34:26 -07001.. SPDX-License-Identifier: GPL-2.0+
2.. Copyright (C) 2014, Simon Glass <sjg@chromium.org>
3.. Copyright (C) 2014, Bin Meng <bmeng.cn@gmail.com>
Bin Meng9e816df2014-12-17 15:50:48 +08004
Bin Meng89ad2bb2019-07-18 00:34:26 -07005x86
6===
Bin Meng9e816df2014-12-17 15:50:48 +08007
8This document describes the information about U-Boot running on x86 targets,
9including supported boards, build instructions, todo list, etc.
10
11Status
12------
Bin Meng89ad2bb2019-07-18 00:34:26 -070013U-Boot supports running as a `coreboot`_ payload on x86. So far only Link
14(Chromebook Pixel) and `QEMU`_ x86 targets have been tested, but it should
Bin Meng796c81c2015-05-07 21:34:12 +080015work with minimal adjustments on other x86 boards since coreboot deals with
16most of the low-level details.
Bin Meng9e816df2014-12-17 15:50:48 +080017
Andy Shevchenkod31315d2017-07-06 14:41:53 +030018U-Boot is a main bootloader on Intel Edison board.
19
Stoppa, Igorc0e91a62015-08-13 16:43:35 +030020U-Boot also supports booting directly from x86 reset vector, without coreboot.
21In this case, known as bare mode, from the fact that it runs on the
Simon Glass2b416fd2016-03-11 22:07:33 -070022'bare metal', U-Boot acts like a BIOS replacement. The following platforms
23are supported:
24
Bin Meng0dbbf102016-05-07 07:46:36 -070025 - Bayley Bay CRB
Bin Meng4ba75702017-08-15 22:42:02 -070026 - Cherry Hill CRB
Bin Meng0dbbf102016-05-07 07:46:36 -070027 - Congatec QEVAL 2.0 & conga-QA3/E3845
Simon Glass84a49ca2023-09-07 09:58:21 -060028 - Coral (Apollo Lake - Chromebook 2017)
Simon Glass2b416fd2016-03-11 22:07:33 -070029 - Cougar Canyon 2 CRB
30 - Crown Bay CRB
31 - Galileo
Simon Glass84a49ca2023-09-07 09:58:21 -060032 - Link (Ivy Bridge - Chromebook Pixel)
Simon Glass2b416fd2016-03-11 22:07:33 -070033 - Minnowboard MAX
Simon Glass84a49ca2023-09-07 09:58:21 -060034 - Samus (Broadwell - Chromebook Pixel 2015)
Bin Meng0d873632018-10-13 20:52:03 -070035 - QEMU x86 (32-bit & 64-bit)
Bin Meng9e816df2014-12-17 15:50:48 +080036
Simon Glass4a56f102015-01-27 22:13:47 -070037As for loading an OS, U-Boot supports directly booting a 32-bit or 64-bit
38Linux kernel as part of a FIT image. It also supports a compressed zImage.
Bin Meng6ab240d2015-10-07 20:19:20 -070039U-Boot supports loading an x86 VxWorks kernel. Please check README.vxworks
40for more details.
Bin Meng9e816df2014-12-17 15:50:48 +080041
Stoppa, Igorc0e91a62015-08-13 16:43:35 +030042Build Instructions for U-Boot as BIOS replacement (bare mode)
43-------------------------------------------------------------
Simon Glass4a56f102015-01-27 22:13:47 -070044Building a ROM version of U-Boot (hereafter referred to as u-boot.rom) is a
Bin Meng9e816df2014-12-17 15:50:48 +080045little bit tricky, as generally it requires several binary blobs which are not
Bin Meng7378a6f2021-07-27 23:15:39 +080046shipped in the U-Boot source tree. Due to this reason, the u-boot.rom build may
47print some warnings if required binary blobs (e.g.: FSP) are not present.
Bin Meng9e816df2014-12-17 15:50:48 +080048
Bin Meng9e816df2014-12-17 15:50:48 +080049CPU Microcode
50-------------
Bin Meng89ad2bb2019-07-18 00:34:26 -070051Modern CPUs usually require a special bit stream called `microcode`_ to be
Bin Meng9e816df2014-12-17 15:50:48 +080052loaded on the processor after power up in order to function properly. U-Boot
53has already integrated these as hex dumps in the source tree.
54
Bin Meng5a866522015-06-23 12:18:53 +080055SMP Support
56-----------
57On a multicore system, U-Boot is executed on the bootstrap processor (BSP).
58Additional application processors (AP) can be brought up by U-Boot. In order to
59have an SMP kernel to discover all of the available processors, U-Boot needs to
60prepare configuration tables which contain the multi-CPUs information before
61loading the OS kernel. Currently U-Boot supports generating two types of tables
Bin Meng89ad2bb2019-07-18 00:34:26 -070062for SMP, called Simple Firmware Interface (`SFI`_) and Multi-Processor (`MP`_)
63tables. The writing of these two tables are controlled by two Kconfig
Bin Meng45e3e812015-07-06 16:31:35 +080064options GENERATE_SFI_TABLE and GENERATE_MP_TABLE.
Bin Meng5a866522015-06-23 12:18:53 +080065
Bin Meng9e816df2014-12-17 15:50:48 +080066Driver Model
67------------
Simon Glass2b416fd2016-03-11 22:07:33 -070068x86 has been converted to use driver model for serial, GPIO, SPI, SPI flash,
69keyboard, real-time clock, USB. Video is in progress.
Bin Meng9e816df2014-12-17 15:50:48 +080070
71Device Tree
72-----------
73x86 uses device tree to configure the board thus requires CONFIG_OF_CONTROL to
Bin Meng6c6ec432015-01-06 22:14:24 +080074be turned on. Not every device on the board is configured via device tree, but
Bin Meng9e816df2014-12-17 15:50:48 +080075more and more devices will be added as time goes by. Check out the directory
76arch/x86/dts/ for these device tree source files.
77
Simon Glassfc0ba2d2015-01-01 16:18:15 -070078Useful Commands
79---------------
Simon Glassfc0ba2d2015-01-01 16:18:15 -070080In keeping with the U-Boot philosophy of providing functions to check and
81adjust internal settings, there are several x86-specific commands that may be
82useful:
83
Bin Meng89ad2bb2019-07-18 00:34:26 -070084fsp
85 Display information about Intel Firmware Support Package (FSP).
86 This is only available on platforms which use FSP, mostly Atom.
87iod
88 Display I/O memory
89iow
90 Write I/O memory
91mtrr
92 List and set the Memory Type Range Registers (MTRR). These are used to
93 tell the CPU whether memory is cacheable and if so the cache write
94 mode to use. U-Boot sets up some reasonable values but you can
95 adjust then with this command.
Simon Glassfc0ba2d2015-01-01 16:18:15 -070096
Simon Glassc05168f2015-07-27 15:47:31 -060097Booting Ubuntu
98--------------
99As an example of how to set up your boot flow with U-Boot, here are
100instructions for starting Ubuntu from U-Boot. These instructions have been
Bin Meng0dbbf102016-05-07 07:46:36 -0700101tested on Minnowboard MAX with a SATA drive but are equally applicable on
102other platforms and other media. There are really only four steps and it's a
Simon Glassc05168f2015-07-27 15:47:31 -0600103very simple script, but a more detailed explanation is provided here for
104completeness.
105
106Note: It is possible to set up U-Boot to boot automatically using syslinux.
107It could also use the grub.cfg file (/efi/ubuntu/grub.cfg) to obtain the
108GUID. If you figure these out, please post patches to this README.
109
Bin Meng0dbbf102016-05-07 07:46:36 -0700110Firstly, you will need Ubuntu installed on an available disk. It should be
Simon Glassc05168f2015-07-27 15:47:31 -0600111possible to make U-Boot start a USB start-up disk but for now let's assume
112that you used another boot loader to install Ubuntu.
113
114Use the U-Boot command line to find the UUID of the partition you want to
Bin Meng89ad2bb2019-07-18 00:34:26 -0700115boot. For example our disk is SCSI device 0::
Simon Glassc05168f2015-07-27 15:47:31 -0600116
Bin Meng89ad2bb2019-07-18 00:34:26 -0700117 => part list scsi 0
Simon Glassc05168f2015-07-27 15:47:31 -0600118
Bin Meng89ad2bb2019-07-18 00:34:26 -0700119 Partition Map for SCSI device 0 -- Partition Type: EFI
Simon Glassc05168f2015-07-27 15:47:31 -0600120
Bin Meng89ad2bb2019-07-18 00:34:26 -0700121 Part Start LBA End LBA Name
122 Attributes
123 Type GUID
124 Partition GUID
125 1 0x00000800 0x001007ff ""
126 attrs: 0x0000000000000000
127 type: c12a7328-f81f-11d2-ba4b-00a0c93ec93b
128 guid: 9d02e8e4-4d59-408f-a9b0-fd497bc9291c
129 2 0x00100800 0x037d8fff ""
130 attrs: 0x0000000000000000
131 type: 0fc63daf-8483-4772-8e79-3d69d8477de4
132 guid: 965c59ee-1822-4326-90d2-b02446050059
133 3 0x037d9000 0x03ba27ff ""
134 attrs: 0x0000000000000000
135 type: 0657fd6d-a4ab-43c4-84e5-0933c84b4f4f
136 guid: 2c4282bd-1e82-4bcf-a5ff-51dedbf39f17
137 =>
Simon Glassc05168f2015-07-27 15:47:31 -0600138
139This shows that your SCSI disk has three partitions. The really long hex
140strings are called Globally Unique Identifiers (GUIDs). You can look up the
Bin Meng89ad2bb2019-07-18 00:34:26 -0700141'type' ones `here`_. On this disk the first partition is for EFI and is in
142VFAT format (DOS/Windows)::
Simon Glassc05168f2015-07-27 15:47:31 -0600143
144 => fatls scsi 0:1
145 efi/
146
147 0 file(s), 1 dir(s)
148
149
150Partition 2 is 'Linux filesystem data' so that will be our root disk. It is
Bin Meng89ad2bb2019-07-18 00:34:26 -0700151in ext2 format::
Simon Glassc05168f2015-07-27 15:47:31 -0600152
153 => ext2ls scsi 0:2
154 <DIR> 4096 .
155 <DIR> 4096 ..
156 <DIR> 16384 lost+found
157 <DIR> 4096 boot
158 <DIR> 12288 etc
159 <DIR> 4096 media
160 <DIR> 4096 bin
161 <DIR> 4096 dev
162 <DIR> 4096 home
163 <DIR> 4096 lib
164 <DIR> 4096 lib64
165 <DIR> 4096 mnt
166 <DIR> 4096 opt
167 <DIR> 4096 proc
168 <DIR> 4096 root
169 <DIR> 4096 run
170 <DIR> 12288 sbin
171 <DIR> 4096 srv
172 <DIR> 4096 sys
173 <DIR> 4096 tmp
174 <DIR> 4096 usr
175 <DIR> 4096 var
176 <SYM> 33 initrd.img
177 <SYM> 30 vmlinuz
178 <DIR> 4096 cdrom
179 <SYM> 33 initrd.img.old
180 =>
181
Bin Meng89ad2bb2019-07-18 00:34:26 -0700182and if you look in the /boot directory you will see the kernel::
Simon Glassc05168f2015-07-27 15:47:31 -0600183
184 => ext2ls scsi 0:2 /boot
185 <DIR> 4096 .
186 <DIR> 4096 ..
187 <DIR> 4096 efi
188 <DIR> 4096 grub
189 3381262 System.map-3.13.0-32-generic
190 1162712 abi-3.13.0-32-generic
191 165611 config-3.13.0-32-generic
192 176500 memtest86+.bin
193 178176 memtest86+.elf
194 178680 memtest86+_multiboot.bin
195 5798112 vmlinuz-3.13.0-32-generic
196 165762 config-3.13.0-58-generic
197 1165129 abi-3.13.0-58-generic
198 5823136 vmlinuz-3.13.0-58-generic
199 19215259 initrd.img-3.13.0-58-generic
200 3391763 System.map-3.13.0-58-generic
201 5825048 vmlinuz-3.13.0-58-generic.efi.signed
202 28304443 initrd.img-3.13.0-32-generic
203 =>
204
205The 'vmlinuz' files contain a packaged Linux kernel. The format is a kind of
206self-extracting compressed file mixed with some 'setup' configuration data.
207Despite its size (uncompressed it is >10MB) this only includes a basic set of
208device drivers, enough to boot on most hardware types.
209
210The 'initrd' files contain a RAM disk. This is something that can be loaded
211into RAM and will appear to Linux like a disk. Ubuntu uses this to hold lots
212of drivers for whatever hardware you might have. It is loaded before the
213real root disk is accessed.
214
215The numbers after the end of each file are the version. Here it is Linux
216version 3.13. You can find the source code for this in the Linux tree with
217the tag v3.13. The '.0' allows for additional Linux releases to fix problems,
218but normally this is not needed. The '-58' is used by Ubuntu. Each time they
219release a new kernel they increment this number. New Ubuntu versions might
220include kernel patches to fix reported bugs. Stable kernels can exist for
221some years so this number can get quite high.
222
223The '.efi.signed' kernel is signed for EFI's secure boot. U-Boot has its own
Bin Meng89ad2bb2019-07-18 00:34:26 -0700224secure boot mechanism - see `this`_ & `that`_. It cannot read .efi files
225at present.
Simon Glassc05168f2015-07-27 15:47:31 -0600226
227To boot Ubuntu from U-Boot the steps are as follows:
228
Bin Meng89ad2bb2019-07-18 00:34:26 -07002291. Set up the boot arguments. Use the GUID for the partition you want to boot::
Simon Glassc05168f2015-07-27 15:47:31 -0600230
231 => setenv bootargs root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro
232
233Here root= tells Linux the location of its root disk. The disk is specified
234by its GUID, using '/dev/disk/by-partuuid/', a Linux path to a 'directory'
235containing all the GUIDs Linux has found. When it starts up, there will be a
236file in that directory with this name in it. It is also possible to use a
237device name here, see later.
238
Bin Meng89ad2bb2019-07-18 00:34:26 -07002392. Load the kernel. Since it is an ext2/4 filesystem we can do::
Simon Glassc05168f2015-07-27 15:47:31 -0600240
241 => ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic
242
243The address 30000000 is arbitrary, but there seem to be problems with using
244small addresses (sometimes Linux cannot find the ramdisk). This is 48MB into
245the start of RAM (which is at 0 on x86).
246
Bin Meng89ad2bb2019-07-18 00:34:26 -07002473. Load the ramdisk (to 64MB)::
Simon Glassc05168f2015-07-27 15:47:31 -0600248
249 => ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic
250
2514. Start up the kernel. We need to know the size of the ramdisk, but can use
Bin Meng89ad2bb2019-07-18 00:34:26 -0700252 a variable for that. U-Boot sets 'filesize' to the size of the last file it
253 loaded::
Simon Glassc05168f2015-07-27 15:47:31 -0600254
255 => zboot 03000000 0 04000000 ${filesize}
256
257Type 'help zboot' if you want to see what the arguments are. U-Boot on x86 is
258quite verbose when it boots a kernel. You should see these messages from
Bin Meng89ad2bb2019-07-18 00:34:26 -0700259U-Boot::
Simon Glassc05168f2015-07-27 15:47:31 -0600260
261 Valid Boot Flag
262 Setup Size = 0x00004400
263 Magic signature found
264 Using boot protocol version 2.0c
265 Linux kernel version 3.13.0-58-generic (buildd@allspice) #97-Ubuntu SMP Wed Jul 8 02:56:15 UTC 2015
266 Building boot_params at 0x00090000
267 Loading bzImage at address 100000 (5805728 bytes)
268 Magic signature found
269 Initial RAM disk at linear address 0x04000000, size 19215259 bytes
Bin Meng0dbbf102016-05-07 07:46:36 -0700270 Kernel command line: "root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro"
Simon Glassc05168f2015-07-27 15:47:31 -0600271
272 Starting kernel ...
273
274U-Boot prints out some bootstage timing. This is more useful if you put the
Bin Meng89ad2bb2019-07-18 00:34:26 -0700275above commands into a script since then it will be faster::
Simon Glassc05168f2015-07-27 15:47:31 -0600276
277 Timer summary in microseconds:
278 Mark Elapsed Stage
279 0 0 reset
280 241,535 241,535 board_init_r
281 2,421,611 2,180,076 id=64
282 2,421,790 179 id=65
283 2,428,215 6,425 main_loop
284 48,860,584 46,432,369 start_kernel
285
286 Accumulated time:
287 240,329 ahci
288 1,422,704 vesa display
289
Bin Meng89ad2bb2019-07-18 00:34:26 -0700290Now the kernel actually starts (if you want to examine kernel boot up message on
291the serial console, append "console=ttyS0,115200" to the kernel command line)::
Simon Glassc05168f2015-07-27 15:47:31 -0600292
293 [ 0.000000] Initializing cgroup subsys cpuset
294 [ 0.000000] Initializing cgroup subsys cpu
295 [ 0.000000] Initializing cgroup subsys cpuacct
296 [ 0.000000] Linux version 3.13.0-58-generic (buildd@allspice) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #97-Ubuntu SMP Wed Jul 8 02:56:15 UTC 2015 (Ubuntu 3.13.0-58.97-generic 3.13.11-ckt22)
Bin Meng0dbbf102016-05-07 07:46:36 -0700297 [ 0.000000] Command line: root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro console=ttyS0,115200
Simon Glassc05168f2015-07-27 15:47:31 -0600298
299It continues for a long time. Along the way you will see it pick up your
Bin Meng89ad2bb2019-07-18 00:34:26 -0700300ramdisk::
Simon Glassc05168f2015-07-27 15:47:31 -0600301
302 [ 0.000000] RAMDISK: [mem 0x04000000-0x05253fff]
Bin Meng89ad2bb2019-07-18 00:34:26 -0700303 ...
Simon Glassc05168f2015-07-27 15:47:31 -0600304 [ 0.788540] Trying to unpack rootfs image as initramfs...
305 [ 1.540111] Freeing initrd memory: 18768K (ffff880004000000 - ffff880005254000)
Bin Meng89ad2bb2019-07-18 00:34:26 -0700306 ...
Simon Glassc05168f2015-07-27 15:47:31 -0600307
Bin Meng89ad2bb2019-07-18 00:34:26 -0700308Later it actually starts using it::
Simon Glassc05168f2015-07-27 15:47:31 -0600309
310 Begin: Running /scripts/local-premount ... done.
311
Bin Meng89ad2bb2019-07-18 00:34:26 -0700312You should also see your boot disk turn up::
Simon Glassc05168f2015-07-27 15:47:31 -0600313
314 [ 4.357243] scsi 1:0:0:0: Direct-Access ATA ADATA SP310 5.2 PQ: 0 ANSI: 5
315 [ 4.366860] sd 1:0:0:0: [sda] 62533296 512-byte logical blocks: (32.0 GB/29.8 GiB)
316 [ 4.375677] sd 1:0:0:0: Attached scsi generic sg0 type 0
317 [ 4.381859] sd 1:0:0:0: [sda] Write Protect is off
318 [ 4.387452] sd 1:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
319 [ 4.399535] sda: sda1 sda2 sda3
320
321Linux has found the three partitions (sda1-3). Mercifully it doesn't print out
Bin Meng89ad2bb2019-07-18 00:34:26 -0700322the GUIDs. In step 1 above we could have used::
Simon Glassc05168f2015-07-27 15:47:31 -0600323
324 setenv bootargs root=/dev/sda2 ro
325
326instead of the GUID. However if you add another drive to your board the
327numbering may change whereas the GUIDs will not. So if your boot partition
328becomes sdb2, it will still boot. For embedded systems where you just want to
329boot the first disk, you have that option.
330
331The last thing you will see on the console is mention of plymouth (which
Bin Meng89ad2bb2019-07-18 00:34:26 -0700332displays the Ubuntu start-up screen) and a lot of 'Starting' messages::
Simon Glassc05168f2015-07-27 15:47:31 -0600333
Bin Meng89ad2bb2019-07-18 00:34:26 -0700334 * Starting Mount filesystems on boot [ OK ]
Simon Glassc05168f2015-07-27 15:47:31 -0600335
336After a pause you should see a login screen on your display and you are done.
337
Bin Meng89ad2bb2019-07-18 00:34:26 -0700338If you want to put this in a script you can use something like this::
Simon Glassc05168f2015-07-27 15:47:31 -0600339
340 setenv bootargs root=UUID=b2aaf743-0418-4d90-94cc-3e6108d7d968 ro
341 setenv boot zboot 03000000 0 04000000 \${filesize}
342 setenv bootcmd "ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic; ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic; run boot"
343 saveenv
344
345The \ is to tell the shell not to evaluate ${filesize} as part of the setenv
346command.
347
Simon Glassc05168f2015-07-27 15:47:31 -0600348You can also bake this behaviour into your build by hard-coding the
349environment variables if you add this to minnowmax.h:
350
Bin Meng89ad2bb2019-07-18 00:34:26 -0700351.. code-block:: c
Simon Glassc05168f2015-07-27 15:47:31 -0600352
Bin Meng89ad2bb2019-07-18 00:34:26 -0700353 #undef CONFIG_BOOTCOMMAND
354 #define CONFIG_BOOTCOMMAND \
355 "ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic; " \
356 "ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic; " \
357 "run boot"
Simon Glassc05168f2015-07-27 15:47:31 -0600358
Tom Rinic9edebe2022-12-04 10:03:50 -0500359 #undef CFG_EXTRA_ENV_SETTINGS
360 #define CFG_EXTRA_ENV_SETTINGS "boot=zboot 03000000 0 04000000 ${filesize}"
Sam Protsenkobd7bffe2017-08-14 20:22:17 +0300361
Bin Meng89ad2bb2019-07-18 00:34:26 -0700362and change CONFIG_BOOTARGS value in configs/minnowmax_defconfig to::
363
364 CONFIG_BOOTARGS="root=/dev/sda2 ro"
Sam Protsenkobd7bffe2017-08-14 20:22:17 +0300365
Bin Meng2e266822016-02-28 23:54:52 -0800366Test with SeaBIOS
367-----------------
Bin Meng89ad2bb2019-07-18 00:34:26 -0700368`SeaBIOS`_ is an open source implementation of a 16-bit x86 BIOS. It can run
Bin Meng2e266822016-02-28 23:54:52 -0800369in an emulator or natively on x86 hardware with the use of U-Boot. With its
370help, we can boot some OSes that require 16-bit BIOS services like Windows/DOS.
371
372As U-Boot, we have to manually create a table where SeaBIOS gets various system
373information (eg: E820) from. The table unfortunately has to follow the coreboot
374table format as SeaBIOS currently supports booting as a coreboot payload.
375
376To support loading SeaBIOS, U-Boot should be built with CONFIG_SEABIOS on.
Bin Meng89ad2bb2019-07-18 00:34:26 -0700377Booting SeaBIOS is done via U-Boot's bootelf command, like below::
Bin Meng2e266822016-02-28 23:54:52 -0800378
379 => tftp bios.bin.elf;bootelf
380 Using e1000#0 device
381 TFTP from server 10.10.0.100; our IP address is 10.10.0.108
382 ...
Bin Meng58e58cd2021-08-03 20:50:04 +0800383 Bytes transferred = 128748 (1f6ec hex)
384 ## Starting application at 0x000fd269 ...
385 SeaBIOS (version rel-1.14.0-0-g155821a)
Bin Meng2e266822016-02-28 23:54:52 -0800386 ...
387
Bin Meng58e58cd2021-08-03 20:50:04 +0800388bios.bin.elf is the SeaBIOS image built from SeaBIOS source tree. At the time
389being, SeaBIOS release 1.14.0 has been tested. To build the SeaBIOS image::
Bin Meng2e266822016-02-28 23:54:52 -0800390
Bin Meng58e58cd2021-08-03 20:50:04 +0800391 $ echo -e 'CONFIG_COREBOOT=y\nCONFIG_COREBOOT_FLASH=n\nCONFIG_DEBUG_SERIAL=y\nCONFIG_DEBUG_COREBOOT=n' > .config
392 $ make olddefconfig
Bin Meng2e266822016-02-28 23:54:52 -0800393 $ make
394 ...
Bin Meng58e58cd2021-08-03 20:50:04 +0800395 Total size: 128512 Fixed: 69216 Free: 2560 (used 98.0% of 128KiB rom)
Bin Meng2e266822016-02-28 23:54:52 -0800396 Creating out/bios.bin.elf
397
398Currently this is tested on QEMU x86 target with U-Boot chain-loading SeaBIOS
399to install/boot a Windows XP OS (below for example command to install Windows).
400
Bin Meng89ad2bb2019-07-18 00:34:26 -0700401.. code-block:: none
402
Bin Meng2e266822016-02-28 23:54:52 -0800403 # Create a 10G disk.img as the virtual hard disk
404 $ qemu-img create -f qcow2 disk.img 10G
405
406 # Install a Windows XP OS from an ISO image 'winxp.iso'
407 $ qemu-system-i386 -serial stdio -bios u-boot.rom -hda disk.img -cdrom winxp.iso -smp 2 -m 512
408
409 # Boot a Windows XP OS installed on the virutal hard disk
410 $ qemu-system-i386 -serial stdio -bios u-boot.rom -hda disk.img -smp 2 -m 512
411
412This is also tested on Intel Crown Bay board with a PCIe graphics card, booting
413SeaBIOS then chain-loading a GRUB on a USB drive, then Linux kernel finally.
414
Bin Mengd5eed0d2016-05-11 07:45:06 -0700415If you are using Intel Integrated Graphics Device (IGD) as the primary display
416device on your board, SeaBIOS needs to be patched manually to get its VGA ROM
417loaded and run by SeaBIOS. SeaBIOS locates VGA ROM via the PCI expansion ROM
418register, but IGD device does not have its VGA ROM mapped by this register.
419Its VGA ROM is packaged as part of u-boot.rom at a configurable flash address
420which is unknown to SeaBIOS. An example patch is needed for SeaBIOS below:
421
Bin Meng89ad2bb2019-07-18 00:34:26 -0700422.. code-block:: none
423
424 diff --git a/src/optionroms.c b/src/optionroms.c
425 index 65f7fe0..c7b6f5e 100644
426 --- a/src/optionroms.c
427 +++ b/src/optionroms.c
428 @@ -324,6 +324,8 @@ init_pcirom(struct pci_device *pci, int isvga, u64 *sources)
429 rom = deploy_romfile(file);
430 else if (RunPCIroms > 1 || (RunPCIroms == 1 && isvga))
431 rom = map_pcirom(pci);
432 + if (pci->bdf == pci_to_bdf(0, 2, 0))
433 + rom = (struct rom_header *)0xfff90000;
434 if (! rom)
435 // No ROM present.
436 return;
Bin Mengd5eed0d2016-05-11 07:45:06 -0700437
438Note: the patch above expects IGD device is at PCI b.d.f 0.2.0 and its VGA ROM
439is at 0xfff90000 which corresponds to CONFIG_VGA_BIOS_ADDR on Minnowboard MAX.
440Change these two accordingly if this is not the case on your board.
Simon Glassc05168f2015-07-27 15:47:31 -0600441
Simon Glass5c840ef2015-01-27 22:13:46 -0700442Development Flow
443----------------
Simon Glass5c840ef2015-01-27 22:13:46 -0700444These notes are for those who want to port U-Boot to a new x86 platform.
445
446Since x86 CPUs boot from SPI flash, a SPI flash emulator is a good investment.
Bin Meng89ad2bb2019-07-18 00:34:26 -0700447The Dediprog em100 can be used on Linux.
Simon Glass5c840ef2015-01-27 22:13:46 -0700448
Bin Meng89ad2bb2019-07-18 00:34:26 -0700449The em100 tool is available here: http://review.coreboot.org/p/em100.git
Simon Glass5c840ef2015-01-27 22:13:46 -0700450
Bin Meng89ad2bb2019-07-18 00:34:26 -0700451On Minnowboard Max the following command line can be used::
Simon Glass5c840ef2015-01-27 22:13:46 -0700452
453 sudo em100 -s -p LOW -d u-boot.rom -c W25Q64DW -r
454
455A suitable clip for connecting over the SPI flash chip is here:
Bin Meng89ad2bb2019-07-18 00:34:26 -0700456http://www.dediprog.com/pd/programmer-accessories/EM-TC-8.
Simon Glass5c840ef2015-01-27 22:13:46 -0700457
458This allows you to override the SPI flash contents for development purposes.
459Typically you can write to the em100 in around 1200ms, considerably faster
460than programming the real flash device each time. The only important
461limitation of the em100 is that it only supports SPI bus speeds up to 20MHz.
462This means that images must be set to boot with that speed. This is an
463Intel-specific feature - e.g. tools/ifttool has an option to set the SPI
464speed in the SPI descriptor region.
465
466If your chip/board uses an Intel Firmware Support Package (FSP) it is fairly
467easy to fit it in. You can follow the Minnowboard Max implementation, for
468example. Hopefully you will just need to create new files similar to those
469in arch/x86/cpu/baytrail which provide Bay Trail support.
470
471If you are not using an FSP you have more freedom and more responsibility.
472The ivybridge support works this way, although it still uses a ROM for
473graphics and still has binary blobs containing Intel code. You should aim to
474support all important peripherals on your platform including video and storage.
475Use the device tree for configuration where possible.
476
477For the microcode you can create a suitable device tree file using the
Bin Meng89ad2bb2019-07-18 00:34:26 -0700478microcode tool::
Simon Glass5c840ef2015-01-27 22:13:46 -0700479
Bin Meng89ad2bb2019-07-18 00:34:26 -0700480 ./tools/microcode-tool -d microcode.dat -m <model> create
Simon Glass5c840ef2015-01-27 22:13:46 -0700481
Bin Meng89ad2bb2019-07-18 00:34:26 -0700482or if you only have header files and not the full Intel microcode.dat database::
Simon Glass5c840ef2015-01-27 22:13:46 -0700483
Bin Meng89ad2bb2019-07-18 00:34:26 -0700484 ./tools/microcode-tool -H BAY_TRAIL_FSP_KIT/Microcode/M0130673322.h \
485 -H BAY_TRAIL_FSP_KIT/Microcode/M0130679901.h -m all create
Simon Glass5c840ef2015-01-27 22:13:46 -0700486
487These are written to arch/x86/dts/microcode/ by default.
488
489Note that it is possible to just add the micrcode for your CPU if you know its
Bin Meng89ad2bb2019-07-18 00:34:26 -0700490model. U-Boot prints this information when it starts::
Simon Glass5c840ef2015-01-27 22:13:46 -0700491
492 CPU: x86_64, vendor Intel, device 30673h
493
494so here we can use the M0130673322 file.
495
496If you platform can display POST codes on two little 7-segment displays on
497the board, then you can use post_code() calls from C or assembler to monitor
498boot progress. This can be good for debugging.
499
500If not, you can try to get serial working as early as possible. The early
Stefan Roesea377b7c2016-01-19 14:24:12 +0100501debug serial port may be useful here. See setup_internal_uart() for an example.
Simon Glass5c840ef2015-01-27 22:13:46 -0700502
Bin Mengcdee6d92015-08-02 20:33:35 -0700503During the U-Boot porting, one of the important steps is to write correct PIRQ
504routing information in the board device tree. Without it, device drivers in the
505Linux kernel won't function correctly due to interrupt is not working. Please
Bin Meng89ad2bb2019-07-18 00:34:26 -0700506refer to U-Boot `doc <doc/device-tree-bindings/misc/intel,irq-router.txt>`_ for
507the device tree bindings of Intel interrupt router. Here we have more details
508on the intel,pirq-routing property below.
509
510.. code-block:: none
Bin Mengcdee6d92015-08-02 20:33:35 -0700511
512 intel,pirq-routing = <
513 PCI_BDF(0, 2, 0) INTA PIRQA
514 ...
515 >;
516
517As you see each entry has 3 cells. For the first one, we need describe all pci
518devices mounted on the board. For SoC devices, normally there is a chapter on
519the chipset datasheet which lists all the available PCI devices. For example on
520Bay Trail, this is chapter 4.3 (PCI configuration space). For the second one, we
521can get the interrupt pin either from datasheet or hardware via U-Boot shell.
522The reliable source is the hardware as sometimes chipset datasheet is not 100%
523up-to-date. Type 'pci header' plus the device's pci bus/device/function number
Bin Meng89ad2bb2019-07-18 00:34:26 -0700524from U-Boot shell below::
Bin Mengcdee6d92015-08-02 20:33:35 -0700525
526 => pci header 0.1e.1
527 vendor ID = 0x8086
528 device ID = 0x0f08
529 ...
530 interrupt line = 0x09
531 interrupt pin = 0x04
532 ...
533
534It shows this PCI device is using INTD pin as it reports 4 in the interrupt pin
535register. Repeat this until you get interrupt pins for all the devices. The last
536cell is the PIRQ line which a particular interrupt pin is mapped to. On Intel
537chipset, the power-up default mapping is INTA/B/C/D maps to PIRQA/B/C/D. This
538can be changed by registers in LPC bridge. So far Intel FSP does not touch those
539registers so we can write down the PIRQ according to the default mapping rule.
540
541Once we get the PIRQ routing information in the device tree, the interrupt
542allocation and assignment will be done by U-Boot automatically. Now you can
543enable CONFIG_GENERATE_PIRQ_TABLE for testing Linux kernel using i8259 PIC and
544CONFIG_GENERATE_MP_TABLE for testing Linux kernel using local APIC and I/O APIC.
545
Simon Glasse3170a12015-08-13 10:36:17 -0600546This script might be useful. If you feed it the output of 'pci long' from
547U-Boot then it will generate a device tree fragment with the interrupt
Bin Meng89ad2bb2019-07-18 00:34:26 -0700548configuration for each device (note it needs gawk 4.0.0)::
Simon Glasse3170a12015-08-13 10:36:17 -0600549
550 $ cat console_output |awk '/PCI/ {device=$4} /interrupt line/ {line=$4} \
551 /interrupt pin/ {pin = $4; if (pin != "0x00" && pin != "0xff") \
552 {patsplit(device, bdf, "[0-9a-f]+"); \
553 printf "PCI_BDF(%d, %d, %d) INT%c PIRQ%c\n", strtonum("0x" bdf[1]), \
554 strtonum("0x" bdf[2]), bdf[3], strtonum(pin) + 64, 64 + strtonum(pin)}}'
555
Bin Meng89ad2bb2019-07-18 00:34:26 -0700556Example output::
557
Simon Glasse3170a12015-08-13 10:36:17 -0600558 PCI_BDF(0, 2, 0) INTA PIRQA
559 PCI_BDF(0, 3, 0) INTA PIRQA
Bin Meng89ad2bb2019-07-18 00:34:26 -0700560 ...
Simon Glasse3170a12015-08-13 10:36:17 -0600561
Bin Meng213f6f02015-09-09 23:20:29 -0700562Porting Hints
563-------------
564
Bin Meng89ad2bb2019-07-18 00:34:26 -0700565Quark-specific considerations
566^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Bin Meng213f6f02015-09-09 23:20:29 -0700567
568To port U-Boot to other boards based on the Intel Quark SoC, a few things need
569to be taken care of. The first important part is the Memory Reference Code (MRC)
570parameters. Quark MRC supports memory-down configuration only. All these MRC
571parameters are supplied via the board device tree. To get started, first copy
572the MRC section of arch/x86/dts/galileo.dts to your board's device tree, then
573change these values by consulting board manuals or your hardware vendor.
574Available MRC parameter values are listed in include/dt-bindings/mrc/quark.h.
575The other tricky part is with PCIe. Quark SoC integrates two PCIe root ports,
576but by default they are held in reset after power on. In U-Boot, PCIe
577initialization is properly handled as per Quark's firmware writer guide.
578In your board support codes, you need provide two routines to aid PCIe
579initialization, which are board_assert_perst() and board_deassert_perst().
580The two routines need implement a board-specific mechanism to assert/deassert
581PCIe PERST# pin. Care must be taken that in those routines that any APIs that
582may trigger PCI enumeration process are strictly forbidden, as any access to
583PCIe root port's configuration registers will cause system hang while it is
584held in reset. For more details, check how they are implemented by the Intel
585Galileo board support codes in board/intel/galileo/galileo.c.
586
Bin Meng89ad2bb2019-07-18 00:34:26 -0700587coreboot
588^^^^^^^^
Simon Glass15318f22016-03-06 19:28:17 -0700589
590See scripts/coreboot.sed which can assist with porting coreboot code into
591U-Boot drivers. It will not resolve all build errors, but will perform common
592transformations. Remember to add attribution to coreboot for new files added
593to U-Boot. This should go at the top of each file and list the coreboot
594filename where the code originated.
595
Bin Meng89ad2bb2019-07-18 00:34:26 -0700596Debugging ACPI issues with Windows
597^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Bin Mengf2071ba2016-05-11 07:45:12 -0700598
599Windows might cache system information and only detect ACPI changes if you
600modify the ACPI table versions. So tweak them liberally when debugging ACPI
601issues with Windows.
602
Bin Meng4258f802016-05-07 07:46:37 -0700603ACPI Support Status
604-------------------
Bin Meng89ad2bb2019-07-18 00:34:26 -0700605Advanced Configuration and Power Interface (`ACPI`_) aims to establish
Bin Meng4258f802016-05-07 07:46:37 -0700606industry-standard interfaces enabling OS-directed configuration, power
607management, and thermal management of mobile, desktop, and server platforms.
608
609Linux can boot without ACPI with "acpi=off" command line parameter, but
610with ACPI the kernel gains the capabilities to handle power management.
611For Windows, ACPI is a must-have firmware feature since Windows Vista.
612CONFIG_GENERATE_ACPI_TABLE is the config option to turn on ACPI support in
613U-Boot. This requires Intel ACPI compiler to be installed on your host to
614compile ACPI DSDT table written in ASL format to AML format. You can get
615the compiler via "apt-get install iasl" if you are on Ubuntu or download
Bin Meng89ad2bb2019-07-18 00:34:26 -0700616the source from https://www.acpica.org/downloads to compile one by yourself.
Bin Meng4258f802016-05-07 07:46:37 -0700617
Bin Meng487b8e82017-04-21 07:24:49 -0700618Current ACPI support in U-Boot is basically complete. More optional features
619can be added in the future. The status as of today is:
Bin Meng4258f802016-05-07 07:46:37 -0700620
621 * Support generating RSDT, XSDT, FACS, FADT, MADT, MCFG tables.
622 * Support one static DSDT table only, compiled by Intel ACPI compiler.
Bin Meng487b8e82017-04-21 07:24:49 -0700623 * Support S0/S3/S4/S5, reboot and shutdown from OS.
Bin Meng4258f802016-05-07 07:46:37 -0700624 * Support booting a pre-installed Ubuntu distribution via 'zboot' command.
Bin Meng65b2e9e2016-05-11 07:45:08 -0700625 * Support installing and booting Ubuntu 14.04 (or above) from U-Boot with
626 the help of SeaBIOS using legacy interface (non-UEFI mode).
627 * Support installing and booting Windows 8.1/10 from U-Boot with the help
628 of SeaBIOS using legacy interface (non-UEFI mode).
Bin Meng4258f802016-05-07 07:46:37 -0700629 * Support ACPI interrupts with SCI only.
630
Bin Meng4258f802016-05-07 07:46:37 -0700631Features that are optional:
Bin Meng89ad2bb2019-07-18 00:34:26 -0700632
Bin Meng4258f802016-05-07 07:46:37 -0700633 * Dynamic AML bytecodes insertion at run-time. We may need this to support
634 SSDT table generation and DSDT fix up.
635 * SMI support. Since U-Boot is a modern bootloader, we don't want to bring
636 those legacy stuff into U-Boot. ACPI spec allows a system that does not
637 support SMI (a legacy-free system).
638
Bin Mengedf82402016-05-25 19:19:12 -0700639ACPI was initially enabled on BayTrail based boards. Testing was done by booting
Bin Meng65b2e9e2016-05-11 07:45:08 -0700640a pre-installed Ubuntu 14.04 from a SATA drive. Installing Ubuntu 14.04 and
641Windows 8.1/10 to a SATA drive and booting from there is also tested. Most
642devices seem to work correctly and the board can respond a reboot/shutdown
643command from the OS.
Simon Glass15318f22016-03-06 19:28:17 -0700644
Bin Mengedf82402016-05-25 19:19:12 -0700645For other platform boards, ACPI support status can be checked by examining their
646board defconfig files to see if CONFIG_GENERATE_ACPI_TABLE is set to y.
647
Bin Meng487b8e82017-04-21 07:24:49 -0700648The S3 sleeping state is a low wake latency sleeping state defined by ACPI
649spec where all system context is lost except system memory. To test S3 resume
650with a Linux kernel, simply run "echo mem > /sys/power/state" and kernel will
651put the board to S3 state where the power is off. So when the power button is
652pressed again, U-Boot runs as it does in cold boot and detects the sleeping
653state via ACPI register to see if it is S3, if yes it means we are waking up.
654U-Boot is responsible for restoring the machine state as it is before sleep.
655When everything is done, U-Boot finds out the wakeup vector provided by OSes
656and jump there. To determine whether ACPI S3 resume is supported, check to
657see if CONFIG_HAVE_ACPI_RESUME is set for that specific board.
658
659Note for testing S3 resume with Windows, correct graphics driver must be
660installed for your platform, otherwise you won't find "Sleep" option in
661the "Power" submenu from the Windows start menu.
662
Simon Glass669881b2016-07-17 01:23:45 -0600663EFI Support
664-----------
665U-Boot supports booting as a 32-bit or 64-bit EFI payload, e.g. with UEFI.
Bin Meng706db822018-06-12 08:36:13 -0700666This is enabled with CONFIG_EFI_STUB to boot from both 32-bit and 64-bit
667UEFI BIOS. U-Boot can also run as an EFI application, with CONFIG_EFI_APP.
Bin Meng9cf307a2018-06-27 20:38:05 -0700668The CONFIG_EFI_LOADER option, where U-Boot provides an EFI environment to
Bin Meng706db822018-06-12 08:36:13 -0700669the kernel (i.e. replaces UEFI completely but provides the same EFI run-time
Bin Meng9cf307a2018-06-27 20:38:05 -0700670services) is supported too. For example, we can even use 'bootefi' command
671to load a 'u-boot-payload.efi', see below test logs on QEMU.
672
Bin Meng89ad2bb2019-07-18 00:34:26 -0700673.. code-block:: none
674
Bin Meng9cf307a2018-06-27 20:38:05 -0700675 => load ide 0 3000000 u-boot-payload.efi
676 489787 bytes read in 138 ms (3.4 MiB/s)
677 => bootefi 3000000
678 Scanning disk ide.blk#0...
679 Found 2 disks
680 WARNING: booting without device tree
681 ## Starting EFI application at 03000000 ...
682 U-Boot EFI Payload
683
684
685 U-Boot 2018.07-rc2 (Jun 23 2018 - 17:12:58 +0800)
686
687 CPU: x86_64, vendor AMD, device 663h
688 DRAM: 2 GiB
689 MMC:
690 Video: 1024x768x32
691 Model: EFI x86 Payload
692 Net: e1000: 52:54:00:12:34:56
693
694 Warning: e1000#0 using MAC address from ROM
695 eth0: e1000#0
696 No controllers found
697 Hit any key to stop autoboot: 0
Simon Glass669881b2016-07-17 01:23:45 -0600698
Simon Glassdcc6b792021-03-18 20:25:11 +1300699See :doc:`../develop/uefi/u-boot_on_efi` and :doc:`../develop/uefi/uefi` for
700details of EFI support in U-Boot.
Simon Glass669881b2016-07-17 01:23:45 -0600701
Simon Glass802d88e2020-04-26 09:13:01 -0600702Chain-loading
703-------------
704U-Boot can be chain-loaded from another bootloader, such as coreboot or
705Slim Bootloader. Typically this is done by building for targets 'coreboot' or
706'slimbootloader'.
707
708For example, at present we have a 'coreboot' target but this runs very
709different code from the bare-metal targets, such as coral. There is very little
710in common between them.
711
712It is useful to be able to boot the same U-Boot on a device, with or without a
713first-stage bootloader. For example, with chromebook_coral, it is helpful for
714testing to be able to boot the same U-Boot (complete with FSP) on bare metal
715and from coreboot. It allows checking of things like CPU speed, comparing
716registers, ACPI tables and the like.
717
718To do this you can use ll_boot_init() in appropriate places to skip init that
719has already been done by the previous stage. This works by setting a
720GD_FLG_NO_LL_INIT flag when U-Boot detects that it is running from another
721bootloader.
722
723With this feature, you can build a bare-metal target and boot it from
724coreboot, for example.
725
726Note that this is a development feature only. It is not intended for use in
727production environments. Also it is not currently part of the automated tests
728so may break in the future.
729
Simon Glass31d187d2020-11-05 06:32:10 -0700730SMBIOS tables
731-------------
732
733To generate SMBIOS tables in U-Boot, for use by the OS, enable the
734CONFIG_GENERATE_SMBIOS_TABLE option. The easiest way to provide the values to
735use is via the device tree. For details see
Heinrich Schuchardtaf326e32022-02-16 07:59:31 +0100736:download:`smbios.txt <../device-tree-bindings/sysinfo/smbios.txt>`.
Simon Glass31d187d2020-11-05 06:32:10 -0700737
Bin Meng9e816df2014-12-17 15:50:48 +0800738TODO List
739---------
Bin Meng9e816df2014-12-17 15:50:48 +0800740- Audio
741- Chrome OS verified boot
Bin Meng9e816df2014-12-17 15:50:48 +0800742
Bin Meng89ad2bb2019-07-18 00:34:26 -0700743.. _coreboot: http://www.coreboot.org
744.. _QEMU: http://www.qemu.org
745.. _microcode: http://en.wikipedia.org/wiki/Microcode
746.. _SFI: http://simplefirmware.org
747.. _MP: http://www.intel.com/design/archives/processors/pro/docs/242016.htm
748.. _here: https://en.wikipedia.org/wiki/GUID_Partition_Table
749.. _this: http://events.linuxfoundation.org/sites/events/files/slides/chromeos_and_diy_vboot_0.pdf
750.. _that: http://events.linuxfoundation.org/sites/events/files/slides/elce-2014.pdf
751.. _SeaBIOS: http://www.seabios.org/SeaBIOS
752.. _ACPI: http://www.acpi.info