Blobless Linux on Raspberry Pi (rpi-open-firmware).

14 Jan 2017 in research

While there was a brief hiatus in the development of the open firmware for Raspberry Pi, we can now boot Linux straight from bootcode.bin (note, this does require an initrd built in with zImage as there are still issues with eMMC working reliably at boot).

We are also currently investigating and getting closer to getting the following working:

  • USB PHY: Preliminary driver for USB PHY initialisation is ready but USB itself relies on the DMA engine working and we're still figuring that out.
  • Centralised power and clock management drivers in the firmware (already used for BCM2708PowerDomainARM and BCM2708PowerDomainImage)
  • eMMC (SDHOST) driver reliability (at the moment it seems to have 1 in 100 or so failure rate, requiring a reboot).
  • eMMC (SDHOST) teardown for the Linux kernel.

The current trunk of the rpi-open-firmware is able to boot a minimal Linux kernel image, you will need cmdline.txt, rpi.dtb (compiled device tree for your rPi model) and zImage on your boot partition (same place bootcode.bin resides). You're encouraged to build a minimal kernel and try it out (a good starting point is this .config file that you could use for your kernel build using the latest Linux kernel, which also includes correctly configured early printk stuff).

Few caveats:

  • You need to use the SDHOST driver and make sure it's in your device tree if you want any chance of eMMC being recognised at boot (not that relevant given the fact that initrd is currently almost required).
  • Because of memory map differences stock Linux will not currently boot on rPi1 models, anything above that (BCM2709 - rPi2 / BCM2710 - rPi3) should be fine however.
  • GPIOs work, eMMC (with SDHOST driver) kind of works, USB, DMA and video stuff do not work yet (as outlined above, we're working on bringing them up).

Here is a snippet of Linux booting up (you can find the full log including firmware logs here:

[LDR:LoaderImpl]: Jumping to the Linux kernel...
Uncompressing Linux... done, booting the kernel.
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.4.31-v7+ (alyssa@debian) (gcc version 6.2.1 20161124 (Debian 6.2.1-5) ) #81 Fri Jan 6 13:44:14 PST 2017
[    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c53c7d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine model: Raspberry Pi 2 Model B
/ # uname -a
Linux (none) 4.4.31-v7+ #81 Fri Jan 6 13:44:14 PST 2017 armv7l GNU/Linux

If you're interested in contributing or asking any questions, feel free to join #raspberrypi-internals on Freenode and checking out the project on GitHub.