xref: /openbmc/u-boot/doc/README.x86 (revision c95c666d0128e5ec0c161b531c568233a8d3979d)
183d290c5STom Rini# SPDX-License-Identifier: GPL-2.0+
25dad97edSBin Meng#
35dad97edSBin Meng# Copyright (C) 2014, Simon Glass <sjg@chromium.org>
45dad97edSBin Meng# Copyright (C) 2014, Bin Meng <bmeng.cn@gmail.com>
55dad97edSBin Meng
65dad97edSBin MengU-Boot on x86
75dad97edSBin Meng=============
85dad97edSBin Meng
95dad97edSBin MengThis document describes the information about U-Boot running on x86 targets,
105dad97edSBin Mengincluding supported boards, build instructions, todo list, etc.
115dad97edSBin Meng
125dad97edSBin MengStatus
135dad97edSBin Meng------
145dad97edSBin MengU-Boot supports running as a coreboot [1] payload on x86. So far only Link
151ae5b78cSBin Meng(Chromebook Pixel) and QEMU [2] x86 targets have been tested, but it should
161ae5b78cSBin Mengwork with minimal adjustments on other x86 boards since coreboot deals with
171ae5b78cSBin Mengmost of the low-level details.
185dad97edSBin Meng
19495f3774SAndy ShevchenkoU-Boot is a main bootloader on Intel Edison board.
20495f3774SAndy Shevchenko
2128a85365SStoppa, IgorU-Boot also supports booting directly from x86 reset vector, without coreboot.
2228a85365SStoppa, IgorIn this case, known as bare mode, from the fact that it runs on the
23f21069ffSSimon Glass'bare metal', U-Boot acts like a BIOS replacement. The following platforms
24f21069ffSSimon Glassare supported:
25f21069ffSSimon Glass
26eda995a8SBin Meng   - Bayley Bay CRB
27eb45787bSBin Meng   - Cherry Hill CRB
28eda995a8SBin Meng   - Congatec QEVAL 2.0 & conga-QA3/E3845
29f21069ffSSimon Glass   - Cougar Canyon 2 CRB
30f21069ffSSimon Glass   - Crown Bay CRB
31f21069ffSSimon Glass   - Galileo
32f21069ffSSimon Glass   - Link (Chromebook Pixel)
33f21069ffSSimon Glass   - Minnowboard MAX
34f21069ffSSimon Glass   - Samus (Chromebook Pixel 2015)
35*6feb2ff5SBin Meng   - QEMU x86 (32-bit & 64-bit)
365dad97edSBin Meng
373a1a18ffSSimon GlassAs for loading an OS, U-Boot supports directly booting a 32-bit or 64-bit
383a1a18ffSSimon GlassLinux kernel as part of a FIT image. It also supports a compressed zImage.
393619e94aSBin MengU-Boot supports loading an x86 VxWorks kernel. Please check README.vxworks
403619e94aSBin Mengfor more details.
415dad97edSBin Meng
4228a85365SStoppa, IgorBuild Instructions for U-Boot as coreboot payload
4328a85365SStoppa, Igor-------------------------------------------------
445dad97edSBin MengBuilding U-Boot as a coreboot payload is just like building U-Boot for targets
455dad97edSBin Mengon other architectures, like below:
465dad97edSBin Meng
47d5032392SSimon Glass$ make coreboot_defconfig
485dad97edSBin Meng$ make all
495dad97edSBin Meng
50495f3774SAndy ShevchenkoBuild Instructions for U-Boot as main bootloader
51495f3774SAndy Shevchenko------------------------------------------------
52495f3774SAndy Shevchenko
53495f3774SAndy ShevchenkoIntel Edison instructions:
54495f3774SAndy Shevchenko
55495f3774SAndy ShevchenkoSimple you can build U-Boot and obtain u-boot.bin
56495f3774SAndy Shevchenko
57495f3774SAndy Shevchenko$ make edison_defconfig
58495f3774SAndy Shevchenko$ make all
59495f3774SAndy Shevchenko
6028a85365SStoppa, IgorBuild Instructions for U-Boot as BIOS replacement (bare mode)
6128a85365SStoppa, Igor-------------------------------------------------------------
623a1a18ffSSimon GlassBuilding a ROM version of U-Boot (hereafter referred to as u-boot.rom) is a
635dad97edSBin Menglittle bit tricky, as generally it requires several binary blobs which are not
645dad97edSBin Mengshipped in the U-Boot source tree. Due to this reason, the u-boot.rom build is
655dad97edSBin Mengnot turned on by default in the U-Boot source tree. Firstly, you need turn it
66871aa41dSHeinrich Schuchardton by enabling the ROM build either via an environment variable
675dad97edSBin Meng
68eea0f112SSimon Glass    $ export BUILD_ROM=y
69eea0f112SSimon Glass
70871aa41dSHeinrich Schuchardtor via configuration
71871aa41dSHeinrich Schuchardt
72871aa41dSHeinrich Schuchardt    CONFIG_BUILD_ROM=y
73871aa41dSHeinrich Schuchardt
74871aa41dSHeinrich SchuchardtBoth tell the Makefile to build u-boot.rom as a target.
755dad97edSBin Meng
7628a85365SStoppa, Igor---
7728a85365SStoppa, Igor
7828a85365SStoppa, IgorChromebook Link specific instructions for bare mode:
795dad97edSBin Meng
805dad97edSBin MengFirst, you need the following binary blobs:
815dad97edSBin Meng
825dad97edSBin Meng* descriptor.bin - Intel flash descriptor
835dad97edSBin Meng* me.bin - Intel Management Engine
845dad97edSBin Meng* mrc.bin - Memory Reference Code, which sets up SDRAM
855dad97edSBin Meng* video ROM - sets up the display
865dad97edSBin Meng
875dad97edSBin MengYou can get these binary blobs by:
885dad97edSBin Meng
895dad97edSBin Meng$ git clone http://review.coreboot.org/p/blobs.git
905dad97edSBin Meng$ cd blobs
915dad97edSBin Meng
925dad97edSBin MengFind the following files:
935dad97edSBin Meng
945dad97edSBin Meng* ./mainboard/google/link/descriptor.bin
955dad97edSBin Meng* ./mainboard/google/link/me.bin
968712af97SSimon Glass* ./northbridge/intel/sandybridge/systemagent-r6.bin
975dad97edSBin Meng
985dad97edSBin MengThe 3rd one should be renamed to mrc.bin.
99786a08e0SBin MengAs for the video ROM, you can get it here [3] and rename it to vga.bin.
1005dad97edSBin MengMake sure all these binary blobs are put in the board directory.
1015dad97edSBin Meng
1025dad97edSBin MengNow you can build U-Boot and obtain u-boot.rom:
1035dad97edSBin Meng
1045dad97edSBin Meng$ make chromebook_link_defconfig
1055dad97edSBin Meng$ make all
1065dad97edSBin Meng
10728a85365SStoppa, Igor---
10828a85365SStoppa, Igor
109374e78efSSimon GlassChromebook Samus (2015 Pixel) instructions for bare mode:
110374e78efSSimon Glass
111374e78efSSimon GlassFirst, you need the following binary blobs:
112374e78efSSimon Glass
113374e78efSSimon Glass* descriptor.bin - Intel flash descriptor
114374e78efSSimon Glass* me.bin - Intel Management Engine
115374e78efSSimon Glass* mrc.bin - Memory Reference Code, which sets up SDRAM
116374e78efSSimon Glass* refcode.elf - Additional Reference code
117374e78efSSimon Glass* vga.bin - video ROM, which sets up the display
118374e78efSSimon Glass
119374e78efSSimon GlassIf you have a samus you can obtain them from your flash, for example, in
120374e78efSSimon Glassdeveloper mode on the Chromebook (use Ctrl-Alt-F2 to obtain a terminal and
121374e78efSSimon Glasslog in as 'root'):
122374e78efSSimon Glass
123374e78efSSimon Glass   cd /tmp
124374e78efSSimon Glass   flashrom -w samus.bin
125374e78efSSimon Glass   scp samus.bin username@ip_address:/path/to/somewhere
126374e78efSSimon Glass
127374e78efSSimon GlassIf not see the coreboot tree [4] where you can use:
128374e78efSSimon Glass
129374e78efSSimon Glass   bash crosfirmware.sh samus
130374e78efSSimon Glass
131374e78efSSimon Glassto get the image. There is also an 'extract_blobs.sh' scripts that you can use
132374e78efSSimon Glasson the 'coreboot-Google_Samus.*' file to short-circuit some of the below.
133374e78efSSimon Glass
134374e78efSSimon GlassThen 'ifdtool -x samus.bin' on your development machine will produce:
135374e78efSSimon Glass
136374e78efSSimon Glass   flashregion_0_flashdescriptor.bin
137374e78efSSimon Glass   flashregion_1_bios.bin
138374e78efSSimon Glass   flashregion_2_intel_me.bin
139374e78efSSimon Glass
140374e78efSSimon GlassRename flashregion_0_flashdescriptor.bin to descriptor.bin
141374e78efSSimon GlassRename flashregion_2_intel_me.bin to me.bin
142374e78efSSimon GlassYou can ignore flashregion_1_bios.bin - it is not used.
143374e78efSSimon Glass
144374e78efSSimon GlassTo get the rest, use 'cbfstool samus.bin print':
145374e78efSSimon Glass
146374e78efSSimon Glasssamus.bin: 8192 kB, bootblocksize 2864, romsize 8388608, offset 0x700000
147374e78efSSimon Glassalignment: 64 bytes, architecture: x86
148374e78efSSimon Glass
149374e78efSSimon GlassName                           Offset     Type         Size
150374e78efSSimon Glasscmos_layout.bin                0x700000   cmos_layout  1164
151374e78efSSimon Glasspci8086,0406.rom               0x7004c0   optionrom    65536
152374e78efSSimon Glassspd.bin                        0x710500   (unknown)    4096
153374e78efSSimon Glasscpu_microcode_blob.bin         0x711540   microcode    70720
154374e78efSSimon Glassfallback/romstage              0x722a00   stage        54210
155374e78efSSimon Glassfallback/ramstage              0x72fe00   stage        96382
156374e78efSSimon Glassconfig                         0x7476c0   raw          6075
157374e78efSSimon Glassfallback/vboot                 0x748ec0   stage        15980
158374e78efSSimon Glassfallback/refcode               0x74cd80   stage        75578
159374e78efSSimon Glassfallback/payload               0x75f500   payload      62878
160374e78efSSimon Glassu-boot.dtb                     0x76eb00   (unknown)    5318
161374e78efSSimon Glass(empty)                        0x770000   null         196504
162374e78efSSimon Glassmrc.bin                        0x79ffc0   (unknown)    222876
163374e78efSSimon Glass(empty)                        0x7d66c0   null         167320
164374e78efSSimon Glass
165374e78efSSimon GlassYou can extract what you need:
166374e78efSSimon Glass
167374e78efSSimon Glass   cbfstool samus.bin extract -n pci8086,0406.rom -f vga.bin
168374e78efSSimon Glass   cbfstool samus.bin extract -n fallback/refcode -f refcode.rmod
169374e78efSSimon Glass   cbfstool samus.bin extract -n mrc.bin -f mrc.bin
170374e78efSSimon Glass   cbfstool samus.bin extract -n fallback/refcode -f refcode.bin -U
171374e78efSSimon Glass
172374e78efSSimon GlassNote that the -U flag is only supported by the latest cbfstool. It unpacks
173374e78efSSimon Glassand decompresses the stage to produce a coreboot rmodule. This is a simple
174374e78efSSimon Glassrepresentation of an ELF file. You need the patch "Support decoding a stage
175374e78efSSimon Glasswith compression".
176374e78efSSimon Glass
177374e78efSSimon GlassPut all 5 files into board/google/chromebook_samus.
178374e78efSSimon Glass
179374e78efSSimon GlassNow you can build U-Boot and obtain u-boot.rom:
180374e78efSSimon Glass
181374e78efSSimon Glass$ make chromebook_link_defconfig
182374e78efSSimon Glass$ make all
183374e78efSSimon Glass
184374e78efSSimon GlassIf you are using em100, then this command will flash write -Boot:
185374e78efSSimon Glass
186374e78efSSimon Glass   em100 -s -d filename.rom -c W25Q64CV -r
187374e78efSSimon Glass
188374e78efSSimon Glass---
189374e78efSSimon Glass
19028a85365SStoppa, IgorIntel Crown Bay specific instructions for bare mode:
1915dad97edSBin Meng
1921ae5b78cSBin MengU-Boot support of Intel Crown Bay board [4] relies on a binary blob called
1931ae5b78cSBin MengFirmware Support Package [5] to perform all the necessary initialization steps
1945dad97edSBin Mengas documented in the BIOS Writer Guide, including initialization of the CPU,
1955dad97edSBin Mengmemory controller, chipset and certain bus interfaces.
1965dad97edSBin Meng
1975dad97edSBin MengDownload the Intel FSP for Atom E6xx series and Platform Controller Hub EG20T,
1985dad97edSBin Menginstall it on your host and locate the FSP binary blob. Note this platform
1995dad97edSBin Mengalso requires a Chipset Micro Code (CMC) state machine binary to be present in
2005dad97edSBin Mengthe SPI flash where u-boot.rom resides, and this CMC binary blob can be found
2015dad97edSBin Mengin this FSP package too.
2025dad97edSBin Meng
2035dad97edSBin Meng* ./FSP/QUEENSBAY_FSP_GOLD_001_20-DECEMBER-2013.fd
2045dad97edSBin Meng* ./Microcode/C0_22211.BIN
2055dad97edSBin Meng
2065dad97edSBin MengRename the first one to fsp.bin and second one to cmc.bin and put them in the
2075dad97edSBin Mengboard directory.
2085dad97edSBin Meng
20983d9712eSBin MengNote the FSP release version 001 has a bug which could cause random endless
21083d9712eSBin Mengloop during the FspInit call. This bug was published by Intel although Intel
21183d9712eSBin Mengdid not describe any details. We need manually apply the patch to the FSP
21283d9712eSBin Mengbinary using any hex editor (eg: bvi). Go to the offset 0x1fcd8 of the FSP
21383d9712eSBin Mengbinary, change the following five bytes values from orginally E8 42 FF FF FF
21483d9712eSBin Mengto B8 00 80 0B 00.
21583d9712eSBin Meng
2167aaff9bfSBin MengAs for the video ROM, you need manually extract it from the Intel provided
2177aaff9bfSBin MengBIOS for Crown Bay here [6], using the AMI MMTool [7]. Check PCI option ROM
2187aaff9bfSBin MengID 8086:4108, extract and save it as vga.bin in the board directory.
2197aaff9bfSBin Meng
220617b867fSBin MengNow you can build U-Boot and obtain u-boot.rom
2215dad97edSBin Meng
2225dad97edSBin Meng$ make crownbay_defconfig
2235dad97edSBin Meng$ make all
2245dad97edSBin Meng
22528a85365SStoppa, Igor---
22628a85365SStoppa, Igor
227a2e3b05eSBin MengIntel Cougar Canyon 2 specific instructions for bare mode:
228a2e3b05eSBin Meng
229a2e3b05eSBin MengThis uses Intel FSP for 3rd generation Intel Core and Intel Celeron processors
230a2e3b05eSBin Mengwith mobile Intel HM76 and QM77 chipsets platform. Download it from Intel FSP
231a2e3b05eSBin Mengwebsite and put the .fd file (CHIEFRIVER_FSP_GOLD_001_09-OCTOBER-2013.fd at the
232a2e3b05eSBin Mengtime of writing) in the board directory and rename it to fsp.bin.
233a2e3b05eSBin Meng
234a2e3b05eSBin MengNow build U-Boot and obtain u-boot.rom
235a2e3b05eSBin Meng
236a2e3b05eSBin Meng$ make cougarcanyon2_defconfig
237a2e3b05eSBin Meng$ make all
238a2e3b05eSBin Meng
239a2e3b05eSBin MengThe board has two 8MB SPI flashes mounted, which are called SPI-0 and SPI-1 in
240a2e3b05eSBin Mengthe board manual. The SPI-0 flash should have flash descriptor plus ME firmware
241a2e3b05eSBin Mengand SPI-1 flash is used to store U-Boot. For convenience, the complete 8MB SPI-0
242a2e3b05eSBin Mengflash image is included in the FSP package (named Rom00_8M_MB_PPT.bin). Program
243a2e3b05eSBin Mengthis image to the SPI-0 flash according to the board manual just once and we are
244fb05f0b0SBin Mengall set. For programming U-Boot we just need to program SPI-1 flash. Since the
245fb05f0b0SBin Mengdefault u-boot.rom image for this board is set to 2MB, it should be programmed
246fb05f0b0SBin Mengto the last 2MB of the 8MB chip, address range [600000, 7FFFFF].
247a2e3b05eSBin Meng
248a2e3b05eSBin Meng---
249a2e3b05eSBin Meng
25003bfc783SBin MengIntel Bay Trail based board instructions for bare mode:
2513a1a18ffSSimon Glass
2523a1a18ffSSimon GlassThis uses as FSP as with Crown Bay, except it is for the Atom E3800 series.
25303bfc783SBin MengTwo boards that use this configuration are Bayley Bay and Minnowboard MAX.
2543a1a18ffSSimon GlassDownload this and get the .fd file (BAYTRAIL_FSP_GOLD_003_16-SEP-2014.fd at
25503bfc783SBin Mengthe time of writing). Put it in the corresponding board directory and rename
25603bfc783SBin Mengit to fsp.bin.
2573a1a18ffSSimon Glass
2583a1a18ffSSimon GlassObtain the VGA RAM (Vga.dat at the time of writing) and put it into the same
25903bfc783SBin Mengboard directory as vga.bin.
2603a1a18ffSSimon Glass
26103bfc783SBin MengYou still need two more binary blobs. For Bayley Bay, they can be extracted
26203bfc783SBin Mengfrom the sample SPI image provided in the FSP (SPI.bin at the time of writing).
26303bfc783SBin Meng
26403bfc783SBin Meng   $ ./tools/ifdtool -x BayleyBay/SPI.bin
26503bfc783SBin Meng   $ cp flashregion_0_flashdescriptor.bin board/intel/bayleybay/descriptor.bin
26603bfc783SBin Meng   $ cp flashregion_2_intel_me.bin board/intel/bayleybay/me.bin
26703bfc783SBin Meng
26803bfc783SBin MengFor Minnowboard MAX, we can reuse the same ME firmware above, but for flash
26903bfc783SBin Mengdescriptor, we need get that somewhere else, as the one above does not seem to
27003bfc783SBin Mengwork, probably because it is not designed for the Minnowboard MAX. Now download
27103bfc783SBin Mengthe original firmware image for this board from:
27268522481SSimon Glass
27368522481SSimon Glasshttp://firmware.intel.com/sites/default/files/2014-WW42.4-MinnowBoardMax.73-64-bit.bin_Release.zip
27468522481SSimon Glass
27568522481SSimon GlassUnzip it:
27668522481SSimon Glass
27768522481SSimon Glass   $ unzip 2014-WW42.4-MinnowBoardMax.73-64-bit.bin_Release.zip
2783a1a18ffSSimon Glass
2793a1a18ffSSimon GlassUse ifdtool in the U-Boot tools directory to extract the images from that
2803a1a18ffSSimon Glassfile, for example:
2813a1a18ffSSimon Glass
28268522481SSimon Glass   $ ./tools/ifdtool -x MNW2MAX1.X64.0073.R02.1409160934.bin
28368522481SSimon Glass
28468522481SSimon GlassThis will provide the descriptor file - copy this into the correct place:
28568522481SSimon Glass
28668522481SSimon Glass   $ cp flashregion_0_flashdescriptor.bin board/intel/minnowmax/descriptor.bin
28768522481SSimon Glass
2883a1a18ffSSimon GlassNow you can build U-Boot and obtain u-boot.rom
28903bfc783SBin MengNote: below are examples/information for Minnowboard MAX.
2903a1a18ffSSimon Glass
2913a1a18ffSSimon Glass$ make minnowmax_defconfig
2923a1a18ffSSimon Glass$ make all
2933a1a18ffSSimon Glass
294df898678SSimon GlassChecksums are as follows (but note that newer versions will invalidate this):
295df898678SSimon Glass
296df898678SSimon Glass$ md5sum -b board/intel/minnowmax/*.bin
297df898678SSimon Glassffda9a3b94df5b74323afb328d51e6b4  board/intel/minnowmax/descriptor.bin
298df898678SSimon Glass69f65b9a580246291d20d08cbef9d7c5  board/intel/minnowmax/fsp.bin
299df898678SSimon Glass894a97d371544ec21de9c3e8e1716c4b  board/intel/minnowmax/me.bin
300df898678SSimon Glassa2588537da387da592a27219d56e9962  board/intel/minnowmax/vga.bin
301df898678SSimon Glass
302537ccba2SSimon GlassThe ROM image is broken up into these parts:
303537ccba2SSimon Glass
304537ccba2SSimon GlassOffset   Description         Controlling config
305537ccba2SSimon Glass------------------------------------------------------------
306537ccba2SSimon Glass000000   descriptor.bin      Hard-coded to 0 in ifdtool
307537ccba2SSimon Glass001000   me.bin              Set by the descriptor
308537ccba2SSimon Glass500000   <spare>
30991fc5bf6SBin Meng6ef000   Environment         CONFIG_ENV_OFFSET
310638a0589SBin Meng6f0000   MRC cache           CONFIG_ENABLE_MRC_CACHE
311537ccba2SSimon Glass700000   u-boot-dtb.bin      CONFIG_SYS_TEXT_BASE
312917d3565SBin Meng7b0000   vga.bin             CONFIG_VGA_BIOS_ADDR
313537ccba2SSimon Glass7c0000   fsp.bin             CONFIG_FSP_ADDR
314537ccba2SSimon Glass7f8000   <spare>             (depends on size of fsp.bin)
315537ccba2SSimon Glass7ff800   U-Boot 16-bit boot  CONFIG_SYS_X86_START16
316537ccba2SSimon Glass
317537ccba2SSimon GlassOverall ROM image size is controlled by CONFIG_ROM_SIZE.
318537ccba2SSimon Glass
3195d98c5ecSStefan RoeseNote that the debug version of the FSP is bigger in size. If this version
3205d98c5ecSStefan Roeseis used, CONFIG_FSP_ADDR needs to be configured to 0xfffb0000 instead of
3215d98c5ecSStefan Roesethe default value 0xfffc0000.
3225d98c5ecSStefan Roese
32328a85365SStoppa, Igor---
324537ccba2SSimon Glass
325eb45787bSBin MengIntel Cherry Hill specific instructions for bare mode:
326eb45787bSBin Meng
327eb45787bSBin MengThis uses Intel FSP for Braswell platform. Download it from Intel FSP website,
328eb45787bSBin Mengput the .fd file to the board directory and rename it to fsp.bin.
329eb45787bSBin Meng
330eb45787bSBin MengExtract descriptor.bin and me.bin from the original BIOS on the board using
331eb45787bSBin Mengifdtool and put them to the board directory as well.
332eb45787bSBin Meng
333eb45787bSBin MengNote the FSP package for Braswell does not ship a traditional legacy VGA BIOS
334eb45787bSBin Mengimage for the integrated graphics device. Instead a new binary called Video
335eb45787bSBin MengBIOS Table (VBT) is shipped. Put it to the board directory and rename it to
336eb45787bSBin Mengvbt.bin if you want graphics support in U-Boot.
337eb45787bSBin Meng
338eb45787bSBin MengNow you can build U-Boot and obtain u-boot.rom
339eb45787bSBin Meng
340eb45787bSBin Meng$ make cherryhill_defconfig
341eb45787bSBin Meng$ make all
342eb45787bSBin Meng
343eb45787bSBin MengAn important note for programming u-boot.rom to the on-board SPI flash is that
344eb45787bSBin Mengyou need make sure the SPI flash's 'quad enable' bit in its status register
345eb45787bSBin Mengmatches the settings in the descriptor.bin, otherwise the board won't boot.
346eb45787bSBin Meng
347eb45787bSBin MengFor the on-board SPI flash MX25U6435F, this can be done by writing 0x40 to the
348eb45787bSBin Mengstatus register by DediProg in: Config > Modify Status Register > Write Status
349eb45787bSBin MengRegister(s) > Register1 Value(Hex). This is is a one-time change. Once set, it
350eb45787bSBin Mengpersists in SPI flash part regardless of the u-boot.rom image burned.
351eb45787bSBin Meng
352eb45787bSBin Meng---
353eb45787bSBin Meng
35428a85365SStoppa, IgorIntel Galileo instructions for bare mode:
35567582c00SBin Meng
35667582c00SBin MengOnly one binary blob is needed for Remote Management Unit (RMU) within Intel
35767582c00SBin MengQuark SoC. Not like FSP, U-Boot does not call into the binary. The binary is
35867582c00SBin Mengneeded by the Quark SoC itself.
35967582c00SBin Meng
36067582c00SBin MengYou can get the binary blob from Quark Board Support Package from Intel website:
36167582c00SBin Meng
36267582c00SBin Meng* ./QuarkSocPkg/QuarkNorthCluster/Binary/QuarkMicrocode/RMU.bin
36367582c00SBin Meng
36467582c00SBin MengRename the file and put it to the board directory by:
36567582c00SBin Meng
36667582c00SBin Meng   $ cp RMU.bin board/intel/galileo/rmu.bin
36767582c00SBin Meng
36867582c00SBin MengNow you can build U-Boot and obtain u-boot.rom
36967582c00SBin Meng
37067582c00SBin Meng$ make galileo_defconfig
37167582c00SBin Meng$ make all
3723a1a18ffSSimon Glass
37303bfc783SBin Meng---
37403bfc783SBin Meng
37503bfc783SBin MengQEMU x86 target instructions for bare mode:
3761ae5b78cSBin Meng
3771ae5b78cSBin MengTo build u-boot.rom for QEMU x86 targets, just simply run
3781ae5b78cSBin Meng
379*6feb2ff5SBin Meng$ make qemu-x86_defconfig (for 32-bit)
380*6feb2ff5SBin Mengor
381*6feb2ff5SBin Meng$ make qemu-x86_64_defconfig (for 64-bit)
3821ae5b78cSBin Meng$ make all
3831ae5b78cSBin Meng
384683b09d7SBin MengNote this default configuration will build a U-Boot for the QEMU x86 i440FX
385683b09d7SBin Mengboard. To build a U-Boot against QEMU x86 Q35 board, you can change the build
386683b09d7SBin Mengconfiguration during the 'make menuconfig' process like below:
387683b09d7SBin Meng
388683b09d7SBin MengDevice Tree Control  --->
389683b09d7SBin Meng	...
390683b09d7SBin Meng	(qemu-x86_q35) Default Device Tree for DT control
391683b09d7SBin Meng
392617b867fSBin MengTest with coreboot
393617b867fSBin Meng------------------
394617b867fSBin MengFor testing U-Boot as the coreboot payload, there are things that need be paid
395617b867fSBin Mengattention to. coreboot supports loading an ELF executable and a 32-bit plain
396617b867fSBin Mengbinary, as well as other supported payloads. With the default configuration,
397617b867fSBin MengU-Boot is set up to use a separate Device Tree Blob (dtb). As of today, the
398617b867fSBin Menggenerated u-boot-dtb.bin needs to be packaged by the cbfstool utility (a tool
399617b867fSBin Mengprovided by coreboot) manually as coreboot's 'make menuconfig' does not provide
400617b867fSBin Mengthis capability yet. The command is as follows:
401617b867fSBin Meng
402617b867fSBin Meng# in the coreboot root directory
403617b867fSBin Meng$ ./build/util/cbfstool/cbfstool build/coreboot.rom add-flat-binary \
404330728d7SBin Meng  -f u-boot-dtb.bin -n fallback/payload -c lzma -l 0x1110000 -e 0x1110000
405617b867fSBin Meng
406330728d7SBin MengMake sure 0x1110000 matches CONFIG_SYS_TEXT_BASE, which is the symbol address
407330728d7SBin Mengof _x86boot_start (in arch/x86/cpu/start.S).
408617b867fSBin Meng
409617b867fSBin MengIf you want to use ELF as the coreboot payload, change U-Boot configuration to
410eea0f112SSimon Glassuse CONFIG_OF_EMBED instead of CONFIG_OF_SEPARATE.
411617b867fSBin Meng
4123a1a18ffSSimon GlassTo enable video you must enable these options in coreboot:
4133a1a18ffSSimon Glass
4143a1a18ffSSimon Glass   - Set framebuffer graphics resolution (1280x1024 32k-color (1:5:5))
4153a1a18ffSSimon Glass   - Keep VESA framebuffer
4163a1a18ffSSimon Glass
4173a1a18ffSSimon GlassAt present it seems that for Minnowboard Max, coreboot does not pass through
4183a1a18ffSSimon Glassthe video information correctly (it always says the resolution is 0x0). This
4193a1a18ffSSimon Glassworks correctly for link though.
4203a1a18ffSSimon Glass
42128a85365SStoppa, IgorTest with QEMU for bare mode
42228a85365SStoppa, Igor----------------------------
4231ae5b78cSBin MengQEMU is a fancy emulator that can enable us to test U-Boot without access to
4249c4f5412SBin Menga real x86 board. Please make sure your QEMU version is 2.3.0 or above test
4259c4f5412SBin MengU-Boot. To launch QEMU with u-boot.rom, call QEMU as follows:
4261ae5b78cSBin Meng
4271ae5b78cSBin Meng$ qemu-system-i386 -nographic -bios path/to/u-boot.rom
4281ae5b78cSBin Meng
4291ae5b78cSBin MengThis will instantiate an emulated x86 board with i440FX and PIIX chipset. QEMU
4301ae5b78cSBin Mengalso supports emulating an x86 board with Q35 and ICH9 based chipset, which is
4311ae5b78cSBin Mengalso supported by U-Boot. To instantiate such a machine, call QEMU with:
4321ae5b78cSBin Meng
4331ae5b78cSBin Meng$ qemu-system-i386 -nographic -bios path/to/u-boot.rom -M q35
4341ae5b78cSBin Meng
4351ae5b78cSBin MengNote by default QEMU instantiated boards only have 128 MiB system memory. But
4361ae5b78cSBin Mengit is enough to have U-Boot boot and function correctly. You can increase the
4371ae5b78cSBin Mengsystem memory by pass '-m' parameter to QEMU if you want more memory:
4381ae5b78cSBin Meng
4391ae5b78cSBin Meng$ qemu-system-i386 -nographic -bios path/to/u-boot.rom -m 1024
4401ae5b78cSBin Meng
4411ae5b78cSBin MengThis creates a board with 1 GiB system memory. Currently U-Boot for QEMU only
4421ae5b78cSBin Mengsupports 3 GiB maximum system memory and reserves the last 1 GiB address space
4431ae5b78cSBin Mengfor PCI device memory-mapped I/O and other stuff, so the maximum value of '-m'
4441ae5b78cSBin Mengwould be 3072.
4453a1a18ffSSimon Glass
4469c4f5412SBin MengQEMU emulates a graphic card which U-Boot supports. Removing '-nographic' will
4479c4f5412SBin Mengshow QEMU's VGA console window. Note this will disable QEMU's serial output.
4489c4f5412SBin MengIf you want to check both consoles, use '-serial stdio'.
4499c4f5412SBin Meng
450a2eb65fcSBin MengMulticore is also supported by QEMU via '-smp n' where n is the number of cores
4515c2ed61cSMiao Yanto instantiate. Note, the maximum supported CPU number in QEMU is 255.
4525c2ed61cSMiao Yan
453eda995a8SBin MengThe fw_cfg interface in QEMU also provides information about kernel data,
454eda995a8SBin Menginitrd, command-line arguments and more. U-Boot supports directly accessing
455eda995a8SBin Mengthese informtion from fw_cfg interface, which saves the time of loading them
456eda995a8SBin Mengfrom hard disk or network again, through emulated devices. To use it , simply
457eda995a8SBin Mengproviding them in QEMU command line:
4585c2ed61cSMiao Yan
4595c2ed61cSMiao Yan$ qemu-system-i386 -nographic -bios path/to/u-boot.rom -m 1024 -kernel /path/to/bzImage
4605c2ed61cSMiao Yan    -append 'root=/dev/ram console=ttyS0' -initrd /path/to/initrd -smp 8
4615c2ed61cSMiao Yan
4625c2ed61cSMiao YanNote: -initrd and -smp are both optional
4635c2ed61cSMiao Yan
464eda995a8SBin MengThen start QEMU, in U-Boot command line use the following U-Boot command to
465eda995a8SBin Mengsetup kernel:
4665c2ed61cSMiao Yan
4675c2ed61cSMiao Yan => qfw
4685c2ed61cSMiao Yanqfw - QEMU firmware interface
4695c2ed61cSMiao Yan
4705c2ed61cSMiao YanUsage:
4715c2ed61cSMiao Yanqfw <command>
4725c2ed61cSMiao Yan    - list                             : print firmware(s) currently loaded
4735c2ed61cSMiao Yan    - cpus                             : print online cpu number
4745c2ed61cSMiao Yan    - load <kernel addr> <initrd addr> : load kernel and initrd (if any) and setup for zboot
4755c2ed61cSMiao Yan
4765c2ed61cSMiao Yan=> qfw load
4775c2ed61cSMiao Yanloading kernel to address 01000000 size 5d9d30 initrd 04000000 size 1b1ab50
4785c2ed61cSMiao Yan
479eda995a8SBin MengHere the kernel (bzImage) is loaded to 01000000 and initrd is to 04000000. Then,
480eda995a8SBin Meng'zboot' can be used to boot the kernel:
4815c2ed61cSMiao Yan
48210491c83SBin Meng=> zboot 01000000 - 04000000 1b1ab50
483a2eb65fcSBin Meng
484*6feb2ff5SBin MengTo run 64-bit U-Boot, qemu-system-x86_64 should be used instead, e.g.:
485*6feb2ff5SBin Meng$ qemu-system-x86_64 -nographic -bios path/to/u-boot.rom
486*6feb2ff5SBin Meng
487*6feb2ff5SBin MengA specific CPU can be specified via the '-cpu' parameter but please make
488*6feb2ff5SBin Mengsure the specified CPU supports 64-bit like '-cpu core2duo'. Conversely
489*6feb2ff5SBin Meng'-cpu pentium' won't work for obvious reasons that the processor only
490*6feb2ff5SBin Mengsupports 32-bit.
491*6feb2ff5SBin Meng
492*6feb2ff5SBin MengNote 64-bit support is very preliminary at this point. Lots of features
493*6feb2ff5SBin Mengare missing in the 64-bit world. One notable feature is the VGA console
494*6feb2ff5SBin Mengsupport which is currently missing, so that you must specify '-nographic'
495*6feb2ff5SBin Mengto get 64-bit U-Boot up and running.
496*6feb2ff5SBin Meng
497495f3774SAndy ShevchenkoUpdating U-Boot on Edison
498495f3774SAndy Shevchenko-------------------------
499495f3774SAndy ShevchenkoBy default Intel Edison boards are shipped with preinstalled heavily
500495f3774SAndy Shevchenkopatched U-Boot v2014.04. Though it supports DFU which we may be able to
501495f3774SAndy Shevchenkouse.
502495f3774SAndy Shevchenko
503495f3774SAndy Shevchenko1. Prepare u-boot.bin as described in chapter above. You still need one
504495f3774SAndy Shevchenkomore step (if and only if you have original U-Boot), i.e. run the
505495f3774SAndy Shevchenkofollowing command:
506495f3774SAndy Shevchenko
507495f3774SAndy Shevchenko$ truncate -s %4096 u-boot.bin
508495f3774SAndy Shevchenko
509495f3774SAndy Shevchenko2. Run your board and interrupt booting to U-Boot console. In the console
510495f3774SAndy Shevchenkocall:
511495f3774SAndy Shevchenko
512495f3774SAndy Shevchenko => run do_force_flash_os
513495f3774SAndy Shevchenko
514495f3774SAndy Shevchenko3. Wait for few seconds, it will prepare environment variable and runs
515495f3774SAndy ShevchenkoDFU. Run DFU command from the host system:
516495f3774SAndy Shevchenko
517495f3774SAndy Shevchenko$ dfu-util -v -d 8087:0a99 --alt u-boot0 -D u-boot.bin
518495f3774SAndy Shevchenko
519495f3774SAndy Shevchenko4. Return to U-Boot console and following hint. i.e. push Ctrl+C, and
520495f3774SAndy Shevchenkoreset the board:
521495f3774SAndy Shevchenko
522495f3774SAndy Shevchenko => reset
523495f3774SAndy Shevchenko
5245dad97edSBin MengCPU Microcode
5255dad97edSBin Meng-------------
5267aaff9bfSBin MengModern CPUs usually require a special bit stream called microcode [8] to be
5275dad97edSBin Mengloaded on the processor after power up in order to function properly. U-Boot
5285dad97edSBin Menghas already integrated these as hex dumps in the source tree.
5295dad97edSBin Meng
5301281a1fcSBin MengSMP Support
5311281a1fcSBin Meng-----------
5321281a1fcSBin MengOn a multicore system, U-Boot is executed on the bootstrap processor (BSP).
5331281a1fcSBin MengAdditional application processors (AP) can be brought up by U-Boot. In order to
5341281a1fcSBin Menghave an SMP kernel to discover all of the available processors, U-Boot needs to
5351281a1fcSBin Mengprepare configuration tables which contain the multi-CPUs information before
5361281a1fcSBin Mengloading the OS kernel. Currently U-Boot supports generating two types of tables
5377aaff9bfSBin Mengfor SMP, called Simple Firmware Interface (SFI) [9] and Multi-Processor (MP)
5387aaff9bfSBin Meng[10] tables. The writing of these two tables are controlled by two Kconfig
5397aaff9bfSBin Mengoptions GENERATE_SFI_TABLE and GENERATE_MP_TABLE.
5401281a1fcSBin Meng
5415dad97edSBin MengDriver Model
5425dad97edSBin Meng------------
543f21069ffSSimon Glassx86 has been converted to use driver model for serial, GPIO, SPI, SPI flash,
544f21069ffSSimon Glasskeyboard, real-time clock, USB. Video is in progress.
5455dad97edSBin Meng
5465dad97edSBin MengDevice Tree
5475dad97edSBin Meng-----------
5485dad97edSBin Mengx86 uses device tree to configure the board thus requires CONFIG_OF_CONTROL to
549617b867fSBin Mengbe turned on. Not every device on the board is configured via device tree, but
5505dad97edSBin Mengmore and more devices will be added as time goes by. Check out the directory
5515dad97edSBin Mengarch/x86/dts/ for these device tree source files.
5525dad97edSBin Meng
553cb3b2e62SSimon GlassUseful Commands
554cb3b2e62SSimon Glass---------------
555cb3b2e62SSimon GlassIn keeping with the U-Boot philosophy of providing functions to check and
556cb3b2e62SSimon Glassadjust internal settings, there are several x86-specific commands that may be
557cb3b2e62SSimon Glassuseful:
558cb3b2e62SSimon Glass
55962716ebbSBin Mengfsp  - Display information about Intel Firmware Support Package (FSP).
56062716ebbSBin Meng	 This is only available on platforms which use FSP, mostly Atom.
561cb3b2e62SSimon Glassiod  - Display I/O memory
562cb3b2e62SSimon Glassiow  - Write I/O memory
563cb3b2e62SSimon Glassmtrr - List and set the Memory Type Range Registers (MTRR). These are used to
564cb3b2e62SSimon Glass	 tell the CPU whether memory is cacheable and if so the cache write
565cb3b2e62SSimon Glass	 mode to use. U-Boot sets up some reasonable values but you can
566cb3b2e62SSimon Glass	 adjust then with this command.
567cb3b2e62SSimon Glass
5687bea5271SSimon GlassBooting Ubuntu
5697bea5271SSimon Glass--------------
5707bea5271SSimon GlassAs an example of how to set up your boot flow with U-Boot, here are
5717bea5271SSimon Glassinstructions for starting Ubuntu from U-Boot. These instructions have been
572eda995a8SBin Mengtested on Minnowboard MAX with a SATA drive but are equally applicable on
573eda995a8SBin Mengother platforms and other media. There are really only four steps and it's a
5747bea5271SSimon Glassvery simple script, but a more detailed explanation is provided here for
5757bea5271SSimon Glasscompleteness.
5767bea5271SSimon Glass
5777bea5271SSimon GlassNote: It is possible to set up U-Boot to boot automatically using syslinux.
5787bea5271SSimon GlassIt could also use the grub.cfg file (/efi/ubuntu/grub.cfg) to obtain the
5797bea5271SSimon GlassGUID. If you figure these out, please post patches to this README.
5807bea5271SSimon Glass
581eda995a8SBin MengFirstly, you will need Ubuntu installed on an available disk. It should be
5827bea5271SSimon Glasspossible to make U-Boot start a USB start-up disk but for now let's assume
5837bea5271SSimon Glassthat you used another boot loader to install Ubuntu.
5847bea5271SSimon Glass
5857bea5271SSimon GlassUse the U-Boot command line to find the UUID of the partition you want to
5867bea5271SSimon Glassboot. For example our disk is SCSI device 0:
5877bea5271SSimon Glass
5887bea5271SSimon Glass=> part list scsi 0
5897bea5271SSimon Glass
5907bea5271SSimon GlassPartition Map for SCSI device 0  --   Partition Type: EFI
5917bea5271SSimon Glass
5927bea5271SSimon Glass   Part	Start LBA	End LBA		Name
5937bea5271SSimon Glass	Attributes
5947bea5271SSimon Glass	Type GUID
5957bea5271SSimon Glass	Partition GUID
5967bea5271SSimon Glass   1	0x00000800	0x001007ff	""
5977bea5271SSimon Glass	attrs:	0x0000000000000000
5987bea5271SSimon Glass	type:	c12a7328-f81f-11d2-ba4b-00a0c93ec93b
5997bea5271SSimon Glass	guid:	9d02e8e4-4d59-408f-a9b0-fd497bc9291c
6007bea5271SSimon Glass   2	0x00100800	0x037d8fff	""
6017bea5271SSimon Glass	attrs:	0x0000000000000000
6027bea5271SSimon Glass	type:	0fc63daf-8483-4772-8e79-3d69d8477de4
6037bea5271SSimon Glass	guid:	965c59ee-1822-4326-90d2-b02446050059
6047bea5271SSimon Glass   3	0x037d9000	0x03ba27ff	""
6057bea5271SSimon Glass	attrs:	0x0000000000000000
6067bea5271SSimon Glass	type:	0657fd6d-a4ab-43c4-84e5-0933c84b4f4f
6077bea5271SSimon Glass	guid:	2c4282bd-1e82-4bcf-a5ff-51dedbf39f17
6087bea5271SSimon Glass   =>
6097bea5271SSimon Glass
6107bea5271SSimon GlassThis shows that your SCSI disk has three partitions. The really long hex
6117bea5271SSimon Glassstrings are called Globally Unique Identifiers (GUIDs). You can look up the
6127bea5271SSimon Glass'type' ones here [11]. On this disk the first partition is for EFI and is in
6137bea5271SSimon GlassVFAT format (DOS/Windows):
6147bea5271SSimon Glass
6157bea5271SSimon Glass   => fatls scsi 0:1
6167bea5271SSimon Glass               efi/
6177bea5271SSimon Glass
6187bea5271SSimon Glass   0 file(s), 1 dir(s)
6197bea5271SSimon Glass
6207bea5271SSimon Glass
6217bea5271SSimon GlassPartition 2 is 'Linux filesystem data' so that will be our root disk. It is
6227bea5271SSimon Glassin ext2 format:
6237bea5271SSimon Glass
6247bea5271SSimon Glass   => ext2ls scsi 0:2
6257bea5271SSimon Glass   <DIR>       4096 .
6267bea5271SSimon Glass   <DIR>       4096 ..
6277bea5271SSimon Glass   <DIR>      16384 lost+found
6287bea5271SSimon Glass   <DIR>       4096 boot
6297bea5271SSimon Glass   <DIR>      12288 etc
6307bea5271SSimon Glass   <DIR>       4096 media
6317bea5271SSimon Glass   <DIR>       4096 bin
6327bea5271SSimon Glass   <DIR>       4096 dev
6337bea5271SSimon Glass   <DIR>       4096 home
6347bea5271SSimon Glass   <DIR>       4096 lib
6357bea5271SSimon Glass   <DIR>       4096 lib64
6367bea5271SSimon Glass   <DIR>       4096 mnt
6377bea5271SSimon Glass   <DIR>       4096 opt
6387bea5271SSimon Glass   <DIR>       4096 proc
6397bea5271SSimon Glass   <DIR>       4096 root
6407bea5271SSimon Glass   <DIR>       4096 run
6417bea5271SSimon Glass   <DIR>      12288 sbin
6427bea5271SSimon Glass   <DIR>       4096 srv
6437bea5271SSimon Glass   <DIR>       4096 sys
6447bea5271SSimon Glass   <DIR>       4096 tmp
6457bea5271SSimon Glass   <DIR>       4096 usr
6467bea5271SSimon Glass   <DIR>       4096 var
6477bea5271SSimon Glass   <SYM>         33 initrd.img
6487bea5271SSimon Glass   <SYM>         30 vmlinuz
6497bea5271SSimon Glass   <DIR>       4096 cdrom
6507bea5271SSimon Glass   <SYM>         33 initrd.img.old
6517bea5271SSimon Glass   =>
6527bea5271SSimon Glass
6537bea5271SSimon Glassand if you look in the /boot directory you will see the kernel:
6547bea5271SSimon Glass
6557bea5271SSimon Glass   => ext2ls scsi 0:2 /boot
6567bea5271SSimon Glass   <DIR>       4096 .
6577bea5271SSimon Glass   <DIR>       4096 ..
6587bea5271SSimon Glass   <DIR>       4096 efi
6597bea5271SSimon Glass   <DIR>       4096 grub
6607bea5271SSimon Glass            3381262 System.map-3.13.0-32-generic
6617bea5271SSimon Glass            1162712 abi-3.13.0-32-generic
6627bea5271SSimon Glass             165611 config-3.13.0-32-generic
6637bea5271SSimon Glass             176500 memtest86+.bin
6647bea5271SSimon Glass             178176 memtest86+.elf
6657bea5271SSimon Glass             178680 memtest86+_multiboot.bin
6667bea5271SSimon Glass            5798112 vmlinuz-3.13.0-32-generic
6677bea5271SSimon Glass             165762 config-3.13.0-58-generic
6687bea5271SSimon Glass            1165129 abi-3.13.0-58-generic
6697bea5271SSimon Glass            5823136 vmlinuz-3.13.0-58-generic
6707bea5271SSimon Glass           19215259 initrd.img-3.13.0-58-generic
6717bea5271SSimon Glass            3391763 System.map-3.13.0-58-generic
6727bea5271SSimon Glass            5825048 vmlinuz-3.13.0-58-generic.efi.signed
6737bea5271SSimon Glass           28304443 initrd.img-3.13.0-32-generic
6747bea5271SSimon Glass   =>
6757bea5271SSimon Glass
6767bea5271SSimon GlassThe 'vmlinuz' files contain a packaged Linux kernel. The format is a kind of
6777bea5271SSimon Glassself-extracting compressed file mixed with some 'setup' configuration data.
6787bea5271SSimon GlassDespite its size (uncompressed it is >10MB) this only includes a basic set of
6797bea5271SSimon Glassdevice drivers, enough to boot on most hardware types.
6807bea5271SSimon Glass
6817bea5271SSimon GlassThe 'initrd' files contain a RAM disk. This is something that can be loaded
6827bea5271SSimon Glassinto RAM and will appear to Linux like a disk. Ubuntu uses this to hold lots
6837bea5271SSimon Glassof drivers for whatever hardware you might have. It is loaded before the
6847bea5271SSimon Glassreal root disk is accessed.
6857bea5271SSimon Glass
6867bea5271SSimon GlassThe numbers after the end of each file are the version. Here it is Linux
6877bea5271SSimon Glassversion 3.13. You can find the source code for this in the Linux tree with
6887bea5271SSimon Glassthe tag v3.13. The '.0' allows for additional Linux releases to fix problems,
6897bea5271SSimon Glassbut normally this is not needed. The '-58' is used by Ubuntu. Each time they
6907bea5271SSimon Glassrelease a new kernel they increment this number. New Ubuntu versions might
6917bea5271SSimon Glassinclude kernel patches to fix reported bugs. Stable kernels can exist for
6927bea5271SSimon Glasssome years so this number can get quite high.
6937bea5271SSimon Glass
6947bea5271SSimon GlassThe '.efi.signed' kernel is signed for EFI's secure boot. U-Boot has its own
6957bea5271SSimon Glasssecure boot mechanism - see [12] [13] and cannot read .efi files at present.
6967bea5271SSimon Glass
6977bea5271SSimon GlassTo boot Ubuntu from U-Boot the steps are as follows:
6987bea5271SSimon Glass
6997bea5271SSimon Glass1. Set up the boot arguments. Use the GUID for the partition you want to
7007bea5271SSimon Glassboot:
7017bea5271SSimon Glass
7027bea5271SSimon Glass   => setenv bootargs root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro
7037bea5271SSimon Glass
7047bea5271SSimon GlassHere root= tells Linux the location of its root disk. The disk is specified
7057bea5271SSimon Glassby its GUID, using '/dev/disk/by-partuuid/', a Linux path to a 'directory'
7067bea5271SSimon Glasscontaining all the GUIDs Linux has found. When it starts up, there will be a
7077bea5271SSimon Glassfile in that directory with this name in it. It is also possible to use a
7087bea5271SSimon Glassdevice name here, see later.
7097bea5271SSimon Glass
7107bea5271SSimon Glass2. Load the kernel. Since it is an ext2/4 filesystem we can do:
7117bea5271SSimon Glass
7127bea5271SSimon Glass   => ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic
7137bea5271SSimon Glass
7147bea5271SSimon GlassThe address 30000000 is arbitrary, but there seem to be problems with using
7157bea5271SSimon Glasssmall addresses (sometimes Linux cannot find the ramdisk). This is 48MB into
7167bea5271SSimon Glassthe start of RAM (which is at 0 on x86).
7177bea5271SSimon Glass
7187bea5271SSimon Glass3. Load the ramdisk (to 64MB):
7197bea5271SSimon Glass
7207bea5271SSimon Glass   => ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic
7217bea5271SSimon Glass
7227bea5271SSimon Glass4. Start up the kernel. We need to know the size of the ramdisk, but can use
7237bea5271SSimon Glassa variable for that. U-Boot sets 'filesize' to the size of the last file it
7247bea5271SSimon Glassloaded.
7257bea5271SSimon Glass
7267bea5271SSimon Glass   => zboot 03000000 0 04000000 ${filesize}
7277bea5271SSimon Glass
7287bea5271SSimon GlassType 'help zboot' if you want to see what the arguments are. U-Boot on x86 is
7297bea5271SSimon Glassquite verbose when it boots a kernel. You should see these messages from
7307bea5271SSimon GlassU-Boot:
7317bea5271SSimon Glass
7327bea5271SSimon Glass   Valid Boot Flag
7337bea5271SSimon Glass   Setup Size = 0x00004400
7347bea5271SSimon Glass   Magic signature found
7357bea5271SSimon Glass   Using boot protocol version 2.0c
7367bea5271SSimon Glass   Linux kernel version 3.13.0-58-generic (buildd@allspice) #97-Ubuntu SMP Wed Jul 8 02:56:15 UTC 2015
7377bea5271SSimon Glass   Building boot_params at 0x00090000
7387bea5271SSimon Glass   Loading bzImage at address 100000 (5805728 bytes)
7397bea5271SSimon Glass   Magic signature found
7407bea5271SSimon Glass   Initial RAM disk at linear address 0x04000000, size 19215259 bytes
741eda995a8SBin Meng   Kernel command line: "root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro"
7427bea5271SSimon Glass
7437bea5271SSimon Glass   Starting kernel ...
7447bea5271SSimon Glass
7457bea5271SSimon GlassU-Boot prints out some bootstage timing. This is more useful if you put the
7467bea5271SSimon Glassabove commands into a script since then it will be faster.
7477bea5271SSimon Glass
7487bea5271SSimon Glass   Timer summary in microseconds:
7497bea5271SSimon Glass          Mark    Elapsed  Stage
7507bea5271SSimon Glass             0          0  reset
7517bea5271SSimon Glass       241,535    241,535  board_init_r
7527bea5271SSimon Glass     2,421,611  2,180,076  id=64
7537bea5271SSimon Glass     2,421,790        179  id=65
7547bea5271SSimon Glass     2,428,215      6,425  main_loop
7557bea5271SSimon Glass    48,860,584 46,432,369  start_kernel
7567bea5271SSimon Glass
7577bea5271SSimon Glass   Accumulated time:
7587bea5271SSimon Glass                  240,329  ahci
7597bea5271SSimon Glass                1,422,704  vesa display
7607bea5271SSimon Glass
761eda995a8SBin MengNow the kernel actually starts: (if you want to examine kernel boot up message
762eda995a8SBin Mengon the serial console, append "console=ttyS0,115200" to the kernel command line)
7637bea5271SSimon Glass
7647bea5271SSimon Glass   [    0.000000] Initializing cgroup subsys cpuset
7657bea5271SSimon Glass   [    0.000000] Initializing cgroup subsys cpu
7667bea5271SSimon Glass   [    0.000000] Initializing cgroup subsys cpuacct
7677bea5271SSimon Glass   [    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)
768eda995a8SBin Meng   [    0.000000] Command line: root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro console=ttyS0,115200
7697bea5271SSimon Glass
7707bea5271SSimon GlassIt continues for a long time. Along the way you will see it pick up your
7717bea5271SSimon Glassramdisk:
7727bea5271SSimon Glass
7737bea5271SSimon Glass   [    0.000000] RAMDISK: [mem 0x04000000-0x05253fff]
7747bea5271SSimon Glass...
7757bea5271SSimon Glass   [    0.788540] Trying to unpack rootfs image as initramfs...
7767bea5271SSimon Glass   [    1.540111] Freeing initrd memory: 18768K (ffff880004000000 - ffff880005254000)
7777bea5271SSimon Glass...
7787bea5271SSimon Glass
7797bea5271SSimon GlassLater it actually starts using it:
7807bea5271SSimon Glass
7817bea5271SSimon Glass   Begin: Running /scripts/local-premount ... done.
7827bea5271SSimon Glass
7837bea5271SSimon GlassYou should also see your boot disk turn up:
7847bea5271SSimon Glass
7857bea5271SSimon Glass   [    4.357243] scsi 1:0:0:0: Direct-Access     ATA      ADATA SP310      5.2  PQ: 0 ANSI: 5
7867bea5271SSimon Glass   [    4.366860] sd 1:0:0:0: [sda] 62533296 512-byte logical blocks: (32.0 GB/29.8 GiB)
7877bea5271SSimon Glass   [    4.375677] sd 1:0:0:0: Attached scsi generic sg0 type 0
7887bea5271SSimon Glass   [    4.381859] sd 1:0:0:0: [sda] Write Protect is off
7897bea5271SSimon Glass   [    4.387452] sd 1:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
7907bea5271SSimon Glass   [    4.399535]  sda: sda1 sda2 sda3
7917bea5271SSimon Glass
7927bea5271SSimon GlassLinux has found the three partitions (sda1-3). Mercifully it doesn't print out
7937bea5271SSimon Glassthe GUIDs. In step 1 above we could have used:
7947bea5271SSimon Glass
7957bea5271SSimon Glass   setenv bootargs root=/dev/sda2 ro
7967bea5271SSimon Glass
7977bea5271SSimon Glassinstead of the GUID. However if you add another drive to your board the
7987bea5271SSimon Glassnumbering may change whereas the GUIDs will not. So if your boot partition
7997bea5271SSimon Glassbecomes sdb2, it will still boot. For embedded systems where you just want to
8007bea5271SSimon Glassboot the first disk, you have that option.
8017bea5271SSimon Glass
8027bea5271SSimon GlassThe last thing you will see on the console is mention of plymouth (which
8037bea5271SSimon Glassdisplays the Ubuntu start-up screen) and a lot of 'Starting' messages:
8047bea5271SSimon Glass
8057bea5271SSimon Glass * Starting Mount filesystems on boot                                    [ OK ]
8067bea5271SSimon Glass
8077bea5271SSimon GlassAfter a pause you should see a login screen on your display and you are done.
8087bea5271SSimon Glass
8097bea5271SSimon GlassIf you want to put this in a script you can use something like this:
8107bea5271SSimon Glass
8117bea5271SSimon Glass   setenv bootargs root=UUID=b2aaf743-0418-4d90-94cc-3e6108d7d968 ro
8127bea5271SSimon Glass   setenv boot zboot 03000000 0 04000000 \${filesize}
8137bea5271SSimon Glass   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"
8147bea5271SSimon Glass   saveenv
8157bea5271SSimon Glass
8167bea5271SSimon GlassThe \ is to tell the shell not to evaluate ${filesize} as part of the setenv
8177bea5271SSimon Glasscommand.
8187bea5271SSimon Glass
8197bea5271SSimon GlassYou can also bake this behaviour into your build by hard-coding the
8207bea5271SSimon Glassenvironment variables if you add this to minnowmax.h:
8217bea5271SSimon Glass
8227bea5271SSimon Glass#undef CONFIG_BOOTCOMMAND
8237bea5271SSimon Glass#define CONFIG_BOOTCOMMAND	\
8247bea5271SSimon Glass	"ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic; " \
8257bea5271SSimon Glass	"ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic; " \
8267bea5271SSimon Glass	"run boot"
8277bea5271SSimon Glass
8287bea5271SSimon Glass#undef CONFIG_EXTRA_ENV_SETTINGS
8297bea5271SSimon Glass#define CONFIG_EXTRA_ENV_SETTINGS "boot=zboot 03000000 0 04000000 ${filesize}"
8307bea5271SSimon Glass
8315abc1a45SSam Protsenkoand change CONFIG_BOOTARGS value in configs/minnowmax_defconfig to:
8325abc1a45SSam Protsenko
8335abc1a45SSam ProtsenkoCONFIG_BOOTARGS="root=/dev/sda2 ro"
8345abc1a45SSam Protsenko
8352e9ae222SBin MengTest with SeaBIOS
8362e9ae222SBin Meng-----------------
8372e9ae222SBin MengSeaBIOS [14] is an open source implementation of a 16-bit x86 BIOS. It can run
8382e9ae222SBin Mengin an emulator or natively on x86 hardware with the use of U-Boot. With its
8392e9ae222SBin Menghelp, we can boot some OSes that require 16-bit BIOS services like Windows/DOS.
8402e9ae222SBin Meng
8412e9ae222SBin MengAs U-Boot, we have to manually create a table where SeaBIOS gets various system
8422e9ae222SBin Menginformation (eg: E820) from. The table unfortunately has to follow the coreboot
8432e9ae222SBin Mengtable format as SeaBIOS currently supports booting as a coreboot payload.
8442e9ae222SBin Meng
8452e9ae222SBin MengTo support loading SeaBIOS, U-Boot should be built with CONFIG_SEABIOS on.
8462e9ae222SBin MengBooting SeaBIOS is done via U-Boot's bootelf command, like below:
8472e9ae222SBin Meng
8482e9ae222SBin Meng   => tftp bios.bin.elf;bootelf
8492e9ae222SBin Meng   Using e1000#0 device
8502e9ae222SBin Meng   TFTP from server 10.10.0.100; our IP address is 10.10.0.108
8512e9ae222SBin Meng   ...
8522e9ae222SBin Meng   Bytes transferred = 122124 (1dd0c hex)
8532e9ae222SBin Meng   ## Starting application at 0x000ff06e ...
8542e9ae222SBin Meng   SeaBIOS (version rel-1.9.0)
8552e9ae222SBin Meng   ...
8562e9ae222SBin Meng
8572e9ae222SBin Mengbios.bin.elf is the SeaBIOS image built from SeaBIOS source tree.
8582e9ae222SBin MengMake sure it is built as follows:
8592e9ae222SBin Meng
8602e9ae222SBin Meng   $ make menuconfig
8612e9ae222SBin Meng
8622e9ae222SBin MengInside the "General Features" menu, select "Build for coreboot" as the
8632e9ae222SBin Meng"Build Target". Inside the "Debugging" menu, turn on "Serial port debugging"
8642e9ae222SBin Mengso that we can see something as soon as SeaBIOS boots. Leave other options
8652e9ae222SBin Mengas in their default state. Then,
8662e9ae222SBin Meng
8672e9ae222SBin Meng   $ make
8682e9ae222SBin Meng   ...
8692e9ae222SBin Meng   Total size: 121888  Fixed: 66496  Free: 9184 (used 93.0% of 128KiB rom)
8702e9ae222SBin Meng   Creating out/bios.bin.elf
8712e9ae222SBin Meng
8722e9ae222SBin MengCurrently this is tested on QEMU x86 target with U-Boot chain-loading SeaBIOS
8732e9ae222SBin Mengto install/boot a Windows XP OS (below for example command to install Windows).
8742e9ae222SBin Meng
8752e9ae222SBin Meng   # Create a 10G disk.img as the virtual hard disk
8762e9ae222SBin Meng   $ qemu-img create -f qcow2 disk.img 10G
8772e9ae222SBin Meng
8782e9ae222SBin Meng   # Install a Windows XP OS from an ISO image 'winxp.iso'
8792e9ae222SBin Meng   $ qemu-system-i386 -serial stdio -bios u-boot.rom -hda disk.img -cdrom winxp.iso -smp 2 -m 512
8802e9ae222SBin Meng
8812e9ae222SBin Meng   # Boot a Windows XP OS installed on the virutal hard disk
8822e9ae222SBin Meng   $ qemu-system-i386 -serial stdio -bios u-boot.rom -hda disk.img -smp 2 -m 512
8832e9ae222SBin Meng
8842e9ae222SBin MengThis is also tested on Intel Crown Bay board with a PCIe graphics card, booting
8852e9ae222SBin MengSeaBIOS then chain-loading a GRUB on a USB drive, then Linux kernel finally.
8862e9ae222SBin Meng
8875a6a2c71SBin MengIf you are using Intel Integrated Graphics Device (IGD) as the primary display
8885a6a2c71SBin Mengdevice on your board, SeaBIOS needs to be patched manually to get its VGA ROM
8895a6a2c71SBin Mengloaded and run by SeaBIOS. SeaBIOS locates VGA ROM via the PCI expansion ROM
8905a6a2c71SBin Mengregister, but IGD device does not have its VGA ROM mapped by this register.
8915a6a2c71SBin MengIts VGA ROM is packaged as part of u-boot.rom at a configurable flash address
8925a6a2c71SBin Mengwhich is unknown to SeaBIOS. An example patch is needed for SeaBIOS below:
8935a6a2c71SBin Meng
8945a6a2c71SBin Mengdiff --git a/src/optionroms.c b/src/optionroms.c
8955a6a2c71SBin Mengindex 65f7fe0..c7b6f5e 100644
8965a6a2c71SBin Meng--- a/src/optionroms.c
8975a6a2c71SBin Meng+++ b/src/optionroms.c
8985a6a2c71SBin Meng@@ -324,6 +324,8 @@ init_pcirom(struct pci_device *pci, int isvga, u64 *sources)
8995a6a2c71SBin Meng         rom = deploy_romfile(file);
9005a6a2c71SBin Meng     else if (RunPCIroms > 1 || (RunPCIroms == 1 && isvga))
9015a6a2c71SBin Meng         rom = map_pcirom(pci);
9025a6a2c71SBin Meng+    if (pci->bdf == pci_to_bdf(0, 2, 0))
9035a6a2c71SBin Meng+        rom = (struct rom_header *)0xfff90000;
9045a6a2c71SBin Meng     if (! rom)
9055a6a2c71SBin Meng         // No ROM present.
9065a6a2c71SBin Meng         return;
9075a6a2c71SBin Meng
9085a6a2c71SBin MengNote: the patch above expects IGD device is at PCI b.d.f 0.2.0 and its VGA ROM
9095a6a2c71SBin Mengis at 0xfff90000 which corresponds to CONFIG_VGA_BIOS_ADDR on Minnowboard MAX.
9105a6a2c71SBin MengChange these two accordingly if this is not the case on your board.
9117bea5271SSimon Glass
91200bdd952SSimon GlassDevelopment Flow
91300bdd952SSimon Glass----------------
91400bdd952SSimon GlassThese notes are for those who want to port U-Boot to a new x86 platform.
91500bdd952SSimon Glass
91600bdd952SSimon GlassSince x86 CPUs boot from SPI flash, a SPI flash emulator is a good investment.
91700bdd952SSimon GlassThe Dediprog em100 can be used on Linux. The em100 tool is available here:
91800bdd952SSimon Glass
91900bdd952SSimon Glass   http://review.coreboot.org/p/em100.git
92000bdd952SSimon Glass
92100bdd952SSimon GlassOn Minnowboard Max the following command line can be used:
92200bdd952SSimon Glass
92300bdd952SSimon Glass   sudo em100 -s -p LOW -d u-boot.rom -c W25Q64DW -r
92400bdd952SSimon Glass
92500bdd952SSimon GlassA suitable clip for connecting over the SPI flash chip is here:
92600bdd952SSimon Glass
92700bdd952SSimon Glass   http://www.dediprog.com/pd/programmer-accessories/EM-TC-8
92800bdd952SSimon Glass
92900bdd952SSimon GlassThis allows you to override the SPI flash contents for development purposes.
93000bdd952SSimon GlassTypically you can write to the em100 in around 1200ms, considerably faster
93100bdd952SSimon Glassthan programming the real flash device each time. The only important
93200bdd952SSimon Glasslimitation of the em100 is that it only supports SPI bus speeds up to 20MHz.
93300bdd952SSimon GlassThis means that images must be set to boot with that speed. This is an
93400bdd952SSimon GlassIntel-specific feature - e.g. tools/ifttool has an option to set the SPI
93500bdd952SSimon Glassspeed in the SPI descriptor region.
93600bdd952SSimon Glass
93700bdd952SSimon GlassIf your chip/board uses an Intel Firmware Support Package (FSP) it is fairly
93800bdd952SSimon Glasseasy to fit it in. You can follow the Minnowboard Max implementation, for
93900bdd952SSimon Glassexample. Hopefully you will just need to create new files similar to those
94000bdd952SSimon Glassin arch/x86/cpu/baytrail which provide Bay Trail support.
94100bdd952SSimon Glass
94200bdd952SSimon GlassIf you are not using an FSP you have more freedom and more responsibility.
94300bdd952SSimon GlassThe ivybridge support works this way, although it still uses a ROM for
94400bdd952SSimon Glassgraphics and still has binary blobs containing Intel code. You should aim to
94500bdd952SSimon Glasssupport all important peripherals on your platform including video and storage.
94600bdd952SSimon GlassUse the device tree for configuration where possible.
94700bdd952SSimon Glass
94800bdd952SSimon GlassFor the microcode you can create a suitable device tree file using the
94900bdd952SSimon Glassmicrocode tool:
95000bdd952SSimon Glass
95103e3c316SSimon Glass  ./tools/microcode-tool -d microcode.dat -m <model> create
95200bdd952SSimon Glass
95300bdd952SSimon Glassor if you only have header files and not the full Intel microcode.dat database:
95400bdd952SSimon Glass
95500bdd952SSimon Glass  ./tools/microcode-tool -H BAY_TRAIL_FSP_KIT/Microcode/M0130673322.h \
95600bdd952SSimon Glass	-H BAY_TRAIL_FSP_KIT/Microcode/M0130679901.h \
95703e3c316SSimon Glass	-m all create
95800bdd952SSimon Glass
95900bdd952SSimon GlassThese are written to arch/x86/dts/microcode/ by default.
96000bdd952SSimon Glass
96100bdd952SSimon GlassNote that it is possible to just add the micrcode for your CPU if you know its
96200bdd952SSimon Glassmodel. U-Boot prints this information when it starts
96300bdd952SSimon Glass
96400bdd952SSimon Glass   CPU: x86_64, vendor Intel, device 30673h
96500bdd952SSimon Glass
96600bdd952SSimon Glassso here we can use the M0130673322 file.
96700bdd952SSimon Glass
96800bdd952SSimon GlassIf you platform can display POST codes on two little 7-segment displays on
96900bdd952SSimon Glassthe board, then you can use post_code() calls from C or assembler to monitor
97000bdd952SSimon Glassboot progress. This can be good for debugging.
97100bdd952SSimon Glass
97200bdd952SSimon GlassIf not, you can try to get serial working as early as possible. The early
973d521197dSStefan Roesedebug serial port may be useful here. See setup_internal_uart() for an example.
97400bdd952SSimon Glass
97512c7510fSBin MengDuring the U-Boot porting, one of the important steps is to write correct PIRQ
97612c7510fSBin Mengrouting information in the board device tree. Without it, device drivers in the
97712c7510fSBin MengLinux kernel won't function correctly due to interrupt is not working. Please
9782e9ae222SBin Mengrefer to U-Boot doc [15] for the device tree bindings of Intel interrupt router.
97912c7510fSBin MengHere we have more details on the intel,pirq-routing property below.
98012c7510fSBin Meng
98112c7510fSBin Meng	intel,pirq-routing = <
98212c7510fSBin Meng		PCI_BDF(0, 2, 0) INTA PIRQA
98312c7510fSBin Meng		...
98412c7510fSBin Meng	>;
98512c7510fSBin Meng
98612c7510fSBin MengAs you see each entry has 3 cells. For the first one, we need describe all pci
98712c7510fSBin Mengdevices mounted on the board. For SoC devices, normally there is a chapter on
98812c7510fSBin Mengthe chipset datasheet which lists all the available PCI devices. For example on
98912c7510fSBin MengBay Trail, this is chapter 4.3 (PCI configuration space). For the second one, we
99012c7510fSBin Mengcan get the interrupt pin either from datasheet or hardware via U-Boot shell.
99112c7510fSBin MengThe reliable source is the hardware as sometimes chipset datasheet is not 100%
99212c7510fSBin Mengup-to-date. Type 'pci header' plus the device's pci bus/device/function number
99312c7510fSBin Mengfrom U-Boot shell below.
99412c7510fSBin Meng
99512c7510fSBin Meng  => pci header 0.1e.1
99612c7510fSBin Meng    vendor ID =			0x8086
99712c7510fSBin Meng    device ID =			0x0f08
99812c7510fSBin Meng    ...
99912c7510fSBin Meng    interrupt line =		0x09
100012c7510fSBin Meng    interrupt pin =		0x04
100112c7510fSBin Meng    ...
100212c7510fSBin Meng
100312c7510fSBin MengIt shows this PCI device is using INTD pin as it reports 4 in the interrupt pin
100412c7510fSBin Mengregister. Repeat this until you get interrupt pins for all the devices. The last
100512c7510fSBin Mengcell is the PIRQ line which a particular interrupt pin is mapped to. On Intel
100612c7510fSBin Mengchipset, the power-up default mapping is INTA/B/C/D maps to PIRQA/B/C/D. This
100712c7510fSBin Mengcan be changed by registers in LPC bridge. So far Intel FSP does not touch those
100812c7510fSBin Mengregisters so we can write down the PIRQ according to the default mapping rule.
100912c7510fSBin Meng
101012c7510fSBin MengOnce we get the PIRQ routing information in the device tree, the interrupt
101112c7510fSBin Mengallocation and assignment will be done by U-Boot automatically. Now you can
101212c7510fSBin Mengenable CONFIG_GENERATE_PIRQ_TABLE for testing Linux kernel using i8259 PIC and
101312c7510fSBin MengCONFIG_GENERATE_MP_TABLE for testing Linux kernel using local APIC and I/O APIC.
101412c7510fSBin Meng
1015590870e7SSimon GlassThis script might be useful. If you feed it the output of 'pci long' from
1016590870e7SSimon GlassU-Boot then it will generate a device tree fragment with the interrupt
1017590870e7SSimon Glassconfiguration for each device (note it needs gawk 4.0.0):
1018590870e7SSimon Glass
1019590870e7SSimon Glass   $ cat console_output |awk '/PCI/ {device=$4} /interrupt line/ {line=$4} \
1020590870e7SSimon Glass	/interrupt pin/ {pin = $4; if (pin != "0x00" && pin != "0xff") \
1021590870e7SSimon Glass	{patsplit(device, bdf, "[0-9a-f]+"); \
1022590870e7SSimon Glass	printf "PCI_BDF(%d, %d, %d) INT%c PIRQ%c\n", strtonum("0x" bdf[1]), \
1023590870e7SSimon Glass	strtonum("0x" bdf[2]), bdf[3], strtonum(pin) + 64, 64 + strtonum(pin)}}'
1024590870e7SSimon Glass
1025590870e7SSimon GlassExample output:
1026590870e7SSimon Glass   PCI_BDF(0, 2, 0) INTA PIRQA
1027590870e7SSimon Glass   PCI_BDF(0, 3, 0) INTA PIRQA
1028590870e7SSimon Glass...
1029590870e7SSimon Glass
1030448719c5SBin MengPorting Hints
1031448719c5SBin Meng-------------
1032448719c5SBin Meng
1033448719c5SBin MengQuark-specific considerations:
1034448719c5SBin Meng
1035448719c5SBin MengTo port U-Boot to other boards based on the Intel Quark SoC, a few things need
1036448719c5SBin Mengto be taken care of. The first important part is the Memory Reference Code (MRC)
1037448719c5SBin Mengparameters. Quark MRC supports memory-down configuration only. All these MRC
1038448719c5SBin Mengparameters are supplied via the board device tree. To get started, first copy
1039448719c5SBin Mengthe MRC section of arch/x86/dts/galileo.dts to your board's device tree, then
1040448719c5SBin Mengchange these values by consulting board manuals or your hardware vendor.
1041448719c5SBin MengAvailable MRC parameter values are listed in include/dt-bindings/mrc/quark.h.
1042448719c5SBin MengThe other tricky part is with PCIe. Quark SoC integrates two PCIe root ports,
1043448719c5SBin Mengbut by default they are held in reset after power on. In U-Boot, PCIe
1044448719c5SBin Menginitialization is properly handled as per Quark's firmware writer guide.
1045448719c5SBin MengIn your board support codes, you need provide two routines to aid PCIe
1046448719c5SBin Menginitialization, which are board_assert_perst() and board_deassert_perst().
1047448719c5SBin MengThe two routines need implement a board-specific mechanism to assert/deassert
1048448719c5SBin MengPCIe PERST# pin. Care must be taken that in those routines that any APIs that
1049448719c5SBin Mengmay trigger PCI enumeration process are strictly forbidden, as any access to
1050448719c5SBin MengPCIe root port's configuration registers will cause system hang while it is
1051448719c5SBin Mengheld in reset. For more details, check how they are implemented by the Intel
1052448719c5SBin MengGalileo board support codes in board/intel/galileo/galileo.c.
1053448719c5SBin Meng
1054e28fcb22SSimon Glasscoreboot:
1055e28fcb22SSimon Glass
1056e28fcb22SSimon GlassSee scripts/coreboot.sed which can assist with porting coreboot code into
1057e28fcb22SSimon GlassU-Boot drivers. It will not resolve all build errors, but will perform common
1058e28fcb22SSimon Glasstransformations. Remember to add attribution to coreboot for new files added
1059e28fcb22SSimon Glassto U-Boot. This should go at the top of each file and list the coreboot
1060e28fcb22SSimon Glassfilename where the code originated.
1061e28fcb22SSimon Glass
1062efd4be4cSBin MengDebugging ACPI issues with Windows:
1063efd4be4cSBin Meng
1064efd4be4cSBin MengWindows might cache system information and only detect ACPI changes if you
1065efd4be4cSBin Mengmodify the ACPI table versions. So tweak them liberally when debugging ACPI
1066efd4be4cSBin Mengissues with Windows.
1067efd4be4cSBin Meng
106849d929bbSBin MengACPI Support Status
106949d929bbSBin Meng-------------------
107049d929bbSBin MengAdvanced Configuration and Power Interface (ACPI) [16] aims to establish
107149d929bbSBin Mengindustry-standard interfaces enabling OS-directed configuration, power
107249d929bbSBin Mengmanagement, and thermal management of mobile, desktop, and server platforms.
107349d929bbSBin Meng
107449d929bbSBin MengLinux can boot without ACPI with "acpi=off" command line parameter, but
107549d929bbSBin Mengwith ACPI the kernel gains the capabilities to handle power management.
107649d929bbSBin MengFor Windows, ACPI is a must-have firmware feature since Windows Vista.
107749d929bbSBin MengCONFIG_GENERATE_ACPI_TABLE is the config option to turn on ACPI support in
107849d929bbSBin MengU-Boot. This requires Intel ACPI compiler to be installed on your host to
107949d929bbSBin Mengcompile ACPI DSDT table written in ASL format to AML format. You can get
108049d929bbSBin Mengthe compiler via "apt-get install iasl" if you are on Ubuntu or download
108149d929bbSBin Mengthe source from [17] to compile one by yourself.
108249d929bbSBin Meng
108313c9d848SBin MengCurrent ACPI support in U-Boot is basically complete. More optional features
108413c9d848SBin Mengcan be added in the future. The status as of today is:
108549d929bbSBin Meng
108649d929bbSBin Meng * Support generating RSDT, XSDT, FACS, FADT, MADT, MCFG tables.
108749d929bbSBin Meng * Support one static DSDT table only, compiled by Intel ACPI compiler.
108813c9d848SBin Meng * Support S0/S3/S4/S5, reboot and shutdown from OS.
108949d929bbSBin Meng * Support booting a pre-installed Ubuntu distribution via 'zboot' command.
1090206a3a42SBin Meng * Support installing and booting Ubuntu 14.04 (or above) from U-Boot with
1091206a3a42SBin Meng   the help of SeaBIOS using legacy interface (non-UEFI mode).
1092206a3a42SBin Meng * Support installing and booting Windows 8.1/10 from U-Boot with the help
1093206a3a42SBin Meng   of SeaBIOS using legacy interface (non-UEFI mode).
109449d929bbSBin Meng * Support ACPI interrupts with SCI only.
109549d929bbSBin Meng
109649d929bbSBin MengFeatures that are optional:
109749d929bbSBin Meng * Dynamic AML bytecodes insertion at run-time. We may need this to support
109849d929bbSBin Meng   SSDT table generation and DSDT fix up.
109949d929bbSBin Meng * SMI support. Since U-Boot is a modern bootloader, we don't want to bring
110049d929bbSBin Meng   those legacy stuff into U-Boot. ACPI spec allows a system that does not
110149d929bbSBin Meng   support SMI (a legacy-free system).
110249d929bbSBin Meng
1103e6ddb6b0SBin MengACPI was initially enabled on BayTrail based boards. Testing was done by booting
1104206a3a42SBin Menga pre-installed Ubuntu 14.04 from a SATA drive. Installing Ubuntu 14.04 and
1105206a3a42SBin MengWindows 8.1/10 to a SATA drive and booting from there is also tested. Most
1106206a3a42SBin Mengdevices seem to work correctly and the board can respond a reboot/shutdown
1107206a3a42SBin Mengcommand from the OS.
1108e28fcb22SSimon Glass
1109e6ddb6b0SBin MengFor other platform boards, ACPI support status can be checked by examining their
1110e6ddb6b0SBin Mengboard defconfig files to see if CONFIG_GENERATE_ACPI_TABLE is set to y.
1111e6ddb6b0SBin Meng
111213c9d848SBin MengThe S3 sleeping state is a low wake latency sleeping state defined by ACPI
111313c9d848SBin Mengspec where all system context is lost except system memory. To test S3 resume
111413c9d848SBin Mengwith a Linux kernel, simply run "echo mem > /sys/power/state" and kernel will
111513c9d848SBin Mengput the board to S3 state where the power is off. So when the power button is
111613c9d848SBin Mengpressed again, U-Boot runs as it does in cold boot and detects the sleeping
111713c9d848SBin Mengstate via ACPI register to see if it is S3, if yes it means we are waking up.
111813c9d848SBin MengU-Boot is responsible for restoring the machine state as it is before sleep.
111913c9d848SBin MengWhen everything is done, U-Boot finds out the wakeup vector provided by OSes
112013c9d848SBin Mengand jump there. To determine whether ACPI S3 resume is supported, check to
112113c9d848SBin Mengsee if CONFIG_HAVE_ACPI_RESUME is set for that specific board.
112213c9d848SBin Meng
112313c9d848SBin MengNote for testing S3 resume with Windows, correct graphics driver must be
112413c9d848SBin Menginstalled for your platform, otherwise you won't find "Sleep" option in
112513c9d848SBin Mengthe "Power" submenu from the Windows start menu.
112613c9d848SBin Meng
1127007adbc2SSimon GlassEFI Support
1128007adbc2SSimon Glass-----------
1129007adbc2SSimon GlassU-Boot supports booting as a 32-bit or 64-bit EFI payload, e.g. with UEFI.
11309efeb3f4SBin MengThis is enabled with CONFIG_EFI_STUB to boot from both 32-bit and 64-bit
11319efeb3f4SBin MengUEFI BIOS. U-Boot can also run as an EFI application, with CONFIG_EFI_APP.
113273149164SBin MengThe CONFIG_EFI_LOADER option, where U-Boot provides an EFI environment to
11339efeb3f4SBin Mengthe kernel (i.e. replaces UEFI completely but provides the same EFI run-time
113473149164SBin Mengservices) is supported too. For example, we can even use 'bootefi' command
113573149164SBin Mengto load a 'u-boot-payload.efi', see below test logs on QEMU.
113673149164SBin Meng
113773149164SBin Meng  => load ide 0 3000000 u-boot-payload.efi
113873149164SBin Meng  489787 bytes read in 138 ms (3.4 MiB/s)
113973149164SBin Meng  => bootefi 3000000
114073149164SBin Meng  Scanning disk ide.blk#0...
114173149164SBin Meng  Found 2 disks
114273149164SBin Meng  WARNING: booting without device tree
114373149164SBin Meng  ## Starting EFI application at 03000000 ...
114473149164SBin Meng  U-Boot EFI Payload
114573149164SBin Meng
114673149164SBin Meng
114773149164SBin Meng  U-Boot 2018.07-rc2 (Jun 23 2018 - 17:12:58 +0800)
114873149164SBin Meng
114973149164SBin Meng  CPU: x86_64, vendor AMD, device 663h
115073149164SBin Meng  DRAM:  2 GiB
115173149164SBin Meng  MMC:
115273149164SBin Meng  Video: 1024x768x32
115373149164SBin Meng  Model: EFI x86 Payload
115473149164SBin Meng  Net:   e1000: 52:54:00:12:34:56
115573149164SBin Meng
115673149164SBin Meng  Warning: e1000#0 using MAC address from ROM
115773149164SBin Meng  eth0: e1000#0
115873149164SBin Meng  No controllers found
115973149164SBin Meng  Hit any key to stop autoboot:  0
1160007adbc2SSimon Glass
11619efeb3f4SBin MengSee README.u-boot_on_efi and README.uefi for details of EFI support in U-Boot.
1162007adbc2SSimon Glass
11635dad97edSBin MengTODO List
11645dad97edSBin Meng---------
11655dad97edSBin Meng- Audio
11665dad97edSBin Meng- Chrome OS verified boot
11675dad97edSBin Meng
11685dad97edSBin MengReferences
11695dad97edSBin Meng----------
11705dad97edSBin Meng[1] http://www.coreboot.org
11711ae5b78cSBin Meng[2] http://www.qemu.org
11721ae5b78cSBin Meng[3] http://www.coreboot.org/~stepan/pci8086,0166.rom
11731ae5b78cSBin Meng[4] http://www.intel.com/content/www/us/en/embedded/design-tools/evaluation-platforms/atom-e660-eg20t-development-kit.html
11741ae5b78cSBin Meng[5] http://www.intel.com/fsp
11757aaff9bfSBin Meng[6] http://www.intel.com/content/www/us/en/secure/intelligent-systems/privileged/e6xx-35-b1-cmc22211.html
11767aaff9bfSBin Meng[7] http://www.ami.com/products/bios-uefi-tools-and-utilities/bios-uefi-utilities/
11777aaff9bfSBin Meng[8] http://en.wikipedia.org/wiki/Microcode
11787aaff9bfSBin Meng[9] http://simplefirmware.org
11797aaff9bfSBin Meng[10] http://www.intel.com/design/archives/processors/pro/docs/242016.htm
11807bea5271SSimon Glass[11] https://en.wikipedia.org/wiki/GUID_Partition_Table
11817bea5271SSimon Glass[12] http://events.linuxfoundation.org/sites/events/files/slides/chromeos_and_diy_vboot_0.pdf
11827bea5271SSimon Glass[13] http://events.linuxfoundation.org/sites/events/files/slides/elce-2014.pdf
11832e9ae222SBin Meng[14] http://www.seabios.org/SeaBIOS
11842e9ae222SBin Meng[15] doc/device-tree-bindings/misc/intel,irq-router.txt
118549d929bbSBin Meng[16] http://www.acpi.info
118649d929bbSBin Meng[17] https://www.acpica.org/downloads
1187