You are here: DENX Home »  U-Boot » WebPreferences » Documentation » Patches » Contacts » Custodians » X86

U-Boot on x86 (Updated 15-May-15)

U-Boot supports running as a Coreboot payload on x86. So far only link (Chromebook pixel), Minnowboard, qmemu, broadwell CRB and a few others have 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, GPIO, CPU, PCI and SPI.

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, tunnel creek (Atom), Baytrail (Minnowboard Max), Galileo and qemu are supported.

Finally you can run U-Boot on EFI as either an application (which uses EFI services and allows return to EFI) or a payload (where U-Boot takes over the machine and boot from there).

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 $ 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 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.
Copyright © 2002-2022 by DENX Software Engineering GmbH ImprintTerms & ConditionsPrivacyFeedback
This website is using cookies. More info. That's Fine