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.

234 lines
10 KiB

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