Linux on Lenovo Ideapad 3 Chromebook "Lick" (Gemini Lake)

"Problem": I've bought my first chromebook because I've finally found one at a fair price (< 150 €). It seems to be a worthy substitute to my previous netbook - an Acer ES1-111M, with only 2 USB ports and famously poor touchpad & case (but on the flip side, ethernet and removable DDR3L memory, as well as the ability to add a SATA drive if you're good at Tiny Soldering); by the way, despite being 1 year old, it was mostly new with barely 8 charge cycles and very good external condition!

Problem: Reputable sources, or in fact just the one that's left, are not interested in writing an unlocked firmware for it

Problem: The official way doesn't even work!

Recommended reading

  1. "Upstream coreboot on Intel Haswell Chromebook" - not really relevant (in fact, misleading for this chipset) but still a decent overview
  2. Coreboot Build Howto - same
  3. Building for Apollo Lake - a lot more relevant
  4. "ApolloLake/GeminiLake Status?" - THIS is where the important knowledge is, yet it took me a few weeks to find it! Embarrassing!

The making of

So, let's start by making a "Full EFI" firmware. First we need to enable developer mode (Esc+[F3=Refresh]+Power, Ctrl+D), then open a shell (for example, Ctrl+Alt+[F2=Next], "root") and get both the current firmware for backup purposes and the official image to use as a base:

cd /media/external/Acodin flashrom -r originalbios1.bin flashrom -r originalbios2.bin flashrom -r originalbios3.bin /usr/sbin/chromeos-firmwareupdate --sb_extract /tmp/dump cp /tmp/dump/images/*lick* .

(In this example, Acodin is the label of my microSD, of course)

Then, on a real PC running Devuan Chimaera:

sudo apt install git build-essential gnat flex bison libncurses5-dev zlib1g-dev acpica-tools autoconf uuid-dev nasm python3-distutils python-is-python3 git clone https://review.coreboot.org/coreboot cd coreboot git submodule update --init --checkout cd util/cbfstool && make && sudo make install cd ../.. mkdir -p 3rdparty/blobs/soc/intel/glk/nhlt-blobs mkdir -p 3rdparty/blobs/mainboard/google/octopus/lick

Not all of the above installed programs are actually required - the procedure written on this page was tried from scratch except for the package installation, which I reconstructed only by reading the .bash_history; still better, of course, than trial and error with configure/make with programs that don't tell you all the dependencies in advance, right?

Next, take the official "bios" file and extract the blobs from it:

cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin read -r IFWI -f ifwi.bin cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n fspm.bin -f fspm.bin cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n fsps.bin -f fsps.bin cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n vbt.bin -f vbt.bin cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n dmic-2ch-48khz-16b.bin -f dmic-2ch-48khz-16b.bin cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n dmic-4ch-48khz-16b.bin -f dmic-4ch-48khz-16b.bin cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n max98357-render-2ch-48khz-24b.bin -f max98357-render-2ch-48khz-24b.bin cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n dialog-2ch-48khz-24b.bin -f dialog-2ch-48khz-24b.bin cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin read -r SI_DESC -f descriptor.bin cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n cpu_microcode_blob.bin -f cpu_microcode_blob.bin

Then move them in place:

And then you make menuconfig (or nconfig) and have fun with the options, notably (relatively to defaults):

Not so soon - you will need to waste some time building a compiler:

make crossgcc-i386

And finally:

make

Installation

The result will be at build/coreboot.rom, but after copying it to the laptop you will need to remember to unplug the battery and boot it only with the power brick (very interesting, after years of computers with stupid manufacturer provided flashing programs that try to ensure revenue by requiring an official charged battery) and write the command as flashrom vaguely told you while creating the backups: flashrom -p internal --ifd --image bios --noverify-all -w coreboot.rom

Limitations

Boot order does not save - you "must" make your bootloader/kernel/etc available at EFI/BOOT/bootx64.efi on the EFI partition (if you don't want to manually select it each time)

Sound doesn't appear to work in Linux 5.10 and 5.15 - it might by adapting the ChromeOS one

USB-C is untested apart from charging with the official power brick;

Keyboard works with the limitations of missing keys (installing the right packages from GalliumOS may improve this);

USB-A, touchpad (1 finger click and 2 finger scrolling by default), fold sensor, webcam, standby, emmc (including trim), wifi (with firmware) all seem fine :)

Uninstallation

The command is the same as the one used for installation, so flashrom -p internal --ifd --image bios --noverify-all -w originalbios1.rom, but make sure you're using a new enough version of flashrom (I built it from source) or it won't recognize the chipset!

(You will also need a Windows/Mac OS/ChromeOS computer to create an installation disk, at least with the official extension)

Download

Now that you hopefully have understood how I did all of this (if you didn't, there's probably a problem with this page!), you have earned the right to skip it in the future and download the one I made which is based on the above instructions and:

Coreboot 8b17cb8a8c, official firmware "bios-lick.ro-11297-159-0.rw-11297-159-0.bin", and… whatever version of Tianocore was downloaded by the makefile, I guess!