Commit a70e2aceeb273c9725c916019c24fecd398d9d97

Authored by Bin Meng
Committed by Tom Rini
1 parent e3b800a117

doc: arch: Convert README.x86 to reST

Convert plain text documentation to reStructuredText format and add
it to Sphinx TOC tree. No essential content change.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>

Showing 3 changed files with 729 additions and 722 deletions Side-by-side Diff

doc/README.x86
1   -# SPDX-License-Identifier: GPL-2.0+
2   -#
3   -# Copyright (C) 2014, Simon Glass <sjg@chromium.org>
4   -# Copyright (C) 2014, Bin Meng <bmeng.cn@gmail.com>
5   -
6   -U-Boot on x86
7   -=============
8   -
9   -This document describes the information about U-Boot running on x86 targets,
10   -including supported boards, build instructions, todo list, etc.
11   -
12   -Status
13   -------
14   -U-Boot supports running as a coreboot [1] payload on x86. So far only Link
15   -(Chromebook Pixel) and QEMU [2] x86 targets have been tested, but it should
16   -work with minimal adjustments on other x86 boards since coreboot deals with
17   -most of the low-level details.
18   -
19   -U-Boot is a main bootloader on Intel Edison board.
20   -
21   -U-Boot also supports booting directly from x86 reset vector, without coreboot.
22   -In this case, known as bare mode, from the fact that it runs on the
23   -'bare metal', U-Boot acts like a BIOS replacement. The following platforms
24   -are supported:
25   -
26   - - Bayley Bay CRB
27   - - Cherry Hill CRB
28   - - Congatec QEVAL 2.0 & conga-QA3/E3845
29   - - Cougar Canyon 2 CRB
30   - - Crown Bay CRB
31   - - Galileo
32   - - Link (Chromebook Pixel)
33   - - Minnowboard MAX
34   - - Samus (Chromebook Pixel 2015)
35   - - QEMU x86 (32-bit & 64-bit)
36   -
37   -As for loading an OS, U-Boot supports directly booting a 32-bit or 64-bit
38   -Linux kernel as part of a FIT image. It also supports a compressed zImage.
39   -U-Boot supports loading an x86 VxWorks kernel. Please check README.vxworks
40   -for more details.
41   -
42   -Build Instructions for U-Boot as BIOS replacement (bare mode)
43   --------------------------------------------------------------
44   -Building a ROM version of U-Boot (hereafter referred to as u-boot.rom) is a
45   -little bit tricky, as generally it requires several binary blobs which are not
46   -shipped in the U-Boot source tree. Due to this reason, the u-boot.rom build is
47   -not turned on by default in the U-Boot source tree. Firstly, you need turn it
48   -on by enabling the ROM build either via an environment variable
49   -
50   - $ export BUILD_ROM=y
51   -
52   -or via configuration
53   -
54   - CONFIG_BUILD_ROM=y
55   -
56   -Both tell the Makefile to build u-boot.rom as a target.
57   -
58   ----
59   -
60   -CPU Microcode
61   --------------
62   -Modern CPUs usually require a special bit stream called microcode [8] to be
63   -loaded on the processor after power up in order to function properly. U-Boot
64   -has already integrated these as hex dumps in the source tree.
65   -
66   -SMP Support
67   ------------
68   -On a multicore system, U-Boot is executed on the bootstrap processor (BSP).
69   -Additional application processors (AP) can be brought up by U-Boot. In order to
70   -have an SMP kernel to discover all of the available processors, U-Boot needs to
71   -prepare configuration tables which contain the multi-CPUs information before
72   -loading the OS kernel. Currently U-Boot supports generating two types of tables
73   -for SMP, called Simple Firmware Interface (SFI) [9] and Multi-Processor (MP)
74   -[10] tables. The writing of these two tables are controlled by two Kconfig
75   -options GENERATE_SFI_TABLE and GENERATE_MP_TABLE.
76   -
77   -Driver Model
78   -------------
79   -x86 has been converted to use driver model for serial, GPIO, SPI, SPI flash,
80   -keyboard, real-time clock, USB. Video is in progress.
81   -
82   -Device Tree
83   ------------
84   -x86 uses device tree to configure the board thus requires CONFIG_OF_CONTROL to
85   -be turned on. Not every device on the board is configured via device tree, but
86   -more and more devices will be added as time goes by. Check out the directory
87   -arch/x86/dts/ for these device tree source files.
88   -
89   -Useful Commands
90   ----------------
91   -In keeping with the U-Boot philosophy of providing functions to check and
92   -adjust internal settings, there are several x86-specific commands that may be
93   -useful:
94   -
95   -fsp - Display information about Intel Firmware Support Package (FSP).
96   - This is only available on platforms which use FSP, mostly Atom.
97   -iod - Display I/O memory
98   -iow - Write I/O memory
99   -mtrr - List and set the Memory Type Range Registers (MTRR). These are used to
100   - tell the CPU whether memory is cacheable and if so the cache write
101   - mode to use. U-Boot sets up some reasonable values but you can
102   - adjust then with this command.
103   -
104   -Booting Ubuntu
105   ---------------
106   -As an example of how to set up your boot flow with U-Boot, here are
107   -instructions for starting Ubuntu from U-Boot. These instructions have been
108   -tested on Minnowboard MAX with a SATA drive but are equally applicable on
109   -other platforms and other media. There are really only four steps and it's a
110   -very simple script, but a more detailed explanation is provided here for
111   -completeness.
112   -
113   -Note: It is possible to set up U-Boot to boot automatically using syslinux.
114   -It could also use the grub.cfg file (/efi/ubuntu/grub.cfg) to obtain the
115   -GUID. If you figure these out, please post patches to this README.
116   -
117   -Firstly, you will need Ubuntu installed on an available disk. It should be
118   -possible to make U-Boot start a USB start-up disk but for now let's assume
119   -that you used another boot loader to install Ubuntu.
120   -
121   -Use the U-Boot command line to find the UUID of the partition you want to
122   -boot. For example our disk is SCSI device 0:
123   -
124   -=> part list scsi 0
125   -
126   -Partition Map for SCSI device 0 -- Partition Type: EFI
127   -
128   - Part Start LBA End LBA Name
129   - Attributes
130   - Type GUID
131   - Partition GUID
132   - 1 0x00000800 0x001007ff ""
133   - attrs: 0x0000000000000000
134   - type: c12a7328-f81f-11d2-ba4b-00a0c93ec93b
135   - guid: 9d02e8e4-4d59-408f-a9b0-fd497bc9291c
136   - 2 0x00100800 0x037d8fff ""
137   - attrs: 0x0000000000000000
138   - type: 0fc63daf-8483-4772-8e79-3d69d8477de4
139   - guid: 965c59ee-1822-4326-90d2-b02446050059
140   - 3 0x037d9000 0x03ba27ff ""
141   - attrs: 0x0000000000000000
142   - type: 0657fd6d-a4ab-43c4-84e5-0933c84b4f4f
143   - guid: 2c4282bd-1e82-4bcf-a5ff-51dedbf39f17
144   - =>
145   -
146   -This shows that your SCSI disk has three partitions. The really long hex
147   -strings are called Globally Unique Identifiers (GUIDs). You can look up the
148   -'type' ones here [11]. On this disk the first partition is for EFI and is in
149   -VFAT format (DOS/Windows):
150   -
151   - => fatls scsi 0:1
152   - efi/
153   -
154   - 0 file(s), 1 dir(s)
155   -
156   -
157   -Partition 2 is 'Linux filesystem data' so that will be our root disk. It is
158   -in ext2 format:
159   -
160   - => ext2ls scsi 0:2
161   - <DIR> 4096 .
162   - <DIR> 4096 ..
163   - <DIR> 16384 lost+found
164   - <DIR> 4096 boot
165   - <DIR> 12288 etc
166   - <DIR> 4096 media
167   - <DIR> 4096 bin
168   - <DIR> 4096 dev
169   - <DIR> 4096 home
170   - <DIR> 4096 lib
171   - <DIR> 4096 lib64
172   - <DIR> 4096 mnt
173   - <DIR> 4096 opt
174   - <DIR> 4096 proc
175   - <DIR> 4096 root
176   - <DIR> 4096 run
177   - <DIR> 12288 sbin
178   - <DIR> 4096 srv
179   - <DIR> 4096 sys
180   - <DIR> 4096 tmp
181   - <DIR> 4096 usr
182   - <DIR> 4096 var
183   - <SYM> 33 initrd.img
184   - <SYM> 30 vmlinuz
185   - <DIR> 4096 cdrom
186   - <SYM> 33 initrd.img.old
187   - =>
188   -
189   -and if you look in the /boot directory you will see the kernel:
190   -
191   - => ext2ls scsi 0:2 /boot
192   - <DIR> 4096 .
193   - <DIR> 4096 ..
194   - <DIR> 4096 efi
195   - <DIR> 4096 grub
196   - 3381262 System.map-3.13.0-32-generic
197   - 1162712 abi-3.13.0-32-generic
198   - 165611 config-3.13.0-32-generic
199   - 176500 memtest86+.bin
200   - 178176 memtest86+.elf
201   - 178680 memtest86+_multiboot.bin
202   - 5798112 vmlinuz-3.13.0-32-generic
203   - 165762 config-3.13.0-58-generic
204   - 1165129 abi-3.13.0-58-generic
205   - 5823136 vmlinuz-3.13.0-58-generic
206   - 19215259 initrd.img-3.13.0-58-generic
207   - 3391763 System.map-3.13.0-58-generic
208   - 5825048 vmlinuz-3.13.0-58-generic.efi.signed
209   - 28304443 initrd.img-3.13.0-32-generic
210   - =>
211   -
212   -The 'vmlinuz' files contain a packaged Linux kernel. The format is a kind of
213   -self-extracting compressed file mixed with some 'setup' configuration data.
214   -Despite its size (uncompressed it is >10MB) this only includes a basic set of
215   -device drivers, enough to boot on most hardware types.
216   -
217   -The 'initrd' files contain a RAM disk. This is something that can be loaded
218   -into RAM and will appear to Linux like a disk. Ubuntu uses this to hold lots
219   -of drivers for whatever hardware you might have. It is loaded before the
220   -real root disk is accessed.
221   -
222   -The numbers after the end of each file are the version. Here it is Linux
223   -version 3.13. You can find the source code for this in the Linux tree with
224   -the tag v3.13. The '.0' allows for additional Linux releases to fix problems,
225   -but normally this is not needed. The '-58' is used by Ubuntu. Each time they
226   -release a new kernel they increment this number. New Ubuntu versions might
227   -include kernel patches to fix reported bugs. Stable kernels can exist for
228   -some years so this number can get quite high.
229   -
230   -The '.efi.signed' kernel is signed for EFI's secure boot. U-Boot has its own
231   -secure boot mechanism - see [12] [13] and cannot read .efi files at present.
232   -
233   -To boot Ubuntu from U-Boot the steps are as follows:
234   -
235   -1. Set up the boot arguments. Use the GUID for the partition you want to
236   -boot:
237   -
238   - => setenv bootargs root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro
239   -
240   -Here root= tells Linux the location of its root disk. The disk is specified
241   -by its GUID, using '/dev/disk/by-partuuid/', a Linux path to a 'directory'
242   -containing all the GUIDs Linux has found. When it starts up, there will be a
243   -file in that directory with this name in it. It is also possible to use a
244   -device name here, see later.
245   -
246   -2. Load the kernel. Since it is an ext2/4 filesystem we can do:
247   -
248   - => ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic
249   -
250   -The address 30000000 is arbitrary, but there seem to be problems with using
251   -small addresses (sometimes Linux cannot find the ramdisk). This is 48MB into
252   -the start of RAM (which is at 0 on x86).
253   -
254   -3. Load the ramdisk (to 64MB):
255   -
256   - => ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic
257   -
258   -4. Start up the kernel. We need to know the size of the ramdisk, but can use
259   -a variable for that. U-Boot sets 'filesize' to the size of the last file it
260   -loaded.
261   -
262   - => zboot 03000000 0 04000000 ${filesize}
263   -
264   -Type 'help zboot' if you want to see what the arguments are. U-Boot on x86 is
265   -quite verbose when it boots a kernel. You should see these messages from
266   -U-Boot:
267   -
268   - Valid Boot Flag
269   - Setup Size = 0x00004400
270   - Magic signature found
271   - Using boot protocol version 2.0c
272   - Linux kernel version 3.13.0-58-generic (buildd@allspice) #97-Ubuntu SMP Wed Jul 8 02:56:15 UTC 2015
273   - Building boot_params at 0x00090000
274   - Loading bzImage at address 100000 (5805728 bytes)
275   - Magic signature found
276   - Initial RAM disk at linear address 0x04000000, size 19215259 bytes
277   - Kernel command line: "root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro"
278   -
279   - Starting kernel ...
280   -
281   -U-Boot prints out some bootstage timing. This is more useful if you put the
282   -above commands into a script since then it will be faster.
283   -
284   - Timer summary in microseconds:
285   - Mark Elapsed Stage
286   - 0 0 reset
287   - 241,535 241,535 board_init_r
288   - 2,421,611 2,180,076 id=64
289   - 2,421,790 179 id=65
290   - 2,428,215 6,425 main_loop
291   - 48,860,584 46,432,369 start_kernel
292   -
293   - Accumulated time:
294   - 240,329 ahci
295   - 1,422,704 vesa display
296   -
297   -Now the kernel actually starts: (if you want to examine kernel boot up message
298   -on the serial console, append "console=ttyS0,115200" to the kernel command line)
299   -
300   - [ 0.000000] Initializing cgroup subsys cpuset
301   - [ 0.000000] Initializing cgroup subsys cpu
302   - [ 0.000000] Initializing cgroup subsys cpuacct
303   - [ 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)
304   - [ 0.000000] Command line: root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro console=ttyS0,115200
305   -
306   -It continues for a long time. Along the way you will see it pick up your
307   -ramdisk:
308   -
309   - [ 0.000000] RAMDISK: [mem 0x04000000-0x05253fff]
310   -...
311   - [ 0.788540] Trying to unpack rootfs image as initramfs...
312   - [ 1.540111] Freeing initrd memory: 18768K (ffff880004000000 - ffff880005254000)
313   -...
314   -
315   -Later it actually starts using it:
316   -
317   - Begin: Running /scripts/local-premount ... done.
318   -
319   -You should also see your boot disk turn up:
320   -
321   - [ 4.357243] scsi 1:0:0:0: Direct-Access ATA ADATA SP310 5.2 PQ: 0 ANSI: 5
322   - [ 4.366860] sd 1:0:0:0: [sda] 62533296 512-byte logical blocks: (32.0 GB/29.8 GiB)
323   - [ 4.375677] sd 1:0:0:0: Attached scsi generic sg0 type 0
324   - [ 4.381859] sd 1:0:0:0: [sda] Write Protect is off
325   - [ 4.387452] sd 1:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
326   - [ 4.399535] sda: sda1 sda2 sda3
327   -
328   -Linux has found the three partitions (sda1-3). Mercifully it doesn't print out
329   -the GUIDs. In step 1 above we could have used:
330   -
331   - setenv bootargs root=/dev/sda2 ro
332   -
333   -instead of the GUID. However if you add another drive to your board the
334   -numbering may change whereas the GUIDs will not. So if your boot partition
335   -becomes sdb2, it will still boot. For embedded systems where you just want to
336   -boot the first disk, you have that option.
337   -
338   -The last thing you will see on the console is mention of plymouth (which
339   -displays the Ubuntu start-up screen) and a lot of 'Starting' messages:
340   -
341   - * Starting Mount filesystems on boot [ OK ]
342   -
343   -After a pause you should see a login screen on your display and you are done.
344   -
345   -If you want to put this in a script you can use something like this:
346   -
347   - setenv bootargs root=UUID=b2aaf743-0418-4d90-94cc-3e6108d7d968 ro
348   - setenv boot zboot 03000000 0 04000000 \${filesize}
349   - 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"
350   - saveenv
351   -
352   -The \ is to tell the shell not to evaluate ${filesize} as part of the setenv
353   -command.
354   -
355   -You can also bake this behaviour into your build by hard-coding the
356   -environment variables if you add this to minnowmax.h:
357   -
358   -#undef CONFIG_BOOTCOMMAND
359   -#define CONFIG_BOOTCOMMAND \
360   - "ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic; " \
361   - "ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic; " \
362   - "run boot"
363   -
364   -#undef CONFIG_EXTRA_ENV_SETTINGS
365   -#define CONFIG_EXTRA_ENV_SETTINGS "boot=zboot 03000000 0 04000000 ${filesize}"
366   -
367   -and change CONFIG_BOOTARGS value in configs/minnowmax_defconfig to:
368   -
369   -CONFIG_BOOTARGS="root=/dev/sda2 ro"
370   -
371   -Test with SeaBIOS
372   ------------------
373   -SeaBIOS [14] is an open source implementation of a 16-bit x86 BIOS. It can run
374   -in an emulator or natively on x86 hardware with the use of U-Boot. With its
375   -help, we can boot some OSes that require 16-bit BIOS services like Windows/DOS.
376   -
377   -As U-Boot, we have to manually create a table where SeaBIOS gets various system
378   -information (eg: E820) from. The table unfortunately has to follow the coreboot
379   -table format as SeaBIOS currently supports booting as a coreboot payload.
380   -
381   -To support loading SeaBIOS, U-Boot should be built with CONFIG_SEABIOS on.
382   -Booting SeaBIOS is done via U-Boot's bootelf command, like below:
383   -
384   - => tftp bios.bin.elf;bootelf
385   - Using e1000#0 device
386   - TFTP from server 10.10.0.100; our IP address is 10.10.0.108
387   - ...
388   - Bytes transferred = 122124 (1dd0c hex)
389   - ## Starting application at 0x000ff06e ...
390   - SeaBIOS (version rel-1.9.0)
391   - ...
392   -
393   -bios.bin.elf is the SeaBIOS image built from SeaBIOS source tree.
394   -Make sure it is built as follows:
395   -
396   - $ make menuconfig
397   -
398   -Inside the "General Features" menu, select "Build for coreboot" as the
399   -"Build Target". Inside the "Debugging" menu, turn on "Serial port debugging"
400   -so that we can see something as soon as SeaBIOS boots. Leave other options
401   -as in their default state. Then,
402   -
403   - $ make
404   - ...
405   - Total size: 121888 Fixed: 66496 Free: 9184 (used 93.0% of 128KiB rom)
406   - Creating out/bios.bin.elf
407   -
408   -Currently this is tested on QEMU x86 target with U-Boot chain-loading SeaBIOS
409   -to install/boot a Windows XP OS (below for example command to install Windows).
410   -
411   - # Create a 10G disk.img as the virtual hard disk
412   - $ qemu-img create -f qcow2 disk.img 10G
413   -
414   - # Install a Windows XP OS from an ISO image 'winxp.iso'
415   - $ qemu-system-i386 -serial stdio -bios u-boot.rom -hda disk.img -cdrom winxp.iso -smp 2 -m 512
416   -
417   - # Boot a Windows XP OS installed on the virutal hard disk
418   - $ qemu-system-i386 -serial stdio -bios u-boot.rom -hda disk.img -smp 2 -m 512
419   -
420   -This is also tested on Intel Crown Bay board with a PCIe graphics card, booting
421   -SeaBIOS then chain-loading a GRUB on a USB drive, then Linux kernel finally.
422   -
423   -If you are using Intel Integrated Graphics Device (IGD) as the primary display
424   -device on your board, SeaBIOS needs to be patched manually to get its VGA ROM
425   -loaded and run by SeaBIOS. SeaBIOS locates VGA ROM via the PCI expansion ROM
426   -register, but IGD device does not have its VGA ROM mapped by this register.
427   -Its VGA ROM is packaged as part of u-boot.rom at a configurable flash address
428   -which is unknown to SeaBIOS. An example patch is needed for SeaBIOS below:
429   -
430   -diff --git a/src/optionroms.c b/src/optionroms.c
431   -index 65f7fe0..c7b6f5e 100644
432   ---- a/src/optionroms.c
433   -+++ b/src/optionroms.c
434   -@@ -324,6 +324,8 @@ init_pcirom(struct pci_device *pci, int isvga, u64 *sources)
435   - rom = deploy_romfile(file);
436   - else if (RunPCIroms > 1 || (RunPCIroms == 1 && isvga))
437   - rom = map_pcirom(pci);
438   -+ if (pci->bdf == pci_to_bdf(0, 2, 0))
439   -+ rom = (struct rom_header *)0xfff90000;
440   - if (! rom)
441   - // No ROM present.
442   - return;
443   -
444   -Note: the patch above expects IGD device is at PCI b.d.f 0.2.0 and its VGA ROM
445   -is at 0xfff90000 which corresponds to CONFIG_VGA_BIOS_ADDR on Minnowboard MAX.
446   -Change these two accordingly if this is not the case on your board.
447   -
448   -Development Flow
449   -----------------
450   -These notes are for those who want to port U-Boot to a new x86 platform.
451   -
452   -Since x86 CPUs boot from SPI flash, a SPI flash emulator is a good investment.
453   -The Dediprog em100 can be used on Linux. The em100 tool is available here:
454   -
455   - http://review.coreboot.org/p/em100.git
456   -
457   -On Minnowboard Max the following command line can be used:
458   -
459   - sudo em100 -s -p LOW -d u-boot.rom -c W25Q64DW -r
460   -
461   -A suitable clip for connecting over the SPI flash chip is here:
462   -
463   - http://www.dediprog.com/pd/programmer-accessories/EM-TC-8
464   -
465   -This allows you to override the SPI flash contents for development purposes.
466   -Typically you can write to the em100 in around 1200ms, considerably faster
467   -than programming the real flash device each time. The only important
468   -limitation of the em100 is that it only supports SPI bus speeds up to 20MHz.
469   -This means that images must be set to boot with that speed. This is an
470   -Intel-specific feature - e.g. tools/ifttool has an option to set the SPI
471   -speed in the SPI descriptor region.
472   -
473   -If your chip/board uses an Intel Firmware Support Package (FSP) it is fairly
474   -easy to fit it in. You can follow the Minnowboard Max implementation, for
475   -example. Hopefully you will just need to create new files similar to those
476   -in arch/x86/cpu/baytrail which provide Bay Trail support.
477   -
478   -If you are not using an FSP you have more freedom and more responsibility.
479   -The ivybridge support works this way, although it still uses a ROM for
480   -graphics and still has binary blobs containing Intel code. You should aim to
481   -support all important peripherals on your platform including video and storage.
482   -Use the device tree for configuration where possible.
483   -
484   -For the microcode you can create a suitable device tree file using the
485   -microcode tool:
486   -
487   - ./tools/microcode-tool -d microcode.dat -m <model> create
488   -
489   -or if you only have header files and not the full Intel microcode.dat database:
490   -
491   - ./tools/microcode-tool -H BAY_TRAIL_FSP_KIT/Microcode/M0130673322.h \
492   - -H BAY_TRAIL_FSP_KIT/Microcode/M0130679901.h \
493   - -m all create
494   -
495   -These are written to arch/x86/dts/microcode/ by default.
496   -
497   -Note that it is possible to just add the micrcode for your CPU if you know its
498   -model. U-Boot prints this information when it starts
499   -
500   - CPU: x86_64, vendor Intel, device 30673h
501   -
502   -so here we can use the M0130673322 file.
503   -
504   -If you platform can display POST codes on two little 7-segment displays on
505   -the board, then you can use post_code() calls from C or assembler to monitor
506   -boot progress. This can be good for debugging.
507   -
508   -If not, you can try to get serial working as early as possible. The early
509   -debug serial port may be useful here. See setup_internal_uart() for an example.
510   -
511   -During the U-Boot porting, one of the important steps is to write correct PIRQ
512   -routing information in the board device tree. Without it, device drivers in the
513   -Linux kernel won't function correctly due to interrupt is not working. Please
514   -refer to U-Boot doc [15] for the device tree bindings of Intel interrupt router.
515   -Here we have more details on the intel,pirq-routing property below.
516   -
517   - intel,pirq-routing = <
518   - PCI_BDF(0, 2, 0) INTA PIRQA
519   - ...
520   - >;
521   -
522   -As you see each entry has 3 cells. For the first one, we need describe all pci
523   -devices mounted on the board. For SoC devices, normally there is a chapter on
524   -the chipset datasheet which lists all the available PCI devices. For example on
525   -Bay Trail, this is chapter 4.3 (PCI configuration space). For the second one, we
526   -can get the interrupt pin either from datasheet or hardware via U-Boot shell.
527   -The reliable source is the hardware as sometimes chipset datasheet is not 100%
528   -up-to-date. Type 'pci header' plus the device's pci bus/device/function number
529   -from U-Boot shell below.
530   -
531   - => pci header 0.1e.1
532   - vendor ID = 0x8086
533   - device ID = 0x0f08
534   - ...
535   - interrupt line = 0x09
536   - interrupt pin = 0x04
537   - ...
538   -
539   -It shows this PCI device is using INTD pin as it reports 4 in the interrupt pin
540   -register. Repeat this until you get interrupt pins for all the devices. The last
541   -cell is the PIRQ line which a particular interrupt pin is mapped to. On Intel
542   -chipset, the power-up default mapping is INTA/B/C/D maps to PIRQA/B/C/D. This
543   -can be changed by registers in LPC bridge. So far Intel FSP does not touch those
544   -registers so we can write down the PIRQ according to the default mapping rule.
545   -
546   -Once we get the PIRQ routing information in the device tree, the interrupt
547   -allocation and assignment will be done by U-Boot automatically. Now you can
548   -enable CONFIG_GENERATE_PIRQ_TABLE for testing Linux kernel using i8259 PIC and
549   -CONFIG_GENERATE_MP_TABLE for testing Linux kernel using local APIC and I/O APIC.
550   -
551   -This script might be useful. If you feed it the output of 'pci long' from
552   -U-Boot then it will generate a device tree fragment with the interrupt
553   -configuration for each device (note it needs gawk 4.0.0):
554   -
555   - $ cat console_output |awk '/PCI/ {device=$4} /interrupt line/ {line=$4} \
556   - /interrupt pin/ {pin = $4; if (pin != "0x00" && pin != "0xff") \
557   - {patsplit(device, bdf, "[0-9a-f]+"); \
558   - printf "PCI_BDF(%d, %d, %d) INT%c PIRQ%c\n", strtonum("0x" bdf[1]), \
559   - strtonum("0x" bdf[2]), bdf[3], strtonum(pin) + 64, 64 + strtonum(pin)}}'
560   -
561   -Example output:
562   - PCI_BDF(0, 2, 0) INTA PIRQA
563   - PCI_BDF(0, 3, 0) INTA PIRQA
564   -...
565   -
566   -Porting Hints
567   --------------
568   -
569   -Quark-specific considerations:
570   -
571   -To port U-Boot to other boards based on the Intel Quark SoC, a few things need
572   -to be taken care of. The first important part is the Memory Reference Code (MRC)
573   -parameters. Quark MRC supports memory-down configuration only. All these MRC
574   -parameters are supplied via the board device tree. To get started, first copy
575   -the MRC section of arch/x86/dts/galileo.dts to your board's device tree, then
576   -change these values by consulting board manuals or your hardware vendor.
577   -Available MRC parameter values are listed in include/dt-bindings/mrc/quark.h.
578   -The other tricky part is with PCIe. Quark SoC integrates two PCIe root ports,
579   -but by default they are held in reset after power on. In U-Boot, PCIe
580   -initialization is properly handled as per Quark's firmware writer guide.
581   -In your board support codes, you need provide two routines to aid PCIe
582   -initialization, which are board_assert_perst() and board_deassert_perst().
583   -The two routines need implement a board-specific mechanism to assert/deassert
584   -PCIe PERST# pin. Care must be taken that in those routines that any APIs that
585   -may trigger PCI enumeration process are strictly forbidden, as any access to
586   -PCIe root port's configuration registers will cause system hang while it is
587   -held in reset. For more details, check how they are implemented by the Intel
588   -Galileo board support codes in board/intel/galileo/galileo.c.
589   -
590   -coreboot:
591   -
592   -See scripts/coreboot.sed which can assist with porting coreboot code into
593   -U-Boot drivers. It will not resolve all build errors, but will perform common
594   -transformations. Remember to add attribution to coreboot for new files added
595   -to U-Boot. This should go at the top of each file and list the coreboot
596   -filename where the code originated.
597   -
598   -Debugging ACPI issues with Windows:
599   -
600   -Windows might cache system information and only detect ACPI changes if you
601   -modify the ACPI table versions. So tweak them liberally when debugging ACPI
602   -issues with Windows.
603   -
604   -ACPI Support Status
605   --------------------
606   -Advanced Configuration and Power Interface (ACPI) [16] aims to establish
607   -industry-standard interfaces enabling OS-directed configuration, power
608   -management, and thermal management of mobile, desktop, and server platforms.
609   -
610   -Linux can boot without ACPI with "acpi=off" command line parameter, but
611   -with ACPI the kernel gains the capabilities to handle power management.
612   -For Windows, ACPI is a must-have firmware feature since Windows Vista.
613   -CONFIG_GENERATE_ACPI_TABLE is the config option to turn on ACPI support in
614   -U-Boot. This requires Intel ACPI compiler to be installed on your host to
615   -compile ACPI DSDT table written in ASL format to AML format. You can get
616   -the compiler via "apt-get install iasl" if you are on Ubuntu or download
617   -the source from [17] to compile one by yourself.
618   -
619   -Current ACPI support in U-Boot is basically complete. More optional features
620   -can be added in the future. The status as of today is:
621   -
622   - * Support generating RSDT, XSDT, FACS, FADT, MADT, MCFG tables.
623   - * Support one static DSDT table only, compiled by Intel ACPI compiler.
624   - * Support S0/S3/S4/S5, reboot and shutdown from OS.
625   - * Support booting a pre-installed Ubuntu distribution via 'zboot' command.
626   - * Support installing and booting Ubuntu 14.04 (or above) from U-Boot with
627   - the help of SeaBIOS using legacy interface (non-UEFI mode).
628   - * Support installing and booting Windows 8.1/10 from U-Boot with the help
629   - of SeaBIOS using legacy interface (non-UEFI mode).
630   - * Support ACPI interrupts with SCI only.
631   -
632   -Features that are optional:
633   - * 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   -
639   -ACPI was initially enabled on BayTrail based boards. Testing was done by booting
640   -a pre-installed Ubuntu 14.04 from a SATA drive. Installing Ubuntu 14.04 and
641   -Windows 8.1/10 to a SATA drive and booting from there is also tested. Most
642   -devices seem to work correctly and the board can respond a reboot/shutdown
643   -command from the OS.
644   -
645   -For other platform boards, ACPI support status can be checked by examining their
646   -board defconfig files to see if CONFIG_GENERATE_ACPI_TABLE is set to y.
647   -
648   -The S3 sleeping state is a low wake latency sleeping state defined by ACPI
649   -spec where all system context is lost except system memory. To test S3 resume
650   -with a Linux kernel, simply run "echo mem > /sys/power/state" and kernel will
651   -put the board to S3 state where the power is off. So when the power button is
652   -pressed again, U-Boot runs as it does in cold boot and detects the sleeping
653   -state via ACPI register to see if it is S3, if yes it means we are waking up.
654   -U-Boot is responsible for restoring the machine state as it is before sleep.
655   -When everything is done, U-Boot finds out the wakeup vector provided by OSes
656   -and jump there. To determine whether ACPI S3 resume is supported, check to
657   -see if CONFIG_HAVE_ACPI_RESUME is set for that specific board.
658   -
659   -Note for testing S3 resume with Windows, correct graphics driver must be
660   -installed for your platform, otherwise you won't find "Sleep" option in
661   -the "Power" submenu from the Windows start menu.
662   -
663   -EFI Support
664   ------------
665   -U-Boot supports booting as a 32-bit or 64-bit EFI payload, e.g. with UEFI.
666   -This is enabled with CONFIG_EFI_STUB to boot from both 32-bit and 64-bit
667   -UEFI BIOS. U-Boot can also run as an EFI application, with CONFIG_EFI_APP.
668   -The CONFIG_EFI_LOADER option, where U-Boot provides an EFI environment to
669   -the kernel (i.e. replaces UEFI completely but provides the same EFI run-time
670   -services) is supported too. For example, we can even use 'bootefi' command
671   -to load a 'u-boot-payload.efi', see below test logs on QEMU.
672   -
673   - => load ide 0 3000000 u-boot-payload.efi
674   - 489787 bytes read in 138 ms (3.4 MiB/s)
675   - => bootefi 3000000
676   - Scanning disk ide.blk#0...
677   - Found 2 disks
678   - WARNING: booting without device tree
679   - ## Starting EFI application at 03000000 ...
680   - U-Boot EFI Payload
681   -
682   -
683   - U-Boot 2018.07-rc2 (Jun 23 2018 - 17:12:58 +0800)
684   -
685   - CPU: x86_64, vendor AMD, device 663h
686   - DRAM: 2 GiB
687   - MMC:
688   - Video: 1024x768x32
689   - Model: EFI x86 Payload
690   - Net: e1000: 52:54:00:12:34:56
691   -
692   - Warning: e1000#0 using MAC address from ROM
693   - eth0: e1000#0
694   - No controllers found
695   - Hit any key to stop autoboot: 0
696   -
697   -See README.u-boot_on_efi and README.uefi for details of EFI support in U-Boot.
698   -
699   -TODO List
700   ----------
701   -- Audio
702   -- Chrome OS verified boot
703   -
704   -References
705   -----------
706   -[1] http://www.coreboot.org
707   -[2] http://www.qemu.org
708   -[3] http://www.coreboot.org/~stepan/pci8086,0166.rom
709   -[4] http://www.intel.com/content/www/us/en/embedded/design-tools/evaluation-platforms/atom-e660-eg20t-development-kit.html
710   -[5] http://www.intel.com/fsp
711   -[6] http://www.intel.com/content/www/us/en/secure/intelligent-systems/privileged/e6xx-35-b1-cmc22211.html
712   -[7] http://www.ami.com/products/bios-uefi-tools-and-utilities/bios-uefi-utilities/
713   -[8] http://en.wikipedia.org/wiki/Microcode
714   -[9] http://simplefirmware.org
715   -[10] http://www.intel.com/design/archives/processors/pro/docs/242016.htm
716   -[11] https://en.wikipedia.org/wiki/GUID_Partition_Table
717   -[12] http://events.linuxfoundation.org/sites/events/files/slides/chromeos_and_diy_vboot_0.pdf
718   -[13] http://events.linuxfoundation.org/sites/events/files/slides/elce-2014.pdf
719   -[14] http://www.seabios.org/SeaBIOS
720   -[15] doc/device-tree-bindings/misc/intel,irq-router.txt
721   -[16] http://www.acpi.info
722   -[17] https://www.acpica.org/downloads
... ... @@ -7,4 +7,5 @@
7 7 :maxdepth: 2
8 8  
9 9 mips
  10 + x86
  1 +.. 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>
  4 +
  5 +x86
  6 +===
  7 +
  8 +This document describes the information about U-Boot running on x86 targets,
  9 +including supported boards, build instructions, todo list, etc.
  10 +
  11 +Status
  12 +------
  13 +U-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
  15 +work with minimal adjustments on other x86 boards since coreboot deals with
  16 +most of the low-level details.
  17 +
  18 +U-Boot is a main bootloader on Intel Edison board.
  19 +
  20 +U-Boot also supports booting directly from x86 reset vector, without coreboot.
  21 +In this case, known as bare mode, from the fact that it runs on the
  22 +'bare metal', U-Boot acts like a BIOS replacement. The following platforms
  23 +are supported:
  24 +
  25 + - Bayley Bay CRB
  26 + - Cherry Hill CRB
  27 + - Congatec QEVAL 2.0 & conga-QA3/E3845
  28 + - Cougar Canyon 2 CRB
  29 + - Crown Bay CRB
  30 + - Galileo
  31 + - Link (Chromebook Pixel)
  32 + - Minnowboard MAX
  33 + - Samus (Chromebook Pixel 2015)
  34 + - QEMU x86 (32-bit & 64-bit)
  35 +
  36 +As for loading an OS, U-Boot supports directly booting a 32-bit or 64-bit
  37 +Linux kernel as part of a FIT image. It also supports a compressed zImage.
  38 +U-Boot supports loading an x86 VxWorks kernel. Please check README.vxworks
  39 +for more details.
  40 +
  41 +Build Instructions for U-Boot as BIOS replacement (bare mode)
  42 +-------------------------------------------------------------
  43 +Building a ROM version of U-Boot (hereafter referred to as u-boot.rom) is a
  44 +little bit tricky, as generally it requires several binary blobs which are not
  45 +shipped in the U-Boot source tree. Due to this reason, the u-boot.rom build is
  46 +not turned on by default in the U-Boot source tree. Firstly, you need turn it
  47 +on by enabling the ROM build either via an environment variable::
  48 +
  49 + $ export BUILD_ROM=y
  50 +
  51 +or via configuration::
  52 +
  53 + CONFIG_BUILD_ROM=y
  54 +
  55 +Both tell the Makefile to build u-boot.rom as a target.
  56 +
  57 +CPU Microcode
  58 +-------------
  59 +Modern CPUs usually require a special bit stream called `microcode`_ to be
  60 +loaded on the processor after power up in order to function properly. U-Boot
  61 +has already integrated these as hex dumps in the source tree.
  62 +
  63 +SMP Support
  64 +-----------
  65 +On a multicore system, U-Boot is executed on the bootstrap processor (BSP).
  66 +Additional application processors (AP) can be brought up by U-Boot. In order to
  67 +have an SMP kernel to discover all of the available processors, U-Boot needs to
  68 +prepare configuration tables which contain the multi-CPUs information before
  69 +loading the OS kernel. Currently U-Boot supports generating two types of tables
  70 +for SMP, called Simple Firmware Interface (`SFI`_) and Multi-Processor (`MP`_)
  71 +tables. The writing of these two tables are controlled by two Kconfig
  72 +options GENERATE_SFI_TABLE and GENERATE_MP_TABLE.
  73 +
  74 +Driver Model
  75 +------------
  76 +x86 has been converted to use driver model for serial, GPIO, SPI, SPI flash,
  77 +keyboard, real-time clock, USB. Video is in progress.
  78 +
  79 +Device Tree
  80 +-----------
  81 +x86 uses device tree to configure the board thus requires CONFIG_OF_CONTROL to
  82 +be turned on. Not every device on the board is configured via device tree, but
  83 +more and more devices will be added as time goes by. Check out the directory
  84 +arch/x86/dts/ for these device tree source files.
  85 +
  86 +Useful Commands
  87 +---------------
  88 +In keeping with the U-Boot philosophy of providing functions to check and
  89 +adjust internal settings, there are several x86-specific commands that may be
  90 +useful:
  91 +
  92 +fsp
  93 + Display information about Intel Firmware Support Package (FSP).
  94 + This is only available on platforms which use FSP, mostly Atom.
  95 +iod
  96 + Display I/O memory
  97 +iow
  98 + Write I/O memory
  99 +mtrr
  100 + List and set the Memory Type Range Registers (MTRR). These are used to
  101 + tell the CPU whether memory is cacheable and if so the cache write
  102 + mode to use. U-Boot sets up some reasonable values but you can
  103 + adjust then with this command.
  104 +
  105 +Booting Ubuntu
  106 +--------------
  107 +As an example of how to set up your boot flow with U-Boot, here are
  108 +instructions for starting Ubuntu from U-Boot. These instructions have been
  109 +tested on Minnowboard MAX with a SATA drive but are equally applicable on
  110 +other platforms and other media. There are really only four steps and it's a
  111 +very simple script, but a more detailed explanation is provided here for
  112 +completeness.
  113 +
  114 +Note: It is possible to set up U-Boot to boot automatically using syslinux.
  115 +It could also use the grub.cfg file (/efi/ubuntu/grub.cfg) to obtain the
  116 +GUID. If you figure these out, please post patches to this README.
  117 +
  118 +Firstly, you will need Ubuntu installed on an available disk. It should be
  119 +possible to make U-Boot start a USB start-up disk but for now let's assume
  120 +that you used another boot loader to install Ubuntu.
  121 +
  122 +Use the U-Boot command line to find the UUID of the partition you want to
  123 +boot. For example our disk is SCSI device 0::
  124 +
  125 + => part list scsi 0
  126 +
  127 + Partition Map for SCSI device 0 -- Partition Type: EFI
  128 +
  129 + Part Start LBA End LBA Name
  130 + Attributes
  131 + Type GUID
  132 + Partition GUID
  133 + 1 0x00000800 0x001007ff ""
  134 + attrs: 0x0000000000000000
  135 + type: c12a7328-f81f-11d2-ba4b-00a0c93ec93b
  136 + guid: 9d02e8e4-4d59-408f-a9b0-fd497bc9291c
  137 + 2 0x00100800 0x037d8fff ""
  138 + attrs: 0x0000000000000000
  139 + type: 0fc63daf-8483-4772-8e79-3d69d8477de4
  140 + guid: 965c59ee-1822-4326-90d2-b02446050059
  141 + 3 0x037d9000 0x03ba27ff ""
  142 + attrs: 0x0000000000000000
  143 + type: 0657fd6d-a4ab-43c4-84e5-0933c84b4f4f
  144 + guid: 2c4282bd-1e82-4bcf-a5ff-51dedbf39f17
  145 + =>
  146 +
  147 +This shows that your SCSI disk has three partitions. The really long hex
  148 +strings are called Globally Unique Identifiers (GUIDs). You can look up the
  149 +'type' ones `here`_. On this disk the first partition is for EFI and is in
  150 +VFAT format (DOS/Windows)::
  151 +
  152 + => fatls scsi 0:1
  153 + efi/
  154 +
  155 + 0 file(s), 1 dir(s)
  156 +
  157 +
  158 +Partition 2 is 'Linux filesystem data' so that will be our root disk. It is
  159 +in ext2 format::
  160 +
  161 + => ext2ls scsi 0:2
  162 + <DIR> 4096 .
  163 + <DIR> 4096 ..
  164 + <DIR> 16384 lost+found
  165 + <DIR> 4096 boot
  166 + <DIR> 12288 etc
  167 + <DIR> 4096 media
  168 + <DIR> 4096 bin
  169 + <DIR> 4096 dev
  170 + <DIR> 4096 home
  171 + <DIR> 4096 lib
  172 + <DIR> 4096 lib64
  173 + <DIR> 4096 mnt
  174 + <DIR> 4096 opt
  175 + <DIR> 4096 proc
  176 + <DIR> 4096 root
  177 + <DIR> 4096 run
  178 + <DIR> 12288 sbin
  179 + <DIR> 4096 srv
  180 + <DIR> 4096 sys
  181 + <DIR> 4096 tmp
  182 + <DIR> 4096 usr
  183 + <DIR> 4096 var
  184 + <SYM> 33 initrd.img
  185 + <SYM> 30 vmlinuz
  186 + <DIR> 4096 cdrom
  187 + <SYM> 33 initrd.img.old
  188 + =>
  189 +
  190 +and if you look in the /boot directory you will see the kernel::
  191 +
  192 + => ext2ls scsi 0:2 /boot
  193 + <DIR> 4096 .
  194 + <DIR> 4096 ..
  195 + <DIR> 4096 efi
  196 + <DIR> 4096 grub
  197 + 3381262 System.map-3.13.0-32-generic
  198 + 1162712 abi-3.13.0-32-generic
  199 + 165611 config-3.13.0-32-generic
  200 + 176500 memtest86+.bin
  201 + 178176 memtest86+.elf
  202 + 178680 memtest86+_multiboot.bin
  203 + 5798112 vmlinuz-3.13.0-32-generic
  204 + 165762 config-3.13.0-58-generic
  205 + 1165129 abi-3.13.0-58-generic
  206 + 5823136 vmlinuz-3.13.0-58-generic
  207 + 19215259 initrd.img-3.13.0-58-generic
  208 + 3391763 System.map-3.13.0-58-generic
  209 + 5825048 vmlinuz-3.13.0-58-generic.efi.signed
  210 + 28304443 initrd.img-3.13.0-32-generic
  211 + =>
  212 +
  213 +The 'vmlinuz' files contain a packaged Linux kernel. The format is a kind of
  214 +self-extracting compressed file mixed with some 'setup' configuration data.
  215 +Despite its size (uncompressed it is >10MB) this only includes a basic set of
  216 +device drivers, enough to boot on most hardware types.
  217 +
  218 +The 'initrd' files contain a RAM disk. This is something that can be loaded
  219 +into RAM and will appear to Linux like a disk. Ubuntu uses this to hold lots
  220 +of drivers for whatever hardware you might have. It is loaded before the
  221 +real root disk is accessed.
  222 +
  223 +The numbers after the end of each file are the version. Here it is Linux
  224 +version 3.13. You can find the source code for this in the Linux tree with
  225 +the tag v3.13. The '.0' allows for additional Linux releases to fix problems,
  226 +but normally this is not needed. The '-58' is used by Ubuntu. Each time they
  227 +release a new kernel they increment this number. New Ubuntu versions might
  228 +include kernel patches to fix reported bugs. Stable kernels can exist for
  229 +some years so this number can get quite high.
  230 +
  231 +The '.efi.signed' kernel is signed for EFI's secure boot. U-Boot has its own
  232 +secure boot mechanism - see `this`_ & `that`_. It cannot read .efi files
  233 +at present.
  234 +
  235 +To boot Ubuntu from U-Boot the steps are as follows:
  236 +
  237 +1. Set up the boot arguments. Use the GUID for the partition you want to boot::
  238 +
  239 + => setenv bootargs root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro
  240 +
  241 +Here root= tells Linux the location of its root disk. The disk is specified
  242 +by its GUID, using '/dev/disk/by-partuuid/', a Linux path to a 'directory'
  243 +containing all the GUIDs Linux has found. When it starts up, there will be a
  244 +file in that directory with this name in it. It is also possible to use a
  245 +device name here, see later.
  246 +
  247 +2. Load the kernel. Since it is an ext2/4 filesystem we can do::
  248 +
  249 + => ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic
  250 +
  251 +The address 30000000 is arbitrary, but there seem to be problems with using
  252 +small addresses (sometimes Linux cannot find the ramdisk). This is 48MB into
  253 +the start of RAM (which is at 0 on x86).
  254 +
  255 +3. Load the ramdisk (to 64MB)::
  256 +
  257 + => ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic
  258 +
  259 +4. Start up the kernel. We need to know the size of the ramdisk, but can use
  260 + a variable for that. U-Boot sets 'filesize' to the size of the last file it
  261 + loaded::
  262 +
  263 + => zboot 03000000 0 04000000 ${filesize}
  264 +
  265 +Type 'help zboot' if you want to see what the arguments are. U-Boot on x86 is
  266 +quite verbose when it boots a kernel. You should see these messages from
  267 +U-Boot::
  268 +
  269 + Valid Boot Flag
  270 + Setup Size = 0x00004400
  271 + Magic signature found
  272 + Using boot protocol version 2.0c
  273 + Linux kernel version 3.13.0-58-generic (buildd@allspice) #97-Ubuntu SMP Wed Jul 8 02:56:15 UTC 2015
  274 + Building boot_params at 0x00090000
  275 + Loading bzImage at address 100000 (5805728 bytes)
  276 + Magic signature found
  277 + Initial RAM disk at linear address 0x04000000, size 19215259 bytes
  278 + Kernel command line: "root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro"
  279 +
  280 + Starting kernel ...
  281 +
  282 +U-Boot prints out some bootstage timing. This is more useful if you put the
  283 +above commands into a script since then it will be faster::
  284 +
  285 + Timer summary in microseconds:
  286 + Mark Elapsed Stage
  287 + 0 0 reset
  288 + 241,535 241,535 board_init_r
  289 + 2,421,611 2,180,076 id=64
  290 + 2,421,790 179 id=65
  291 + 2,428,215 6,425 main_loop
  292 + 48,860,584 46,432,369 start_kernel
  293 +
  294 + Accumulated time:
  295 + 240,329 ahci
  296 + 1,422,704 vesa display
  297 +
  298 +Now the kernel actually starts (if you want to examine kernel boot up message on
  299 +the serial console, append "console=ttyS0,115200" to the kernel command line)::
  300 +
  301 + [ 0.000000] Initializing cgroup subsys cpuset
  302 + [ 0.000000] Initializing cgroup subsys cpu
  303 + [ 0.000000] Initializing cgroup subsys cpuacct
  304 + [ 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)
  305 + [ 0.000000] Command line: root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro console=ttyS0,115200
  306 +
  307 +It continues for a long time. Along the way you will see it pick up your
  308 +ramdisk::
  309 +
  310 + [ 0.000000] RAMDISK: [mem 0x04000000-0x05253fff]
  311 + ...
  312 + [ 0.788540] Trying to unpack rootfs image as initramfs...
  313 + [ 1.540111] Freeing initrd memory: 18768K (ffff880004000000 - ffff880005254000)
  314 + ...
  315 +
  316 +Later it actually starts using it::
  317 +
  318 + Begin: Running /scripts/local-premount ... done.
  319 +
  320 +You should also see your boot disk turn up::
  321 +
  322 + [ 4.357243] scsi 1:0:0:0: Direct-Access ATA ADATA SP310 5.2 PQ: 0 ANSI: 5
  323 + [ 4.366860] sd 1:0:0:0: [sda] 62533296 512-byte logical blocks: (32.0 GB/29.8 GiB)
  324 + [ 4.375677] sd 1:0:0:0: Attached scsi generic sg0 type 0
  325 + [ 4.381859] sd 1:0:0:0: [sda] Write Protect is off
  326 + [ 4.387452] sd 1:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
  327 + [ 4.399535] sda: sda1 sda2 sda3
  328 +
  329 +Linux has found the three partitions (sda1-3). Mercifully it doesn't print out
  330 +the GUIDs. In step 1 above we could have used::
  331 +
  332 + setenv bootargs root=/dev/sda2 ro
  333 +
  334 +instead of the GUID. However if you add another drive to your board the
  335 +numbering may change whereas the GUIDs will not. So if your boot partition
  336 +becomes sdb2, it will still boot. For embedded systems where you just want to
  337 +boot the first disk, you have that option.
  338 +
  339 +The last thing you will see on the console is mention of plymouth (which
  340 +displays the Ubuntu start-up screen) and a lot of 'Starting' messages::
  341 +
  342 + * Starting Mount filesystems on boot [ OK ]
  343 +
  344 +After a pause you should see a login screen on your display and you are done.
  345 +
  346 +If you want to put this in a script you can use something like this::
  347 +
  348 + setenv bootargs root=UUID=b2aaf743-0418-4d90-94cc-3e6108d7d968 ro
  349 + setenv boot zboot 03000000 0 04000000 \${filesize}
  350 + 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"
  351 + saveenv
  352 +
  353 +The \ is to tell the shell not to evaluate ${filesize} as part of the setenv
  354 +command.
  355 +
  356 +You can also bake this behaviour into your build by hard-coding the
  357 +environment variables if you add this to minnowmax.h:
  358 +
  359 +.. code-block:: c
  360 +
  361 + #undef CONFIG_BOOTCOMMAND
  362 + #define CONFIG_BOOTCOMMAND \
  363 + "ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic; " \
  364 + "ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic; " \
  365 + "run boot"
  366 +
  367 + #undef CONFIG_EXTRA_ENV_SETTINGS
  368 + #define CONFIG_EXTRA_ENV_SETTINGS "boot=zboot 03000000 0 04000000 ${filesize}"
  369 +
  370 +and change CONFIG_BOOTARGS value in configs/minnowmax_defconfig to::
  371 +
  372 + CONFIG_BOOTARGS="root=/dev/sda2 ro"
  373 +
  374 +Test with SeaBIOS
  375 +-----------------
  376 +`SeaBIOS`_ is an open source implementation of a 16-bit x86 BIOS. It can run
  377 +in an emulator or natively on x86 hardware with the use of U-Boot. With its
  378 +help, we can boot some OSes that require 16-bit BIOS services like Windows/DOS.
  379 +
  380 +As U-Boot, we have to manually create a table where SeaBIOS gets various system
  381 +information (eg: E820) from. The table unfortunately has to follow the coreboot
  382 +table format as SeaBIOS currently supports booting as a coreboot payload.
  383 +
  384 +To support loading SeaBIOS, U-Boot should be built with CONFIG_SEABIOS on.
  385 +Booting SeaBIOS is done via U-Boot's bootelf command, like below::
  386 +
  387 + => tftp bios.bin.elf;bootelf
  388 + Using e1000#0 device
  389 + TFTP from server 10.10.0.100; our IP address is 10.10.0.108
  390 + ...
  391 + Bytes transferred = 122124 (1dd0c hex)
  392 + ## Starting application at 0x000ff06e ...
  393 + SeaBIOS (version rel-1.9.0)
  394 + ...
  395 +
  396 +bios.bin.elf is the SeaBIOS image built from SeaBIOS source tree.
  397 +Make sure it is built as follows::
  398 +
  399 + $ make menuconfig
  400 +
  401 +Inside the "General Features" menu, select "Build for coreboot" as the
  402 +"Build Target". Inside the "Debugging" menu, turn on "Serial port debugging"
  403 +so that we can see something as soon as SeaBIOS boots. Leave other options
  404 +as in their default state. Then::
  405 +
  406 + $ make
  407 + ...
  408 + Total size: 121888 Fixed: 66496 Free: 9184 (used 93.0% of 128KiB rom)
  409 + Creating out/bios.bin.elf
  410 +
  411 +Currently this is tested on QEMU x86 target with U-Boot chain-loading SeaBIOS
  412 +to install/boot a Windows XP OS (below for example command to install Windows).
  413 +
  414 +.. code-block:: none
  415 +
  416 + # Create a 10G disk.img as the virtual hard disk
  417 + $ qemu-img create -f qcow2 disk.img 10G
  418 +
  419 + # Install a Windows XP OS from an ISO image 'winxp.iso'
  420 + $ qemu-system-i386 -serial stdio -bios u-boot.rom -hda disk.img -cdrom winxp.iso -smp 2 -m 512
  421 +
  422 + # Boot a Windows XP OS installed on the virutal hard disk
  423 + $ qemu-system-i386 -serial stdio -bios u-boot.rom -hda disk.img -smp 2 -m 512
  424 +
  425 +This is also tested on Intel Crown Bay board with a PCIe graphics card, booting
  426 +SeaBIOS then chain-loading a GRUB on a USB drive, then Linux kernel finally.
  427 +
  428 +If you are using Intel Integrated Graphics Device (IGD) as the primary display
  429 +device on your board, SeaBIOS needs to be patched manually to get its VGA ROM
  430 +loaded and run by SeaBIOS. SeaBIOS locates VGA ROM via the PCI expansion ROM
  431 +register, but IGD device does not have its VGA ROM mapped by this register.
  432 +Its VGA ROM is packaged as part of u-boot.rom at a configurable flash address
  433 +which is unknown to SeaBIOS. An example patch is needed for SeaBIOS below:
  434 +
  435 +.. code-block:: none
  436 +
  437 + diff --git a/src/optionroms.c b/src/optionroms.c
  438 + index 65f7fe0..c7b6f5e 100644
  439 + --- a/src/optionroms.c
  440 + +++ b/src/optionroms.c
  441 + @@ -324,6 +324,8 @@ init_pcirom(struct pci_device *pci, int isvga, u64 *sources)
  442 + rom = deploy_romfile(file);
  443 + else if (RunPCIroms > 1 || (RunPCIroms == 1 && isvga))
  444 + rom = map_pcirom(pci);
  445 + + if (pci->bdf == pci_to_bdf(0, 2, 0))
  446 + + rom = (struct rom_header *)0xfff90000;
  447 + if (! rom)
  448 + // No ROM present.
  449 + return;
  450 +
  451 +Note: the patch above expects IGD device is at PCI b.d.f 0.2.0 and its VGA ROM
  452 +is at 0xfff90000 which corresponds to CONFIG_VGA_BIOS_ADDR on Minnowboard MAX.
  453 +Change these two accordingly if this is not the case on your board.
  454 +
  455 +Development Flow
  456 +----------------
  457 +These notes are for those who want to port U-Boot to a new x86 platform.
  458 +
  459 +Since x86 CPUs boot from SPI flash, a SPI flash emulator is a good investment.
  460 +The Dediprog em100 can be used on Linux.
  461 +
  462 +The em100 tool is available here: http://review.coreboot.org/p/em100.git
  463 +
  464 +On Minnowboard Max the following command line can be used::
  465 +
  466 + sudo em100 -s -p LOW -d u-boot.rom -c W25Q64DW -r
  467 +
  468 +A suitable clip for connecting over the SPI flash chip is here:
  469 +http://www.dediprog.com/pd/programmer-accessories/EM-TC-8.
  470 +
  471 +This allows you to override the SPI flash contents for development purposes.
  472 +Typically you can write to the em100 in around 1200ms, considerably faster
  473 +than programming the real flash device each time. The only important
  474 +limitation of the em100 is that it only supports SPI bus speeds up to 20MHz.
  475 +This means that images must be set to boot with that speed. This is an
  476 +Intel-specific feature - e.g. tools/ifttool has an option to set the SPI
  477 +speed in the SPI descriptor region.
  478 +
  479 +If your chip/board uses an Intel Firmware Support Package (FSP) it is fairly
  480 +easy to fit it in. You can follow the Minnowboard Max implementation, for
  481 +example. Hopefully you will just need to create new files similar to those
  482 +in arch/x86/cpu/baytrail which provide Bay Trail support.
  483 +
  484 +If you are not using an FSP you have more freedom and more responsibility.
  485 +The ivybridge support works this way, although it still uses a ROM for
  486 +graphics and still has binary blobs containing Intel code. You should aim to
  487 +support all important peripherals on your platform including video and storage.
  488 +Use the device tree for configuration where possible.
  489 +
  490 +For the microcode you can create a suitable device tree file using the
  491 +microcode tool::
  492 +
  493 + ./tools/microcode-tool -d microcode.dat -m <model> create
  494 +
  495 +or if you only have header files and not the full Intel microcode.dat database::
  496 +
  497 + ./tools/microcode-tool -H BAY_TRAIL_FSP_KIT/Microcode/M0130673322.h \
  498 + -H BAY_TRAIL_FSP_KIT/Microcode/M0130679901.h -m all create
  499 +
  500 +These are written to arch/x86/dts/microcode/ by default.
  501 +
  502 +Note that it is possible to just add the micrcode for your CPU if you know its
  503 +model. U-Boot prints this information when it starts::
  504 +
  505 + CPU: x86_64, vendor Intel, device 30673h
  506 +
  507 +so here we can use the M0130673322 file.
  508 +
  509 +If you platform can display POST codes on two little 7-segment displays on
  510 +the board, then you can use post_code() calls from C or assembler to monitor
  511 +boot progress. This can be good for debugging.
  512 +
  513 +If not, you can try to get serial working as early as possible. The early
  514 +debug serial port may be useful here. See setup_internal_uart() for an example.
  515 +
  516 +During the U-Boot porting, one of the important steps is to write correct PIRQ
  517 +routing information in the board device tree. Without it, device drivers in the
  518 +Linux kernel won't function correctly due to interrupt is not working. Please
  519 +refer to U-Boot `doc <doc/device-tree-bindings/misc/intel,irq-router.txt>`_ for
  520 +the device tree bindings of Intel interrupt router. Here we have more details
  521 +on the intel,pirq-routing property below.
  522 +
  523 +.. code-block:: none
  524 +
  525 + intel,pirq-routing = <
  526 + PCI_BDF(0, 2, 0) INTA PIRQA
  527 + ...
  528 + >;
  529 +
  530 +As you see each entry has 3 cells. For the first one, we need describe all pci
  531 +devices mounted on the board. For SoC devices, normally there is a chapter on
  532 +the chipset datasheet which lists all the available PCI devices. For example on
  533 +Bay Trail, this is chapter 4.3 (PCI configuration space). For the second one, we
  534 +can get the interrupt pin either from datasheet or hardware via U-Boot shell.
  535 +The reliable source is the hardware as sometimes chipset datasheet is not 100%
  536 +up-to-date. Type 'pci header' plus the device's pci bus/device/function number
  537 +from U-Boot shell below::
  538 +
  539 + => pci header 0.1e.1
  540 + vendor ID = 0x8086
  541 + device ID = 0x0f08
  542 + ...
  543 + interrupt line = 0x09
  544 + interrupt pin = 0x04
  545 + ...
  546 +
  547 +It shows this PCI device is using INTD pin as it reports 4 in the interrupt pin
  548 +register. Repeat this until you get interrupt pins for all the devices. The last
  549 +cell is the PIRQ line which a particular interrupt pin is mapped to. On Intel
  550 +chipset, the power-up default mapping is INTA/B/C/D maps to PIRQA/B/C/D. This
  551 +can be changed by registers in LPC bridge. So far Intel FSP does not touch those
  552 +registers so we can write down the PIRQ according to the default mapping rule.
  553 +
  554 +Once we get the PIRQ routing information in the device tree, the interrupt
  555 +allocation and assignment will be done by U-Boot automatically. Now you can
  556 +enable CONFIG_GENERATE_PIRQ_TABLE for testing Linux kernel using i8259 PIC and
  557 +CONFIG_GENERATE_MP_TABLE for testing Linux kernel using local APIC and I/O APIC.
  558 +
  559 +This script might be useful. If you feed it the output of 'pci long' from
  560 +U-Boot then it will generate a device tree fragment with the interrupt
  561 +configuration for each device (note it needs gawk 4.0.0)::
  562 +
  563 + $ cat console_output |awk '/PCI/ {device=$4} /interrupt line/ {line=$4} \
  564 + /interrupt pin/ {pin = $4; if (pin != "0x00" && pin != "0xff") \
  565 + {patsplit(device, bdf, "[0-9a-f]+"); \
  566 + printf "PCI_BDF(%d, %d, %d) INT%c PIRQ%c\n", strtonum("0x" bdf[1]), \
  567 + strtonum("0x" bdf[2]), bdf[3], strtonum(pin) + 64, 64 + strtonum(pin)}}'
  568 +
  569 +Example output::
  570 +
  571 + PCI_BDF(0, 2, 0) INTA PIRQA
  572 + PCI_BDF(0, 3, 0) INTA PIRQA
  573 + ...
  574 +
  575 +Porting Hints
  576 +-------------
  577 +
  578 +Quark-specific considerations
  579 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  580 +
  581 +To port U-Boot to other boards based on the Intel Quark SoC, a few things need
  582 +to be taken care of. The first important part is the Memory Reference Code (MRC)
  583 +parameters. Quark MRC supports memory-down configuration only. All these MRC
  584 +parameters are supplied via the board device tree. To get started, first copy
  585 +the MRC section of arch/x86/dts/galileo.dts to your board's device tree, then
  586 +change these values by consulting board manuals or your hardware vendor.
  587 +Available MRC parameter values are listed in include/dt-bindings/mrc/quark.h.
  588 +The other tricky part is with PCIe. Quark SoC integrates two PCIe root ports,
  589 +but by default they are held in reset after power on. In U-Boot, PCIe
  590 +initialization is properly handled as per Quark's firmware writer guide.
  591 +In your board support codes, you need provide two routines to aid PCIe
  592 +initialization, which are board_assert_perst() and board_deassert_perst().
  593 +The two routines need implement a board-specific mechanism to assert/deassert
  594 +PCIe PERST# pin. Care must be taken that in those routines that any APIs that
  595 +may trigger PCI enumeration process are strictly forbidden, as any access to
  596 +PCIe root port's configuration registers will cause system hang while it is
  597 +held in reset. For more details, check how they are implemented by the Intel
  598 +Galileo board support codes in board/intel/galileo/galileo.c.
  599 +
  600 +coreboot
  601 +^^^^^^^^
  602 +
  603 +See scripts/coreboot.sed which can assist with porting coreboot code into
  604 +U-Boot drivers. It will not resolve all build errors, but will perform common
  605 +transformations. Remember to add attribution to coreboot for new files added
  606 +to U-Boot. This should go at the top of each file and list the coreboot
  607 +filename where the code originated.
  608 +
  609 +Debugging ACPI issues with Windows
  610 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  611 +
  612 +Windows might cache system information and only detect ACPI changes if you
  613 +modify the ACPI table versions. So tweak them liberally when debugging ACPI
  614 +issues with Windows.
  615 +
  616 +ACPI Support Status
  617 +-------------------
  618 +Advanced Configuration and Power Interface (`ACPI`_) aims to establish
  619 +industry-standard interfaces enabling OS-directed configuration, power
  620 +management, and thermal management of mobile, desktop, and server platforms.
  621 +
  622 +Linux can boot without ACPI with "acpi=off" command line parameter, but
  623 +with ACPI the kernel gains the capabilities to handle power management.
  624 +For Windows, ACPI is a must-have firmware feature since Windows Vista.
  625 +CONFIG_GENERATE_ACPI_TABLE is the config option to turn on ACPI support in
  626 +U-Boot. This requires Intel ACPI compiler to be installed on your host to
  627 +compile ACPI DSDT table written in ASL format to AML format. You can get
  628 +the compiler via "apt-get install iasl" if you are on Ubuntu or download
  629 +the source from https://www.acpica.org/downloads to compile one by yourself.
  630 +
  631 +Current ACPI support in U-Boot is basically complete. More optional features
  632 +can be added in the future. The status as of today is:
  633 +
  634 + * Support generating RSDT, XSDT, FACS, FADT, MADT, MCFG tables.
  635 + * Support one static DSDT table only, compiled by Intel ACPI compiler.
  636 + * Support S0/S3/S4/S5, reboot and shutdown from OS.
  637 + * Support booting a pre-installed Ubuntu distribution via 'zboot' command.
  638 + * Support installing and booting Ubuntu 14.04 (or above) from U-Boot with
  639 + the help of SeaBIOS using legacy interface (non-UEFI mode).
  640 + * Support installing and booting Windows 8.1/10 from U-Boot with the help
  641 + of SeaBIOS using legacy interface (non-UEFI mode).
  642 + * Support ACPI interrupts with SCI only.
  643 +
  644 +Features that are optional:
  645 +
  646 + * Dynamic AML bytecodes insertion at run-time. We may need this to support
  647 + SSDT table generation and DSDT fix up.
  648 + * SMI support. Since U-Boot is a modern bootloader, we don't want to bring
  649 + those legacy stuff into U-Boot. ACPI spec allows a system that does not
  650 + support SMI (a legacy-free system).
  651 +
  652 +ACPI was initially enabled on BayTrail based boards. Testing was done by booting
  653 +a pre-installed Ubuntu 14.04 from a SATA drive. Installing Ubuntu 14.04 and
  654 +Windows 8.1/10 to a SATA drive and booting from there is also tested. Most
  655 +devices seem to work correctly and the board can respond a reboot/shutdown
  656 +command from the OS.
  657 +
  658 +For other platform boards, ACPI support status can be checked by examining their
  659 +board defconfig files to see if CONFIG_GENERATE_ACPI_TABLE is set to y.
  660 +
  661 +The S3 sleeping state is a low wake latency sleeping state defined by ACPI
  662 +spec where all system context is lost except system memory. To test S3 resume
  663 +with a Linux kernel, simply run "echo mem > /sys/power/state" and kernel will
  664 +put the board to S3 state where the power is off. So when the power button is
  665 +pressed again, U-Boot runs as it does in cold boot and detects the sleeping
  666 +state via ACPI register to see if it is S3, if yes it means we are waking up.
  667 +U-Boot is responsible for restoring the machine state as it is before sleep.
  668 +When everything is done, U-Boot finds out the wakeup vector provided by OSes
  669 +and jump there. To determine whether ACPI S3 resume is supported, check to
  670 +see if CONFIG_HAVE_ACPI_RESUME is set for that specific board.
  671 +
  672 +Note for testing S3 resume with Windows, correct graphics driver must be
  673 +installed for your platform, otherwise you won't find "Sleep" option in
  674 +the "Power" submenu from the Windows start menu.
  675 +
  676 +EFI Support
  677 +-----------
  678 +U-Boot supports booting as a 32-bit or 64-bit EFI payload, e.g. with UEFI.
  679 +This is enabled with CONFIG_EFI_STUB to boot from both 32-bit and 64-bit
  680 +UEFI BIOS. U-Boot can also run as an EFI application, with CONFIG_EFI_APP.
  681 +The CONFIG_EFI_LOADER option, where U-Boot provides an EFI environment to
  682 +the kernel (i.e. replaces UEFI completely but provides the same EFI run-time
  683 +services) is supported too. For example, we can even use 'bootefi' command
  684 +to load a 'u-boot-payload.efi', see below test logs on QEMU.
  685 +
  686 +.. code-block:: none
  687 +
  688 + => load ide 0 3000000 u-boot-payload.efi
  689 + 489787 bytes read in 138 ms (3.4 MiB/s)
  690 + => bootefi 3000000
  691 + Scanning disk ide.blk#0...
  692 + Found 2 disks
  693 + WARNING: booting without device tree
  694 + ## Starting EFI application at 03000000 ...
  695 + U-Boot EFI Payload
  696 +
  697 +
  698 + U-Boot 2018.07-rc2 (Jun 23 2018 - 17:12:58 +0800)
  699 +
  700 + CPU: x86_64, vendor AMD, device 663h
  701 + DRAM: 2 GiB
  702 + MMC:
  703 + Video: 1024x768x32
  704 + Model: EFI x86 Payload
  705 + Net: e1000: 52:54:00:12:34:56
  706 +
  707 + Warning: e1000#0 using MAC address from ROM
  708 + eth0: e1000#0
  709 + No controllers found
  710 + Hit any key to stop autoboot: 0
  711 +
  712 +See README.u-boot_on_efi and README.uefi for details of EFI support in U-Boot.
  713 +
  714 +TODO List
  715 +---------
  716 +- Audio
  717 +- Chrome OS verified boot
  718 +
  719 +.. _coreboot: http://www.coreboot.org
  720 +.. _QEMU: http://www.qemu.org
  721 +.. _microcode: http://en.wikipedia.org/wiki/Microcode
  722 +.. _SFI: http://simplefirmware.org
  723 +.. _MP: http://www.intel.com/design/archives/processors/pro/docs/242016.htm
  724 +.. _here: https://en.wikipedia.org/wiki/GUID_Partition_Table
  725 +.. _this: http://events.linuxfoundation.org/sites/events/files/slides/chromeos_and_diy_vboot_0.pdf
  726 +.. _that: http://events.linuxfoundation.org/sites/events/files/slides/elce-2014.pdf
  727 +.. _SeaBIOS: http://www.seabios.org/SeaBIOS
  728 +.. _ACPI: http://www.acpi.info