After noticing that /dev/fb0 didn't exist despite having loaded fbcon and a framebuffer device module, I figured it out:
- Build
i915as a loadable module instead of built-in and make sure that legacyfbdevsupport is enabled. (Building it as a loadable module is perhaps not necessary, I only did it to ensure I could blacklist/unloadi915, but the key is to select legacyfbdevsupport.) - Enable framebuffer console (
fbcon) and build it as a module. - Select a suitable framebuffer device and build its driver as a module. VESA (
uvesafb) works fine. - Ensure that tty is also enabled.
- Edit
/src/kernel/drivers/gpu/drm/i915/i915_drv.cand remove or comment out allifloops that refer to conflicting framebuffer modules (just search for "conflict", on 4.4.250-R89 kernel source there are 3 of these loops), otherwise you'dyou might encounter an error during make. Apparently thei915driver for ChromeOS doesn't want you to have a framebuffer console. - Build kernel and modules. Install to Linux.
- Add
fbconanduvesafb(or a framebuffer device of your choice) to/etc/initramfs-tools/modulesto load them at boot (they do not load by default). Alternatively, you can load themit manually when you need to use TTY emulation. - Update initramfs and grub. Reboot. You should be able to see kernel boot messages and use Ctrl+Fn to access TTYn.