U-Boot on x86 (Updated 15-Jan-15)
U-Boot supports running as a Coreboot payload on x86. So far only link (Chromebook pixel) has been tested, but it should
work with minimal adjustments on other x86 boards since Coreboot deals with most of the low-level details.
x86 has been converted to use driver model for serial and GPIO.
U-Boot also supports directly booting a 32-bit or 64-bit kernel, as part of a FIT image. It also supports a compressed zImage.
U-Boot also supports running 'raw' without Coreboot on x86. So far ivybridge and tunnel creek (Atom) are supported.
Full instructions are in the source tree at
doc/README.x86.
Background information on binary blobs
Unfortunately x86 machines still make use of several binary blobs to perform certain steps in firmware. These are:
- descriptor.bin - Intel flash descriptor
- mrc.bin - Memory Reference Code, which sets up SDRAM
- video ROM - sets up the display
- me.bin - Intel Management Engine - for modern higher-end Intel chips this is needed to make them work
There are also microcode updates but these are distributed as hex dumps and can be incorporated into the U-Boot source.
You need to obtain the above four blobs to be able to build U-Boot for chromebook_link.
How to make u-boot.rom with binary blobs
In the main U-Boot Makefile, you should uncomment the line which adds u-boot.rom to the build:
ALL-$(CONFIG_X86_RESET_VECTOR) += u-boot.rom
Put the binary blobs into board/google/chromebook_link.
Now you can build U-Boot and obtain u-boot.rom
- make chromebook_link_defconfig
- make all
How to get binary blocks from a download
$ git clone
http://review.coreboot.org/p/blobs.git
$ cd blobs
You will need these files:
- ./northbridge/intel/sandybridge/systemagent-ivybridge.bin
- ./mainboard/google/link/descriptor.bin
- ./mainboard/google/link/me.bin
The first one should be renamed to mrc.bin. You can get the video ROM from
here.
How to get binary blocks from a running x86 machine
These instructions are adapted from
this chromium.org page.
You will need a link machine (Chromebook Pixel) running in developer mode.
Type these commands:
-
chromeos-firmwareupdate --sb_extract /tmp
-
cp /tmp/bios.bin .
-
ifdtool -x bios.bin
This will give you 'flashregion_2_intel_me.bin' which you can rename 'me.bin' and 'flashregion_0_flashdescriptor.bin' which you can rename 'descriptor.bin'.
-
cbfstool bios.bin extract -n mrc.bin -f mrc.bin
-
cbfstool bios.bin extract -n pci8086,0406.rom -f pci8086,0a06.rom
Note the filename of the last ROM may vary. Put these three files into board/google/chromebook_link in U-Boot. Then edit include/configs/chromebook_link.h to point to the right video ROM:
#define CONFIG_X86_OPTION_ROM_FILENAME pci8086,0a06.rom
How to get the ROM into the machine
You can use 'flashrom -w' but this is not recommended since you will likely brick the device. The best idea is to use a SPI flash emulator such as Dediprog em100 and load the ROM image into that.
Chrome OS 'Servo' board
Servo provides access to the CPU UART and the SPI flash, among other things. This works on both x86 and ARM Chromebooks. It is possible to remotely reset the unit using Servo. Google has released the design for servo 2
here but I don't think it is available to buy.