Инструкция по сборке Coreboot для ThinkPad T60 с видеокартой ATI

Инструкция сборке Coreboot для ThinkPad T60 с видеокартой ATI

Для ноутбуков ThinkPad T60 с графикой от Intel, есть готовый файл прошивки от проекта Libreboot (Coreboot без проприетарных блобов), но в случае с T60 с ATI нужно ещё правильно добавить поддержку VGA BIOS из заводской прошивки, и для каждого ноутбука T60 нужно собирать свою Coreboot прошивку.

Эта инструкция описывает: как получить нужный бинарник для ATI графики из заводской BIOS прошивки и собрать Coreboot с его поддержкой.

В конце вы получите прошивку Coreboot на ваш T60, использующего VGA BIOS для ATI, SeaBIOS в качестве загрузчика, последний микрокод для процессора, отсутствие Intel ME и полное избавление от wifi whitelist и других ограничений.
(Но ваша система всё равно будет поддерживать только 3 Гб ОЗУ, это не лимит BIOS, а лимит чипсета)

    Что нужно:
  1. ThinkPad T60 с видеокартой ATI (X1300/X1400), заводским BIOS и GNU/Linux системой
  2. Программатор (например CH341A)
  3. Второй компьютер, которым будем шить BIOS чип, тоже желательно на GNU/Linux

Получение бинарника

Нам нужно получить PCI ID видеокарты и записать бинарник с VGA BIOS. Для этого нужно загрузиться в GNU/Linux систему на T60

Получение PCI ID

Введите команду:

sudo lspci -nn

Найдите в списке 'VGA compatible controller' и запишите PCI ID устройства. Пример вывода для ATI X1300:

VGA compatible controller [0300]: RV515/M52 [Mobility Radeon X1300] [1002:7149]

То есть [1002:7149] будет PCI ID вашей видеокарты. Эти числа нужно запомнить, они пригодятся для создания config файла.

Получение VGA BIOS

Получаем адрес где хранится VGA BIOS прошивка:

sudo cat /proc/iomem | grep 'Video ROM'

Теперь получим VGA BIOS при помощи команды dd. За место startaddr и lastaddr напишите вывод адреса из предыдущей команды:

sudo dd if=/dev/mem of=vgabios.rom bs=1c skip=$((0xstartaddr)) count=$((0xlastaddr-0xstartaddr+1))

Вы должны получить vgabios.rom размером примерно 64 КиБ.

Проверка полученного образа

Для проверки полученного VGA BIOS воспользуется утилитой romheaders из пакета fcode-utils (Для Arch fcode-utils скачивается из AUR).

romheaders vgabios.rom

Теперь сморим на вывод Vendor ID и Device ID. Они должны совпадать с PCI ID, которые мы получили ранее. Также в Class code должно быть написано VGA Display controller.

Если всё совпадает, то можете скопировать ваш vgabios.rom на компьютер, с которого вы будете перешивать ваш T60

Вот пример вывода:

Image 1:
PCI Expansion ROM Header:
Signature: 0x55aa (Ok)
CPU unique data: 0x80 0xe9 0xa9 0xe3 0x30 0x30 0x30 0x30
0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30
Pointer to PCI Data Structure: 0x0040

PCI Data Structure:
Signature: 0x50434952 'PCIR' (Ok)
Vendor ID: 0x8086
Device ID: 0x27a2
Vital Product Data: 0x0000
PCI Data Structure Length: 0x0018 (24 bytes)
PCI Data Structure Revision: 0x00
Class Code: 0x030000 (VGA Display controller)
Image Length: 0x0080 blocks (65536 bytes)
Revision Level of Code/Data: 0x0000
Code Type: 0x00 (Intel x86)
Last-Image Flag: 0x80 (last image in rom)
Reserved: 0x0000

Platform specific data for x86 compliant option rom:
Initialization Size: 0x80 (65536 bytes)
Entry point for INIT function: 0xe3af

Подготовка к сборке Coreboot

Сборка Coreboot должна выполняться на машине, с которой вы будете прошивать T60. В качестве примера воспользуемся официальной документацией

Устанавливаем необходимые пакеты (зависит от системы):

Ubuntu/Debian: sudo apt-get install -y bison build-essential curl flex git gnat libncurses5-dev m4 zlib1g-dev
Arch: sudo pacman -S base-devel curl git gcc-ada ncurses zlib
Fedora: sudo dnf install git make gcc-gnat flex bison xz bzip2 gcc g++ ncurses-devel wget zlib-devel

Загружаем исходный код Coreboot'а:

git clone https://review.coreboot.org/coreboot
cd coreboot

Собираем toolchain

Coreboot использует свой GCC и другие инструменты для сборки не зависящие от дистрибутива для избежания проблем. Для быстрой сборки воспользуемся параметром CPUS=$(nproc), иначе make запустится только с одним потоком.

make crossgcc-i386 CPUS=$(nproc)

Toolchain i386 используется для всех x86 и x86_64 платформ. Предупреждаю, процесс сборки будет долгим :)

Создание config файла

В файле конфигурации важно задать правильные настройки для VGA, иначе при загрузки вы получите черный экран.

Перед этим вам нужно скопировать ваш vgabios.rom в папку coreboot, чтобы он использовался при сборке.

Меню настройки сборки открывается командой:

make nconfig

[Внимание!] Если вы до этого собирали Coreboot для другой материнской платы (или для QEMU), то перед изменением конфига напишите make distclean. Если вы собираете Coreboot в первый раз (и только что скачали исходники), то это можно пропустить.

