You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

239 lines
10 KiB

7 years ago
6 years ago
6 years ago
  1. # coreboot-x230
  2. pre-built [coreboot](https://www.coreboot.org/) image and documentation on
  3. how to flash them for the
  4. [Thinkpad X230](https://pcsupport.lenovo.com/en/products/laptops-and-netbooks/thinkpad-x-series-laptops/thinkpad-x230).
  5. SeaBIOS is used, to be compatible with Windows and Linux, and to be easy to use:
  6. simply a boot menu and a few options to tick.
  7. ![seabios_bootmenu](front.jpg)
  8. We want to make it easy to "bootstrap" an X230 to a working, unlocked,
  9. up-to-date coreboot-based BIOS.
  10. ## Latest release (config overview and version info)
  11. * coreboot-x230 0.0.5 - see our [release page](https://github.com/merge/coreboot-x230/releases)
  12. * The only proprietary binary, the VGA BIOS is executed in "secure" mode ([PCI_OPTION_ROM_RUN_YABEL](https://www.coreboot.org/Coreboot_Options))
  13. ### coreboot
  14. * We simply take coreboot's current state in it's master branch at the time we build a release image.
  15. That's the preferred way to use coreboot. The git revision we use is always included in the release.
  16. ### Intel microcode
  17. * revision `1f` from 2018-02-07 (Intel package [20180312](https://downloadcenter.intel.com/download/27591) not yet in coreboot upstream) under [Intel's license](LICENSE.microcode)
  18. ### SeaBIOS
  19. * version [1.11.1](https://seabios.org/Releases) from 2018-03-19 (part of coreboot upstream)
  20. ## table of contents
  21. * [TL;DR](#tl-dr)
  22. * [Flashing for the first time](#flashing-for-the-first-time)
  23. * [How to update](#how-to-update)
  24. * [When do we do a release?](#when-do-we-do-a-release)
  25. * [How we build](#how-we-build)
  26. * [Why does this work](#why-does-this-work)
  27. * [Alternatives](#alternatives)
  28. ## TL;DR
  29. For first-time flashing, remove the keyboard and palmrest, and (using a
  30. Raspberry Pi), run `flashrom_rpi_bottom_unlock.sh` on the lower chip
  31. and `flashrom_rpi_top_write.sh` on the top chip of the two.
  32. For updating later, run `prepare_internal_flashing.sh` to get
  33. files and instructions about updating. No need to disassemble.
  34. ## Flashing for the first time
  35. Especially for the first time, you must flash externally. See below for the details
  36. for using a Rapberry Pi, for example.
  37. ### flashrom chip config
  38. We (or our scripts) use [flashrom](https://flashrom.org/) for flashing. Run
  39. `flashrom -p <your_hardware>` (for [example](#how-to-flash)
  40. `flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=128` for the
  41. Raspberry Pi) to let flashrom detect the chip.
  42. It will probably list a few you need to choose from when flashing
  43. (by adding `-c <chipname>`). Please review the chip model for your device.
  44. In case you are unsure what to specify, here's some examples we find out there:
  45. #### 4MB chip
  46. * `MX25L3206E` seems to mostly be in use
  47. #### 8MB chip
  48. * `MX25L6406E/MX25L6408E` is used in [this guide](https://github.com/mfc/flashing-docs/blob/master/walkthrough%20for%20flashing%20heads%20on%20an%20x230.md#neutering-me)
  49. * `MX25L3206E/MX25L3208E` is seen working with various X230 models.
  50. * `EN25QH64` is used sometimes
  51. ### EC firmware (optional)
  52. Enter Lenovo's BIOS with __F1__ and check the embedded controller (EC) version to be
  53. __1.14__ and upgrade using
  54. [the latest bootable CD](https://support.lenovo.com/at/en/downloads/ds029188)
  55. if it isn't. This updates BIOS and EC. The EC cannot be upgraded when coreboot
  56. is installed. (In case a newer version should ever be available (I doubt it),
  57. you could temporarily flash back the original Lenovo BIOS image from your
  58. backup)
  59. ### ifd unlock and me_cleaner: the 8MB chip
  60. The Intel Management Engine resides on the 8MB chip (at the bottom, closer to
  61. you). We don't need to touch it
  62. for coreboot-upgrades in the future, but to enable internal flashing, we need
  63. to unlock it once.
  64. We run [ifdtool](https://github.com/coreboot/coreboot/tree/master/util/ifdtool)
  65. and, while we are at it, [me_cleaner](https://github.com/corna/me_cleaner) on it:
  66. We support using a RPi, see below for the connection details.
  67. Move the release-tarball to the RPi (USB Stick or however) and unpack it
  68. (to the current directory and change into it):
  69. mkdir tarball_extracted
  70. tar -xf <tarball>.tar.xz -C tarball_extracted
  71. cd tarball_extracted
  72. And finally unlock the 8M chip by using the included script (be patient):
  73. sudo ./flashrom_rpi_bottom_unlock.sh -m -c <chipname> -k <backup.bin>
  74. That's it. Keep the backup safe.
  75. when updating to a new release, you don't have to disasseble your Thinkpad
  76. and can flash internally (at your own risk), see below.
  77. #### background (just so you know)
  78. The `-m` option above also runs `me_cleaner -S` before flashing back.
  79. If you don't use a RPi, change the flashrom programmer to your needs:
  80. flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=128 -c "MX25L6406E/MX25L6408E" -r ifdmegbe.rom
  81. flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=128 -c "MX25L6406E/MX25L6408E" -r ifdmegbe2.rom
  82. diff ifdmegbe.rom ifdmegbe2.rom
  83. git clone https://github.com/corna/me_cleaner.git && cd me_cleaner
  84. ./me_cleaner.py -S -O ifdmegbe_meclean.rom ifdmegbe.rom
  85. ifdtool -u ifdmegbe_meclean.rom
  86. flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=128 -c "MX25L6406E/MX25L6408E" -w ifdmegbe_meclean.rom.new
  87. ### BIOS: the 4MB chip
  88. (internally, memory of the two chips is mapped together, the 8MB being the lower
  89. part, but we can essientially ignore that). Again, using a RPi is supported
  90. here. We assume you have the unpacked release tarball ready, see above. Use
  91. the following included script:
  92. sudo ./flashrom_rpi_top_write.sh -i x230_coreboot_seabios_<hash>_top.rom -c <chipname> -k <backup>
  93. That's it. Keep the backup safe.
  94. ## How to update
  95. When __upgrading__ to a new release, only the "upper" 4MB chip has to be written.
  96. Download the latest release image we provide and flash it:
  97. ### Example: Raspberry Pi 3
  98. Here you'll flash externally, using a "Pomona 5250 8-pin SOIC test clip". You'll find
  99. one easily. This is how the X230's SPI connection looks on both chips:
  100. Screen (furthest from you)
  101. __
  102. MOSI 5 --| |-- 4 GND
  103. CLK 6 --| |-- 3 N/C
  104. N/C 7 --| |-- 2 MISO
  105. VCC 8 --|__|-- 1 CS
  106. Edge (closest to you)
  107. and with our release tarball unpacked, the command you need looks like so:
  108. flashrom_rpi_top_write.sh -i x230_coreboot_seabios_<release>_top.rom -c <chipname>
  109. We run [Raspbian](https://www.raspberrypi.org/downloads/raspbian/)
  110. and have the following setup
  111. * [Serial connection](https://elinux.org/RPi_Serial_Connection) using a "USB to Serial" UART Adapter and picocom or minicom
  112. * Yes, in this case you need a second PC connected to the RPi over UART
  113. * in the SD Cards's `/boot/config.txt` file `enable_uart=1` and `dtparam=spi=on`
  114. * [For flashrom](https://www.flashrom.org/RaspberryPi) we put `spi_bcm2835` and `spidev` in /etc/modules
  115. * [Connect to a wifi](https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md) or to network over ethernet to install `flashrom`
  116. * only use the ...top.rom release file
  117. * connect the Clip to the Raspberry Pi 3 (there are [prettier images](https://github.com/splitbrain/rpibplusleaf) too:
  118. Edge of pi (furthest from you)
  119. (UART)
  120. L GND TX RX CS
  121. E | | | |
  122. F +---------------------------------------------------------------------------------+
  123. T | x x x x x x x x x x x x x x x x x x x x |
  124. | x x x x x x x x x x x x x x x x x x x x |
  125. E +----------------------------------^---^---^---^-------------------------------^--+
  126. D | | | | |
  127. G 3.3V MOSIMISO| GND
  128. E (VCC) CLK
  129. Body of Pi (closest to you)
  130. Now you should be able to copy the image over to your Rasperry Pi and run the
  131. mentioned `flashrom` commands. One way to copy, is convertig it to ascii using
  132. `uuencode` (part of Debian's sharutils package) described below. This is a very
  133. direct, shady and slow way to copy file. Another way is of course using a USB
  134. Stick or scp :) (but you need even more hardware or a network).
  135. (convert)
  136. host$ uuencode coreboot.rom coreboot.rom.ascii > coreboot.rom.ascii
  137. (transfer)
  138. rpi$ cat > coreboot.rom.ascii
  139. host$ pv coreboot.rom.ascii > /dev/ttyUSBX
  140. (wait)
  141. rpi$ (CTRL-D)
  142. (convert back)
  143. rpi$ uudecode -o coreboot.rom coreboot.rom.ascii
  144. (verify)
  145. host$ sha1sum coreboot.rom
  146. rpi$ sha1sum coreboot.rom
  147. ![Raspberry Pi at work](rpi_clip.jpg)
  148. ### Example: internal
  149. CAUTION: THIS IS NOT ENCOURAGED
  150. * Only for updating! You have to have your 8MB chip flashed externally using
  151. our `flashrom_rpi_bottom_unlock.sh` script (`ifdtool -u`) before this, once
  152. * very convenient, but according to the [flashrom manpage](https://manpages.debian.org/stretch/flashrom/flashrom.8.en.html) this is very dangerous!
  153. * Boot Linux with the `iomem=relaxed` boot parameter (for example set in /etc/default/grub)
  154. * download the latest release tarball (4MB "top" BIOS image is included) and extract it
  155. * run `prepare_internal_flashing.sh` for generating all necessary files and instructions
  156. ## When do we do a release?
  157. Either when
  158. * There is a new SeaBIOS release,
  159. * There is a new Intel microcode release (for our CPU model),
  160. * There is a coreboot issue that affects us, or
  161. * We change the config
  162. ## How we build
  163. * Everything necessary to build coreboot (while only the top 4MB are usable of course) is included here
  164. * The task of [building coreboot](https://www.coreboot.org/Build_HOWTO) is not too difficult
  165. * When doing a release here, we always try to upload to coreboot's [board status project](https://www.coreboot.org/Supported_Motherboards)
  166. * If we add out-of-tree patches, we always [post them for review](http://review.coreboot.org/) upstream
  167. ## Why does this work?
  168. On the X230, there are 2 physical "BIOS" chips. The "upper" 4MB
  169. one holds the actual bios we can generate using coreboot, and the "lower" 8MB
  170. one holds the rest that you can [modify yourself once](#flashing-for-the-first-time),
  171. if you like, but strictly speaking, you
  172. [don't need to touch it at all](https://www.coreboot.org/Board:lenovo/x230#Building_Firmware).
  173. What's this "rest"?
  174. Mainly a tiny binary used by the Ethernet card and the Intel Management Engine.
  175. ## Alternatives
  176. * [Heads](https://github.com/osresearch/heads/releases) also releases pre-built
  177. flash images for the X230 - with __way__ more sophisticated functionality.