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