Переходим по вкладкам и отмечаем следующее (все остальные настройки оставляем по умолчанию):

* Mainboard
- Mainboard vendor (Lenovo) --->
- Mainboard model (ThinkPad T60 / T60p) --->
- ROM chip size (2048 KB (2 MB)) --->
- (0x200000) Size of CBFS filesystem in ROM

* Chipset
- Include CPU microcode in CBFS (Generate from tree) --->

* Devices
- Graphics initialization (Run VGA Option ROMs) --->
- [*] Re-run VGA Option ROMs on S3 resume
- [*] Load Option ROMs on PCI devices
- Option ROM execution type (Native mode) --->
- Display --->
+ [*] Set framebuffer graphics resolution
+ framebuffer graphics resolution (1024x768 64k-color (5:6:5)) --->
+ Framebuffer mode (VESA framebuffer) --->

- [*] Add a VGA BIOS image
- `"(vgabios.rom)"` VGA BIOS path and filename
- (XXXX,XXXX) VGA device PCI IDs <-- ВАШ PCI ID через ',' (не через ':')

* Payload
- Add a payload (SeaBIOS)
- SeaBIOS version (1.14.0)

- [*] Use LZMA compression for payloads
    Мы создали самый простой конфиг:
  1. Выбрали материнскую плату для ThinkPad T60/T60p (они используют общие настройки)
  2. Размер прошивки 2 Мб
  3. Включили микрокод для процессора (хотя говорят что на T60 можно и без него, но я не проверял. Первый раз советую собрать с ним, а потом уже можете экспериментировать :) )
  4. Добавили vgabios.rom, включили его инициализацию и выставили разрешение
  5. В качестве загрузчика (payload) используем BIOS (SeaBIOS)

Не забудьте указать ваш PCI ID в пункте VGA device PCI IDs

И наконец, собираем Coreboot командой:

make

В папке coreboot/build/ вы найдёте ваш coreboot.rom

Подготовка T60

Для прошивки нужна утилита flashrom. Установите его из репозитория вашего GNU/Linux дистрибутива.

Разбор ноутбука

Поскольку мы будем прошивать Coreboot при помощи программатора (в данной инструкции используем CH341A), придётся его разобрать до основания. Советую воспользоваться этой инструкцией. BIOS чип находится возле оперативной памяти, дальше от вас.

[Совет] От скелета T60 можно "откусить" мешающий кусок плоскогубцами, чтобы он не закрывал BIOS чип и в следующий к нему можно было подключиться программатором без полного разбора ноутбука.

Подключаемся программатором

Напомню, что мы всё ещё используем CH341A. Как собрать программатор с прищепкой советую посмотреть тут в разделе Assembling the programmer

[Внимание!] Не забудьте отключить аккумулятор, зарядное устройство и BIOS батарейку!

Подключаемся прищепкой программатора к чипу. Красная линия на прищепке должна совпадать с цифрой 1 возле BIOS чипа и/или с точкой на самом чипе. СНАЧАЛА прицепляемся прищепкой к BIOS чипу, ПОТОМ подключаем программатор к компьютеру.

Если на CH341A уже горит светодиод RUN, значит программатор не нашёл чип и надо прицепиться к нему заново: СНАЧАЛА отключаем программатор от компьютера, ПОТОМ отсоединяем прищепку от чипа.

Делаем бэкап заводского биоса (обязательно)

Считываем заводской BIOS с чипа. Сделаем это два раза, чтобы потом проверить их:

sudo flashrom -p ch341a_spi -r bios1.img
sudo flashrom -p ch341a_spi -r bios2.img

Сравниваем оба образа:

diff bios1.img bios2.img

Если вывода нет, значит файлы идентичны, первый файл можно сохранить, а второй удалить. Храните бэкап в надёжном месте. При помощи него вы в любой момент сможете вернуться на рабочий заводской BIOS, если что-то пойдёт не так.

Если же diff написал что файлы разные, то повторите процесс подключение к чипу из прошлого раздела.

[Дополнительно] Можно попробовать распаковать ваш заводской BIOS при помощи Coreboot утилиты bios_extract. Подробнее тут. Если образ распаковался, значит он записался правильно.

Прошиваем BIOS чип (наконец-то!)

Поскольку на BIOS чипе нет никаких ME, GBE и других регионов (в отличии от X230, например), то мы можем заливать нашу Coreboot прошивку полностью без необходимости в layout файлах. Воспользуемся этой командой:

sudo flashrom -p ch341a_spi -w coreboot.rom

Если прошивка завершилась выводом Verifying flash... VERIFIED! значит прошивка прошла успешно и можно отключить программатор (СНАЧАЛА отключаем программатор от компьютера, ПОТОМ отсоединяем прищепку от чипа) и собрать ваш T60 обратно.

Загружаемся!

Если при запуске вас встречает вывод SeaBIOS, то поздравляю! Прошивка прошла успешно!

Дальше можете собирать свои Coreboot прошивки со своей конфигурацией :)

Если же ваш T60 запустился, но нет изображения, то проверьте ThinkLight (сочетание клавиш Fn+PgUp). Если ThinkLight загорелся, значит ноутбук и прошивка исправна, но VGA биос для ATI не заработал. Советую проверить ваш config файл ещё раз.



За дополнительной информацией советую англоязычный проект ZeroCat. Использовать их скрипты не советую (они собирают только с GRUB2 и требуют ОС Trisquel), но документация и примеры конфигов у них хорошие.