<p>Philipp Deppenwiese <strong>merged</strong> this change.</p><p><a href="https://review.coreboot.org/27852">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  build bot (Jenkins): Verified
  Philipp Deppenwiese: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Documentation: Add basic flashing tutorial for Lenovo<br><br>* Add basic flashing tutorial<br>** Describe internal and external flashing<br>** Describe flash supply diode protection<br>** Gives general advices on flashing<br>** Describe how to use flashrom --ifd<br>*  Describe basic flashing on Lenovo T4xx devices<br>** Describe how to disassemble and access the flash IC on T4xx<br>** Describe flash layout on Sandy Bridge and Ivy Bridge series.<br><br>Change-Id: Ia833e27f4e7d89ee32be9bed21a0c021839facec<br>Signed-off-by: Patrick Rudolph <siro@das-labor.org><br>Reviewed-on: https://review.coreboot.org/27852<br>Tested-by: build bot (Jenkins) <no-reply@coreboot.org><br>Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com><br>---<br>A Documentation/flash_tutorial/ext_power.md<br>A Documentation/flash_tutorial/ext_standalone.md<br>A Documentation/flash_tutorial/flash_ic_diode.svg<br>A Documentation/flash_tutorial/flash_ic_no_diode.svg<br>A Documentation/flash_tutorial/index.md<br>A Documentation/flash_tutorial/int_flashrom.md<br>A Documentation/flash_tutorial/no_ext_power.md<br>M Documentation/index.md<br>M Documentation/mainboard/index.md<br>A Documentation/mainboard/lenovo/flashlayout_xx20.svg<br>A Documentation/mainboard/lenovo/flashlayout_xx30.svg<br>A Documentation/mainboard/lenovo/t420.md<br>A Documentation/mainboard/lenovo/t430.md<br>A Documentation/mainboard/lenovo/t4xx_series.md<br>A Documentation/mainboard/lenovo/xx20_series.md<br>A Documentation/mainboard/lenovo/xx30_series.md<br>16 files changed, 616 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Documentation/flash_tutorial/ext_power.md b/Documentation/flash_tutorial/ext_power.md</span><br><span>new file mode 100644</span><br><span>index 0000000..542ccfd</span><br><span>--- /dev/null</span><br><span>+++ b/Documentation/flash_tutorial/ext_power.md</span><br><span>@@ -0,0 +1,28 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Flashing firmware externally supplying direct power</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+**WARNING:** Never use a high current rated power supply, like PC ATX power</span><br><span style="color: hsl(120, 100%, 40%);">+             supply. It'll literally melt your PCB traces on short circuit.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+On some mainboards the flash IC Vcc pin is connected to a diode, which prevents</span><br><span style="color: hsl(120, 100%, 40%);">+powering the rest of the board.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+![][flash_ic_diode]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Please have a look at the mainboard specific documentation for details.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+On those boards it's safe to use a programmer and supply power externally.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+**WARNING:** Verify that you apply the correct voltage!</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## USB programmer</span><br><span style="color: hsl(120, 100%, 40%);">+USB programmers are usually current limited by the host USB hub. On USB 2.0</span><br><span style="color: hsl(120, 100%, 40%);">+ports the limit is 500mA, which is sufficient to power the flash. Those are</span><br><span style="color: hsl(120, 100%, 40%);">+the best choice as they are stateless and have a fast power on reset cycle.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Single board computers (like BeagleBone Black / RPi)</span><br><span style="color: hsl(120, 100%, 40%);">+Be careful when connecting a flash chip, especially when using a Pomona</span><br><span style="color: hsl(120, 100%, 40%);">+test-clip. A short circuit or overcurrent (250mA) causes a brown-out reset,</span><br><span style="color: hsl(120, 100%, 40%);">+resulting in a reboot of the running operating system (and possible loss of</span><br><span style="color: hsl(120, 100%, 40%);">+remote shell).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[flash_ic_diode]: flash_ic_diode.svg</span><br><span>diff --git a/Documentation/flash_tutorial/ext_standalone.md b/Documentation/flash_tutorial/ext_standalone.md</span><br><span>new file mode 100644</span><br><span>index 0000000..3a676ce</span><br><span>--- /dev/null</span><br><span>+++ b/Documentation/flash_tutorial/ext_standalone.md</span><br><span>@@ -0,0 +1,23 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Flashing firmware standalone</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+If none of the other methods work, there are three possibilities:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Desolder</span><br><span style="color: hsl(120, 100%, 40%);">+You must remove or desolder the flash IC before you can flash it.</span><br><span style="color: hsl(120, 100%, 40%);">+It's recommended to solder a socket in place of the flash IC.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+When flashing the IC, always connect all input pins.</span><br><span style="color: hsl(120, 100%, 40%);">+If in doubt, pull /WP, /HOLD, /RESET and alike up towards Vcc.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## SPI flash emulator</span><br><span style="color: hsl(120, 100%, 40%);">+If you are a developer, you might want to use an [EM100Pro] instead, which sets</span><br><span style="color: hsl(120, 100%, 40%);">+the onboard flash on hold, and allows to run custom firmware.</span><br><span style="color: hsl(120, 100%, 40%);">+It provides a very fast development cycle without actually writing to flash.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## SPI flash overwrite</span><br><span style="color: hsl(120, 100%, 40%);">+It is possible to set the onboard flash on hold and use another flash chip.</span><br><span style="color: hsl(120, 100%, 40%);">+Connect all lines one-to-one, except /HOLD. Pull /HOLD of the soldered flash IC</span><br><span style="color: hsl(120, 100%, 40%);">+low, and /HOLD of your replacement flash IC high.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[EM100Pro]: https://www.dediprog.com/product/EM100Pro</span><br><span>diff --git a/Documentation/flash_tutorial/flash_ic_diode.svg b/Documentation/flash_tutorial/flash_ic_diode.svg</span><br><span>new file mode 100644</span><br><span>index 0000000..22cd872</span><br><span>--- /dev/null</span><br><span>+++ b/Documentation/flash_tutorial/flash_ic_diode.svg</span><br><span>@@ -0,0 +1,61 @@</span><br><span style="color: hsl(120, 100%, 40%);">+<?xml version="1.0" encoding="UTF-8" standalone="no"?></span><br><span style="color: hsl(120, 100%, 40%);">+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/PR-SVG-20010719/DTD/svg10.dtd"></span><br><span style="color: hsl(120, 100%, 40%);">+<svg width="4cm" height="3cm" viewBox="311 435 68 45" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></span><br><span style="color: hsl(120, 100%, 40%);">+  <g></span><br><span style="color: hsl(120, 100%, 40%);">+    <g></span><br><span style="color: hsl(120, 100%, 40%);">+      <rect style="fill: #ffffff" x="322.125" y="451.034" width="37.75" height="26.6444"/></span><br><span style="color: hsl(120, 100%, 40%);">+      <rect style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x="322.125" y="451.034" width="37.75" height="26.6444"/></span><br><span style="color: hsl(120, 100%, 40%);">+      <text font-size="4.51549" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="341" y="465.734"></span><br><span style="color: hsl(120, 100%, 40%);">+        <tspan x="341" y="465.734"></tspan></span><br><span style="color: hsl(120, 100%, 40%);">+      </text></span><br><span style="color: hsl(120, 100%, 40%);">+    </g></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="359.875" y1="456.784" x2="368.527" y2="456.784"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51549" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="348.75" y="457.909"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="348.75" y="457.909">VCC</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="359.763" y1="461.772" x2="368.652" y2="461.784"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="360.138" y1="466.872" x2="368.527" y2="466.909"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="360.277" y1="471.534" x2="368.402" y2="471.534"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51549" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="345.752" y="463.247"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="345.752" y="463.247">HOLD</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 0.2; stroke: #000000" x1="346.652" y1="459.159" x2="358.402" y2="459.159"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51549" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="349.752" y="468.247"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="349.752" y="468.247">CLK</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51549" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="353.502" y="472.997"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="353.502" y="472.997">DI</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="313.49" y1="456.922" x2="322.143" y2="456.922"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="313.378" y1="461.909" x2="322.268" y2="461.922"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="313.753" y1="467.009" x2="322.143" y2="467.047"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="313.893" y1="471.672" x2="322.018" y2="471.672"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51549" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="323.752" y="458.372"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="323.752" y="458.372">CS</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51549" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="324.127" y="468.497"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="324.127" y="468.497">WP</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51549" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="323.752" y="472.997"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="323.752" y="472.997">GND</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51549" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="324.127" y="463.497"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="324.127" y="463.497">DO</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 0.2; stroke: #000000" x1="330.852" y1="454.397" x2="323.902" y2="454.409"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 0.2; stroke: #000000" x1="330.802" y1="464.397" x2="323.852" y2="464.409"/></span><br><span style="color: hsl(120, 100%, 40%);">+  </g></span><br><span style="color: hsl(120, 100%, 40%);">+  <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="368.252" y1="456.797" x2="373.902" y2="456.784"/></span><br><span style="color: hsl(120, 100%, 40%);">+  <g></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="374.027" y1="456.784" x2="374.027" y2="438.895"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <polyline style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" points="375.027,439.777 374.027,437.777 373.027,439.777 "/></span><br><span style="color: hsl(120, 100%, 40%);">+  </g></span><br><span style="color: hsl(120, 100%, 40%);">+  <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="314.277" y1="471.784" x2="314.277" y2="479.659"/></span><br><span style="color: hsl(120, 100%, 40%);">+  <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="317.027" y1="479.659" x2="311.502" y2="479.672"/></span><br><span style="color: hsl(120, 100%, 40%);">+  <g></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1.2; stroke: #000000" x1="374.027" y1="443.284" x2="374.027" y2="447.434"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <polygon style="fill: #000000" points="372.027,447.434 374.027,451.434 376.027,447.434 "/></span><br><span style="color: hsl(120, 100%, 40%);">+    <polygon style="fill: none; fill-opacity:0; stroke-width: 1.2; stroke: #000000" points="372.027,447.434 374.027,451.434 376.027,447.434 "/></span><br><span style="color: hsl(120, 100%, 40%);">+  </g></span><br><span style="color: hsl(120, 100%, 40%);">+  <line style="fill: none; fill-opacity:0; stroke-width: 1.2; stroke: #000000" x1="370.402" y1="452.032" x2="377.527" y2="452.032"/></span><br><span style="color: hsl(120, 100%, 40%);">+</svg></span><br><span>diff --git a/Documentation/flash_tutorial/flash_ic_no_diode.svg b/Documentation/flash_tutorial/flash_ic_no_diode.svg</span><br><span>new file mode 100644</span><br><span>index 0000000..543c926</span><br><span>--- /dev/null</span><br><span>+++ b/Documentation/flash_tutorial/flash_ic_no_diode.svg</span><br><span>@@ -0,0 +1,55 @@</span><br><span style="color: hsl(120, 100%, 40%);">+<?xml version="1.0" encoding="UTF-8" standalone="no"?></span><br><span style="color: hsl(120, 100%, 40%);">+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/PR-SVG-20010719/DTD/svg10.dtd"></span><br><span style="color: hsl(120, 100%, 40%);">+<svg width="4cm" height="3cm" viewBox="311 435 65 45" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></span><br><span style="color: hsl(120, 100%, 40%);">+  <g></span><br><span style="color: hsl(120, 100%, 40%);">+    <g></span><br><span style="color: hsl(120, 100%, 40%);">+      <rect style="fill: #ffffff" x="322.124" y="451.034" width="37.75" height="26.6444"/></span><br><span style="color: hsl(120, 100%, 40%);">+      <rect style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x="322.124" y="451.034" width="37.75" height="26.6444"/></span><br><span style="color: hsl(120, 100%, 40%);">+      <text font-size="4.51556" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="340.999" y="465.734"></span><br><span style="color: hsl(120, 100%, 40%);">+        <tspan x="340.999" y="465.734"></tspan></span><br><span style="color: hsl(120, 100%, 40%);">+      </text></span><br><span style="color: hsl(120, 100%, 40%);">+    </g></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="359.874" y1="456.784" x2="368.528" y2="456.784"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51556" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="348.75" y="457.91"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="348.75" y="457.91">VCC</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="359.762" y1="461.772" x2="368.652" y2="461.784"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="360.138" y1="466.872" x2="368.528" y2="466.91"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="360.278" y1="471.534" x2="368.402" y2="471.534"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51556" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="345.752" y="463.246"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="345.752" y="463.246">HOLD</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 0.2; stroke: #000000" x1="346.652" y1="459.16" x2="358.402" y2="459.16"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51556" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="349.752" y="468.246"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="349.752" y="468.246">CLK</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51556" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="353.502" y="472.996"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="353.502" y="472.996">DI</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="313.49" y1="456.922" x2="322.142" y2="456.922"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="313.378" y1="461.91" x2="322.268" y2="461.922"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="313.752" y1="467.01" x2="322.142" y2="467.046"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="313.892" y1="471.672" x2="322.018" y2="471.672"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51556" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="323.752" y="458.372"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="323.752" y="458.372">CS</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51556" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="324.128" y="468.496"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="324.128" y="468.496">WP</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51556" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="323.752" y="472.996"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="323.752" y="472.996">GND</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="4.51556" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="324.128" y="463.496"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="324.128" y="463.496">DO</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 0.2; stroke: #000000" x1="330.852" y1="454.396" x2="323.902" y2="454.41"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 0.2; stroke: #000000" x1="330.802" y1="464.396" x2="323.852" y2="464.41"/></span><br><span style="color: hsl(120, 100%, 40%);">+  </g></span><br><span style="color: hsl(120, 100%, 40%);">+  <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="368.252" y1="456.796" x2="373.902" y2="456.784"/></span><br><span style="color: hsl(120, 100%, 40%);">+  <g></span><br><span style="color: hsl(120, 100%, 40%);">+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="374.028" y1="456.784" x2="374.028" y2="438.896"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <polyline style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" points="375.028,439.778 374.028,437.778 373.028,439.778 "/></span><br><span style="color: hsl(120, 100%, 40%);">+  </g></span><br><span style="color: hsl(120, 100%, 40%);">+  <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="314.278" y1="471.784" x2="314.278" y2="479.66"/></span><br><span style="color: hsl(120, 100%, 40%);">+  <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="317.028" y1="479.66" x2="311.502" y2="479.672"/></span><br><span style="color: hsl(120, 100%, 40%);">+</svg></span><br><span>diff --git a/Documentation/flash_tutorial/index.md b/Documentation/flash_tutorial/index.md</span><br><span>new file mode 100644</span><br><span>index 0000000..1a29137</span><br><span>--- /dev/null</span><br><span>+++ b/Documentation/flash_tutorial/index.md</span><br><span>@@ -0,0 +1,105 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Flashing firmware tutorial</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Updating the firmware is possible using the **internal method**, where the updates</span><br><span style="color: hsl(120, 100%, 40%);">+happen from a running system, or using the **external method**, where the system</span><br><span style="color: hsl(120, 100%, 40%);">+is in a shut down state and an external programmer is attached to write into the</span><br><span style="color: hsl(120, 100%, 40%);">+flash IC.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Contents</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+* [Flashing internaly](int_flashrom.md)</span><br><span style="color: hsl(120, 100%, 40%);">+* [Flashing firmware standalone](ext_standalone.md)</span><br><span style="color: hsl(120, 100%, 40%);">+* [Flashing firmware externally supplying direct power](ext_power.md)</span><br><span style="color: hsl(120, 100%, 40%);">+* [Flashing firmware externally without supplying direct power](no_ext_power.md)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## General advice</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+* It's recommended to only flash the BIOS region.</span><br><span style="color: hsl(120, 100%, 40%);">+* Always verify the firmware image.</span><br><span style="color: hsl(120, 100%, 40%);">+* If you flash externally and have transmission errors:</span><br><span style="color: hsl(120, 100%, 40%);">+  * Use short wires</span><br><span style="color: hsl(120, 100%, 40%);">+  * Reduce clock frequency</span><br><span style="color: hsl(120, 100%, 40%);">+  * Check power supply</span><br><span style="color: hsl(120, 100%, 40%);">+  * Make sure that there are no other bus masters (EC, ME, SoC, ...)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Internal method</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+This method using [flashrom] is available on many platforms, as long as they</span><br><span style="color: hsl(120, 100%, 40%);">+aren't locked down.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+There are various protection schemes that make it impossible to modify or</span><br><span style="color: hsl(120, 100%, 40%);">+replace a firmware from a running system. coreboot allows to disable these</span><br><span style="color: hsl(120, 100%, 40%);">+mechanisms, making it possible to overwrite (or update) the firmware from a</span><br><span style="color: hsl(120, 100%, 40%);">+running system.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Usually you must use the **external method** once to install a retrofitted</span><br><span style="color: hsl(120, 100%, 40%);">+coreboot and then you can use the **internal method** for future updates.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+There are multiple ways to update the firmware:</span><br><span style="color: hsl(120, 100%, 40%);">+* Using flashrom's *internal* programmer to directly write into the firmware</span><br><span style="color: hsl(120, 100%, 40%);">+  flash IC, running on the target machine itself</span><br><span style="color: hsl(120, 100%, 40%);">+* A proprietary software to update the firmware, running on the target machine</span><br><span style="color: hsl(120, 100%, 40%);">+  itself</span><br><span style="color: hsl(120, 100%, 40%);">+* A UEFI firmware update capsule</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+More details on flashrom's</span><br><span style="color: hsl(120, 100%, 40%);">+* [internal programmer](int_flashrom.md)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## External method</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+External flashing is possible on many platforms, but requires disassembling</span><br><span style="color: hsl(120, 100%, 40%);">+the target hardware. You need to buy a flash programmer, that</span><br><span style="color: hsl(120, 100%, 40%);">+exposes the same interface as your flash IC (likely SPI).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Please also have a look at the mainboard-specific documentation for details.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+After exposing the firmware flash IC, read the schematics and use one of the</span><br><span style="color: hsl(120, 100%, 40%);">+possible methods:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+* [Flashing firmware standalone](ext_standalone.md)</span><br><span style="color: hsl(120, 100%, 40%);">+* [Flashing firmware externally supplying direct power](ext_power.md)</span><br><span style="color: hsl(120, 100%, 40%);">+* [Flashing firmware externally without supplying direct power](no_ext_power.md)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+**WARNING:** Using the wrong method or accidentally using the wrong pinout might</span><br><span style="color: hsl(120, 100%, 40%);">+  permanently damage your hardware!</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Using a layout file</span><br><span style="color: hsl(120, 100%, 40%);">+On platforms where the flash IC is shared with other components you might want</span><br><span style="color: hsl(120, 100%, 40%);">+to write only a part of the flash IC. On Intel for example there are IFD, ME and</span><br><span style="color: hsl(120, 100%, 40%);">+GBE which don't need to be updated to install coreboot.</span><br><span style="color: hsl(120, 100%, 40%);">+To make [flashrom] only write the *bios* region, leaving Intel ME and Intel IFD</span><br><span style="color: hsl(120, 100%, 40%);">+untouched, you can use a layout file, which can be created using ifdtool</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+```bash</span><br><span style="color: hsl(120, 100%, 40%);">+ifdtool -f rom.layout coreboot.rom</span><br><span style="color: hsl(120, 100%, 40%);">+```</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+and looks similar to:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+```</span><br><span style="color: hsl(120, 100%, 40%);">+00000000:00000fff fd</span><br><span style="color: hsl(120, 100%, 40%);">+00500000:00bfffff bios</span><br><span style="color: hsl(120, 100%, 40%);">+00003000:004fffff me</span><br><span style="color: hsl(120, 100%, 40%);">+00001000:00002fff gbe</span><br><span style="color: hsl(120, 100%, 40%);">+```</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+By specifying *-l* and *-i* [flashrom] writes a single region:</span><br><span style="color: hsl(120, 100%, 40%);">+```bash</span><br><span style="color: hsl(120, 100%, 40%);">+flashrom -l rom.layout -i bios -w coreboot.rom -p <programmer></span><br><span style="color: hsl(120, 100%, 40%);">+```</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Using an IFD to determine the layout</span><br><span style="color: hsl(120, 100%, 40%);">+flashrom version 1.0 supports reading the layout from the IFD (first 4KiB of</span><br><span style="color: hsl(120, 100%, 40%);">+the ROM). You don't need to manually specify a layout it, but it only works</span><br><span style="color: hsl(120, 100%, 40%);">+under the following conditions:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+* Only available on Intel ICH7+</span><br><span style="color: hsl(120, 100%, 40%);">+* There's only one flash IC when flashing externally</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+```bash</span><br><span style="color: hsl(120, 100%, 40%);">+flashrom --ifd -i bios -w coreboot.rom -p <programmer></span><br><span style="color: hsl(120, 100%, 40%);">+```</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+**TODO** explain FMAP regions, normal/fallback mechanism, flash lock mechanisms</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[flashrom]: https://www.flashrom.org/Flashrom</span><br><span>diff --git a/Documentation/flash_tutorial/int_flashrom.md b/Documentation/flash_tutorial/int_flashrom.md</span><br><span>new file mode 100644</span><br><span>index 0000000..28b534b</span><br><span>--- /dev/null</span><br><span>+++ b/Documentation/flash_tutorial/int_flashrom.md</span><br><span>@@ -0,0 +1,19 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Flashing firmware internally</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+**WARNING:** If you flash a broken firmware and have no recovery mechanism, you</span><br><span style="color: hsl(120, 100%, 40%);">+             must use the **external method** to flash a working firmware again.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Using flashrom</span><br><span style="color: hsl(120, 100%, 40%);">+This method does only work on Linux, if it isn't locked down.</span><br><span style="color: hsl(120, 100%, 40%);">+You may also need to boot with 'iomem=relaxed' in the kernel command</span><br><span style="color: hsl(120, 100%, 40%);">+line if CONFIG_IO_STRICT_DEVMEM is set.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+For more details please also check [flashrom's wiki].</span><br><span style="color: hsl(120, 100%, 40%);">+Use the programmer *internal* to flash *coreboot.rom* internally:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+```bash</span><br><span style="color: hsl(120, 100%, 40%);">+flashrom -p internal -w coreboot.rom</span><br><span style="color: hsl(120, 100%, 40%);">+```</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[flashrom's wiki]: https://www.flashrom.org/Flashrom</span><br><span>diff --git a/Documentation/flash_tutorial/no_ext_power.md b/Documentation/flash_tutorial/no_ext_power.md</span><br><span>new file mode 100644</span><br><span>index 0000000..b97ba4c</span><br><span>--- /dev/null</span><br><span>+++ b/Documentation/flash_tutorial/no_ext_power.md</span><br><span>@@ -0,0 +1,22 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Flashing firmware externally supplying no power</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+On some mainboards the flash IC's Vcc pin is connected to the internal</span><br><span style="color: hsl(120, 100%, 40%);">+power-rail, powering the entire board if the flash IC is powered externally.</span><br><span style="color: hsl(120, 100%, 40%);">+Likely it powers other chips which access the flash IC, preventing the external</span><br><span style="color: hsl(120, 100%, 40%);">+programmer from reading/writing the chip. It also violates the components'</span><br><span style="color: hsl(120, 100%, 40%);">+power sequence, bringing the ICs into an undefined state.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+![][flash_ic_no_diode]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Please have a look at the mainboard specific documentation for details.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+On those boards it's recommended to use a programmer without supplying power</span><br><span style="color: hsl(120, 100%, 40%);">+externally.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The key to read and write the flash IC is to put the machine into *S3* sleep-</span><br><span style="color: hsl(120, 100%, 40%);">+state or *S5* sleep-state *maybe* with Wake-On-LAN enabled.</span><br><span style="color: hsl(120, 100%, 40%);">+Another option that sometimes works is to keep the device in reset. This method requires</span><br><span style="color: hsl(120, 100%, 40%);">+knowledge of the board schematics and might require hardware modifications.</span><br><span style="color: hsl(120, 100%, 40%);">+Use a multimeter to make sure the flash IC is powered in those sleep states.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[flash_ic_no_diode]: flash_ic_no_diode.svg</span><br><span>diff --git a/Documentation/index.md b/Documentation/index.md</span><br><span>index b20eedc..e69f2ea 100644</span><br><span>--- a/Documentation/index.md</span><br><span>+++ b/Documentation/index.md</span><br><span>@@ -23,3 +23,4 @@</span><br><span> * [Vendorcode-specific documentation](vendorcode/index.md)</span><br><span> * [Utilities](util.md)</span><br><span> * [Release notes for past releases](releases/index.md)</span><br><span style="color: hsl(120, 100%, 40%);">+* [Flashing firmware tutorial](flash_tutorial/index.md)</span><br><span>diff --git a/Documentation/mainboard/index.md b/Documentation/mainboard/index.md</span><br><span>index 45eb217..c346a3b 100644</span><br><span>--- a/Documentation/mainboard/index.md</span><br><span>+++ b/Documentation/mainboard/index.md</span><br><span>@@ -26,6 +26,20 @@</span><br><span> </span><br><span> - [Compaq 8200 Elite SFF](hp/compaq_8200_sff.md)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+## Lenovo</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+- [T4xx common](lenovo/t4xx_series.md)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+### Sandy Bridge series</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+- [T420](lenovo/t420.md)</span><br><span style="color: hsl(120, 100%, 40%);">+- [T420 / T520 / X220 / T420s / W520 common](lenovo/xx20_series.md)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+### Ivy Bridge series</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+- [T430](lenovo/t430.md)</span><br><span style="color: hsl(120, 100%, 40%);">+- [T430 / T530 / X230 / W530 common](lenovo/xx30_series.md)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> ## SiFive</span><br><span> </span><br><span> - [SiFive HiFive Unleashed](sifive/hifive-unleashed.md)</span><br><span>diff --git a/Documentation/mainboard/lenovo/flashlayout_xx20.svg b/Documentation/mainboard/lenovo/flashlayout_xx20.svg</span><br><span>new file mode 100644</span><br><span>index 0000000..8884ac3</span><br><span>--- /dev/null</span><br><span>+++ b/Documentation/mainboard/lenovo/flashlayout_xx20.svg</span><br><span>@@ -0,0 +1,52 @@</span><br><span style="color: hsl(120, 100%, 40%);">+<?xml version="1.0" encoding="UTF-8" standalone="no"?></span><br><span style="color: hsl(120, 100%, 40%);">+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/PR-SVG-20010719/DTD/svg10.dtd"></span><br><span style="color: hsl(120, 100%, 40%);">+<svg width="10cm" height="8cm" viewBox="265 -156 186 159" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></span><br><span style="color: hsl(120, 100%, 40%);">+  <g></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: #ffffff" x="307.888" y="-152.131" width="49.1438" height="30.4667"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="307.888" y="-152.131" width="49.1438" height="30.4667"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="6.77333" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="332.46" y="-134.831"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="332.46" y="-134.831">IFD</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+  </g></span><br><span style="color: hsl(120, 100%, 40%);">+  <g></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: #ffffff" x="308" y="-91.1844" width="49.1438" height="59.7756"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="308" y="-91.1844" width="49.1438" height="59.7756"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="6.77333" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="332.572" y="-59.2299"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="332.572" y="-59.2299">ME</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+  </g></span><br><span style="color: hsl(120, 100%, 40%);">+  <g></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: #ffffff" x="307.934" y="-31.6442" width="49.1438" height="30.8828"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="307.934" y="-31.6442" width="49.1438" height="30.8828"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="6.77333" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="332.506" y="-14.1361"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="332.506" y="-14.1361">BIOS</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+  </g></span><br><span style="color: hsl(120, 100%, 40%);">+  <g></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: #ffffff" x="308" y="-121.59" width="49.1438" height="30.4667"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="308" y="-121.59" width="49.1438" height="30.4667"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="6.77333" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="332.572" y="-104.29"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="332.572" y="-104.29">GBE</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+  </g></span><br><span style="color: hsl(120, 100%, 40%);">+  <text font-size="6.77333" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="265.968" y="-149.208"></span><br><span style="color: hsl(120, 100%, 40%);">+    <tspan x="265.968" y="-149.208">0x000000</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+  </text></span><br><span style="color: hsl(120, 100%, 40%);">+  <text font-size="6.77333" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="266.362" y="-120.102"></span><br><span style="color: hsl(120, 100%, 40%);">+    <tspan x="266.362" y="-120.102">0x001000</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+  </text></span><br><span style="color: hsl(120, 100%, 40%);">+  <text font-size="6.77333" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="266.162" y="-88.8972"></span><br><span style="color: hsl(120, 100%, 40%);">+    <tspan x="266.162" y="-88.8972">0x003000</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+  </text></span><br><span style="color: hsl(120, 100%, 40%);">+  <text font-size="6.77333" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="266.144" y="-29.6656"></span><br><span style="color: hsl(120, 100%, 40%);">+    <tspan x="266.144" y="-29.6656">0x500000</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+  </text></span><br><span style="color: hsl(120, 100%, 40%);">+  <text font-size="6.77333" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="266.326" y="1.87412"></span><br><span style="color: hsl(120, 100%, 40%);">+    <tspan x="266.326" y="1.87412">0x800000</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+  </text></span><br><span style="color: hsl(120, 100%, 40%);">+  <path style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" d="M 380.877 -151.013 C 401.876,-151.013 379.377,-73.513 400.627,-72.513"/></span><br><span style="color: hsl(120, 100%, 40%);">+  <path style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" d="M 381.377 -0.763268 C 395.238,-0.763268 387.016,-72.763 400.877,-72.763"/></span><br><span style="color: hsl(120, 100%, 40%);">+  <text font-size="10.1598" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="406.127" y="-68.513"></span><br><span style="color: hsl(120, 100%, 40%);">+    <tspan x="406.127" y="-68.513">Flash #0</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+  </text></span><br><span style="color: hsl(120, 100%, 40%);">+</svg></span><br><span>diff --git a/Documentation/mainboard/lenovo/flashlayout_xx30.svg b/Documentation/mainboard/lenovo/flashlayout_xx30.svg</span><br><span>new file mode 100644</span><br><span>index 0000000..5cc4e4f</span><br><span>--- /dev/null</span><br><span>+++ b/Documentation/mainboard/lenovo/flashlayout_xx30.svg</span><br><span>@@ -0,0 +1,61 @@</span><br><span style="color: hsl(120, 100%, 40%);">+<?xml version="1.0" encoding="UTF-8" standalone="no"?></span><br><span style="color: hsl(120, 100%, 40%);">+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/PR-SVG-20010719/DTD/svg10.dtd"></span><br><span style="color: hsl(120, 100%, 40%);">+<svg width="10cm" height="11cm" viewBox="265 -156 187 213" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></span><br><span style="color: hsl(120, 100%, 40%);">+  <g></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: #ffffff" x="307.888" y="-152.131" width="49.1438" height="30.4667"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="307.888" y="-152.131" width="49.1438" height="30.4667"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="6.77333" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="332.46" y="-134.831"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="332.46" y="-134.831">IFD</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+  </g></span><br><span style="color: hsl(120, 100%, 40%);">+  <g></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: #ffffff" x="308" y="-91.1844" width="49.1438" height="59.7756"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="308" y="-91.1844" width="49.1438" height="59.7756"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="6.77333" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="332.572" y="-59.2299"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="332.572" y="-59.2299">ME</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+  </g></span><br><span style="color: hsl(120, 100%, 40%);">+  <g></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: #ffffff" x="307.934" y="-31.6442" width="49.1438" height="85.7161"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="307.934" y="-31.6442" width="49.1438" height="85.7161"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="6.77333" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="332.506" y="13.2805"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="332.506" y="13.2805">BIOS</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+  </g></span><br><span style="color: hsl(120, 100%, 40%);">+  <g></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: #ffffff" x="308" y="-121.59" width="49.1438" height="30.4667"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="308" y="-121.59" width="49.1438" height="30.4667"/></span><br><span style="color: hsl(120, 100%, 40%);">+    <text font-size="6.77333" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="332.572" y="-104.29"></span><br><span style="color: hsl(120, 100%, 40%);">+      <tspan x="332.572" y="-104.29">GBE</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+    </text></span><br><span style="color: hsl(120, 100%, 40%);">+  </g></span><br><span style="color: hsl(120, 100%, 40%);">+  <text font-size="6.77333" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="265.968" y="-149.208"></span><br><span style="color: hsl(120, 100%, 40%);">+    <tspan x="265.968" y="-149.208">0x000000</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+  </text></span><br><span style="color: hsl(120, 100%, 40%);">+  <text font-size="6.77333" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="266.362" y="-120.102"></span><br><span style="color: hsl(120, 100%, 40%);">+    <tspan x="266.362" y="-120.102">0x001000</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+  </text></span><br><span style="color: hsl(120, 100%, 40%);">+  <text font-size="6.77333" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="266.162" y="-88.8972"></span><br><span style="color: hsl(120, 100%, 40%);">+    <tspan x="266.162" y="-88.8972">0x003000</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+  </text></span><br><span style="color: hsl(120, 100%, 40%);">+  <text font-size="6.77333" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="266.144" y="-29.6656"></span><br><span style="color: hsl(120, 100%, 40%);">+    <tspan x="266.144" y="-29.6656">0x500000</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+  </text></span><br><span style="color: hsl(120, 100%, 40%);">+  <text font-size="6.77333" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="266.326" y="1.87412"></span><br><span style="color: hsl(120, 100%, 40%);">+    <tspan x="266.326" y="1.87412">0x800000</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+  </text></span><br><span style="color: hsl(120, 100%, 40%);">+  <path style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" d="M 380.877 -151.013 C 401.876,-151.013 379.377,-73.513 400.627,-72.513"/></span><br><span style="color: hsl(120, 100%, 40%);">+  <path style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" d="M 381.377 -0.763268 C 395.238,-0.763268 387.016,-72.763 400.877,-72.763"/></span><br><span style="color: hsl(120, 100%, 40%);">+  <text font-size="10.1598" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="406.127" y="-68.513"></span><br><span style="color: hsl(120, 100%, 40%);">+    <tspan x="406.127" y="-68.513">Flash #0</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+  </text></span><br><span style="color: hsl(120, 100%, 40%);">+  <path style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" d="M 381.223 -0.537117 C 402.222,-0.537117 379.285,28.8102 399.872,27.8376"/></span><br><span style="color: hsl(120, 100%, 40%);">+  <path style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" d="M 382.176 54.9128 C 396.037,54.9128 385.445,27.9997 399.548,27.8376"/></span><br><span style="color: hsl(120, 100%, 40%);">+  <text font-size="10.1598" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="407.157" y="30.2529"></span><br><span style="color: hsl(120, 100%, 40%);">+    <tspan x="407.157" y="30.2529">Flash #1</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+  </text></span><br><span style="color: hsl(120, 100%, 40%);">+  <text font-size="6.77333" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="266.591" y="54.9733"></span><br><span style="color: hsl(120, 100%, 40%);">+    <tspan x="266.591" y="54.9733">0xc00000</tspan></span><br><span style="color: hsl(120, 100%, 40%);">+  </text></span><br><span style="color: hsl(120, 100%, 40%);">+  <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke-dasharray: 4; stroke: #000000" x1="305.271" y1="-1.2113" x2="378.831" y2="-1.17038"/></span><br><span style="color: hsl(120, 100%, 40%);">+</svg></span><br><span>diff --git a/Documentation/mainboard/lenovo/t420.md b/Documentation/mainboard/lenovo/t420.md</span><br><span>new file mode 100644</span><br><span>index 0000000..ff7a0a9</span><br><span>--- /dev/null</span><br><span>+++ b/Documentation/mainboard/lenovo/t420.md</span><br><span>@@ -0,0 +1,16 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Lenovo T420</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Flashing instructions</span><br><span style="color: hsl(120, 100%, 40%);">+You have to disassemble the whole device, as the flash IC is on the bottom</span><br><span style="color: hsl(120, 100%, 40%);">+of the mainboard.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+For more details have a look at [T420 / T520 / X220 / T420s / W520 common] and</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+```eval_rst</span><br><span style="color: hsl(120, 100%, 40%);">+:doc:`../../flash_tutorial/ext_power`</span><br><span style="color: hsl(120, 100%, 40%);">+```</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Steps to access the flash IC are described here [T4xx series].</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[T4xx series]: t4xx_series.md</span><br><span style="color: hsl(120, 100%, 40%);">+[T420 / T520 / X220 / T420s / W520 common]: xx20_series.md</span><br><span>diff --git a/Documentation/mainboard/lenovo/t430.md b/Documentation/mainboard/lenovo/t430.md</span><br><span>new file mode 100644</span><br><span>index 0000000..787246f</span><br><span>--- /dev/null</span><br><span>+++ b/Documentation/mainboard/lenovo/t430.md</span><br><span>@@ -0,0 +1,15 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Lenovo T430</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Flashing instructions</span><br><span style="color: hsl(120, 100%, 40%);">+You have to disassemble the whole device, as the flash ICs are on the bottom</span><br><span style="color: hsl(120, 100%, 40%);">+of the mainboard.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+For more details have a look at [T430 / T530 / X230 / T430s / W530 common] and</span><br><span style="color: hsl(120, 100%, 40%);">+```eval_rst</span><br><span style="color: hsl(120, 100%, 40%);">+:doc:`../../flash_tutorial/ext_power`</span><br><span style="color: hsl(120, 100%, 40%);">+```</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Steps to access the flash IC are described here [T4xx series].</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[T4xx series]: t4xx_series.md</span><br><span style="color: hsl(120, 100%, 40%);">+[T430 / T530 / X230 / T430s / W530 common]: xx30_series.md</span><br><span>diff --git a/Documentation/mainboard/lenovo/t4xx_series.md b/Documentation/mainboard/lenovo/t4xx_series.md</span><br><span>new file mode 100644</span><br><span>index 0000000..23fe0fb</span><br><span>--- /dev/null</span><br><span>+++ b/Documentation/mainboard/lenovo/t4xx_series.md</span><br><span>@@ -0,0 +1,20 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Lenovo T4xx series disassembly instructions</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+A skilled engineer takes around 40 minutes to disassemble, flash and reassemble</span><br><span style="color: hsl(120, 100%, 40%);">+the whole device.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Steps to access the flash IC:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+* Unplug the main battery</span><br><span style="color: hsl(120, 100%, 40%);">+* Remove the harddisk, CDROM, ExpressCard, SIM-card, SDcard, SmartCard, ...</span><br><span style="color: hsl(120, 100%, 40%);">+* Open the bottom flap and remove the keyboard screw</span><br><span style="color: hsl(120, 100%, 40%);">+* Remove the keyboard</span><br><span style="color: hsl(120, 100%, 40%);">+* Remove the screen</span><br><span style="color: hsl(120, 100%, 40%);">+* Remove the top enclosure</span><br><span style="color: hsl(120, 100%, 40%);">+* Remove the CMOS battery</span><br><span style="color: hsl(120, 100%, 40%);">+* Remove the speakers</span><br><span style="color: hsl(120, 100%, 40%);">+* Remove WWAN and WIFI card</span><br><span style="color: hsl(120, 100%, 40%);">+* Remove the CPU fan</span><br><span style="color: hsl(120, 100%, 40%);">+* Unplug the power cable</span><br><span style="color: hsl(120, 100%, 40%);">+* Remove the bottom enclosure</span><br><span style="color: hsl(120, 100%, 40%);">+* Flip the mainboard and remove the main frame</span><br><span>diff --git a/Documentation/mainboard/lenovo/xx20_series.md b/Documentation/mainboard/lenovo/xx20_series.md</span><br><span>new file mode 100644</span><br><span>index 0000000..976a29b</span><br><span>--- /dev/null</span><br><span>+++ b/Documentation/mainboard/lenovo/xx20_series.md</span><br><span>@@ -0,0 +1,48 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Lenovo Sandy Bridge series</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Flashing coreboot</span><br><span style="color: hsl(120, 100%, 40%);">+```eval_rst</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+| Type                | Value              |</span><br><span style="color: hsl(120, 100%, 40%);">++=====================+====================+</span><br><span style="color: hsl(120, 100%, 40%);">+| Socketed flash      | no                 |</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+| Size                | 8 MiB              |</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+| In circuit flashing | Yes                |</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+| Package             | SOIC-8             |</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+| Write protection    | No                 |</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+| Dual BIOS feature   | No                 |</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+| Internal flashing   | Yes                |</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+```</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Installation instructions</span><br><span style="color: hsl(120, 100%, 40%);">+* Update the EC firmware, as there's no support for EC updates in coreboot.</span><br><span style="color: hsl(120, 100%, 40%);">+* Do **NOT** accidently swap pins or power on the board while a SPI flasher</span><br><span style="color: hsl(120, 100%, 40%);">+  is connected. It will destroy your device.</span><br><span style="color: hsl(120, 100%, 40%);">+* It's recommended to only flash the BIOS region. In that case you don't</span><br><span style="color: hsl(120, 100%, 40%);">+  need to extract BLOBs from vendor firmware.</span><br><span style="color: hsl(120, 100%, 40%);">+  If you want to flash the whole chip, you need BLOBs when building</span><br><span style="color: hsl(120, 100%, 40%);">+  coreboot.</span><br><span style="color: hsl(120, 100%, 40%);">+* The shipped *Flash layout* allocates 3MiB to the BIOS region, which is the space</span><br><span style="color: hsl(120, 100%, 40%);">+  usable by coreboot.</span><br><span style="color: hsl(120, 100%, 40%);">+* ROM chip size should be set to 8MiB.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+```eval_rst</span><br><span style="color: hsl(120, 100%, 40%);">+Please also have a look at :doc:`../../flash_tutorial/index`.</span><br><span style="color: hsl(120, 100%, 40%);">+```</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Flash layout</span><br><span style="color: hsl(120, 100%, 40%);">+There's one 8MiB flash which contains IFD, GBE, ME and BIOS regions.</span><br><span style="color: hsl(120, 100%, 40%);">+On Lenovo's UEFI the EC firmware update is placed at the start of the BIOS</span><br><span style="color: hsl(120, 100%, 40%);">+region. The update is then written into the EC once.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+![][fl]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[fl]: flashlayout_xx20.svg</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/Documentation/mainboard/lenovo/xx30_series.md b/Documentation/mainboard/lenovo/xx30_series.md</span><br><span>new file mode 100644</span><br><span>index 0000000..e65a3f2</span><br><span>--- /dev/null</span><br><span>+++ b/Documentation/mainboard/lenovo/xx30_series.md</span><br><span>@@ -0,0 +1,76 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Lenovo Ivy Bridge series</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Flashing coreboot</span><br><span style="color: hsl(120, 100%, 40%);">+```eval_rst</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+| Type                | Value                          |</span><br><span style="color: hsl(120, 100%, 40%);">++=====================+================================+</span><br><span style="color: hsl(120, 100%, 40%);">+| Socketed flash      | no                             |</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+| Size                | 8 MiB + 4MiB                   |</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+| In circuit flashing | Yes                            |</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+| Package             | SOIC-8                         |</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+| Write protection    | No                             |</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+| Dual BIOS feature   | No                             |</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+| Internal flashing   | Yes                            |</span><br><span style="color: hsl(120, 100%, 40%);">++---------------------+--------------------------------+</span><br><span style="color: hsl(120, 100%, 40%);">+```</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Installation instructions</span><br><span style="color: hsl(120, 100%, 40%);">+* Update the EC firmware, as there's no support for EC updates in coreboot.</span><br><span style="color: hsl(120, 100%, 40%);">+* Do **NOT** accidently swap pins or power on the board while a SPI flasher</span><br><span style="color: hsl(120, 100%, 40%);">+  is connected. It will permanently brick your device.</span><br><span style="color: hsl(120, 100%, 40%);">+* It's recommended to only flash the BIOS region. In that case you don't</span><br><span style="color: hsl(120, 100%, 40%);">+  need to extract BLOBs from vendor firmware.</span><br><span style="color: hsl(120, 100%, 40%);">+  If you want to flash the whole chip, you need BLOBs when building</span><br><span style="color: hsl(120, 100%, 40%);">+  coreboot.</span><br><span style="color: hsl(120, 100%, 40%);">+* The *Flash layout* shows that by default 7MiB of space are available for</span><br><span style="color: hsl(120, 100%, 40%);">+  the use with coreboot.</span><br><span style="color: hsl(120, 100%, 40%);">+* In that case you only want to use a part of the BIOS region that must not</span><br><span style="color: hsl(120, 100%, 40%);">+  exceed 4MiB in size, which means CONFIG_CBFS_SIZE must be smaller than 4MiB.</span><br><span style="color: hsl(120, 100%, 40%);">+* ROM chip size should be set to 12MiB.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+```eval_rst</span><br><span style="color: hsl(120, 100%, 40%);">+Please also have a look at :doc:`../../flash_tutorial/index`.</span><br><span style="color: hsl(120, 100%, 40%);">+```</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Splitting the coreboot.rom</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+To split the coreboot.rom into two images (one for the 8MiB and one for the</span><br><span style="color: hsl(120, 100%, 40%);">+4 MiB flash IC), run the following commands:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+```bash</span><br><span style="color: hsl(120, 100%, 40%);">+dd of=top.rom bs=1M if=build/coreboot.rom skip=8</span><br><span style="color: hsl(120, 100%, 40%);">+dd of=bottom.rom bs=1M if=build/coreboot.rom count=8</span><br><span style="color: hsl(120, 100%, 40%);">+```</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+That gives one ROM for each flash IC, where *top.rom* is the upper part of the</span><br><span style="color: hsl(120, 100%, 40%);">+flash image, that resides on the 4 MiB flash and *bottom.rom* is the lower part</span><br><span style="color: hsl(120, 100%, 40%);">+of the flash image, that resides on the 8 MiB flash.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Dumping a full ROM</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+If you flash externally you need to read both flash chips to get two images</span><br><span style="color: hsl(120, 100%, 40%);">+(one for the 8MiB and one for the 4 MiB flash IC), and then run the following</span><br><span style="color: hsl(120, 100%, 40%);">+command to concatenate the files:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+```bash</span><br><span style="color: hsl(120, 100%, 40%);">+cat bottom.rom top.rom > firmware.rom</span><br><span style="color: hsl(120, 100%, 40%);">+```</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Flash layout</span><br><span style="color: hsl(120, 100%, 40%);">+There's one 8MiB and one 4 MiB flash which contains IFD, GBE, ME and</span><br><span style="color: hsl(120, 100%, 40%);">+BIOS region. These two flash ICs appear as a single 12MiB when flashing</span><br><span style="color: hsl(120, 100%, 40%);">+internally.</span><br><span style="color: hsl(120, 100%, 40%);">+On Lenovo's UEFI the EC firmware update is placed at the start of the BIOS</span><br><span style="color: hsl(120, 100%, 40%);">+region. The update is then written into the EC once.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+![][fl]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[fl]: flashlayout_xx30.svg</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/27852">change 27852</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/27852"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Ia833e27f4e7d89ee32be9bed21a0c021839facec </div>
<div style="display:none"> Gerrit-Change-Number: 27852 </div>
<div style="display:none"> Gerrit-PatchSet: 11 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <siro@das-labor.org> </div>
<div style="display:none"> Gerrit-Reviewer: Alexander Couzens <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: Angel Pons <th3fanbus@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Arthur Heymans <arthur@aheymans.xyz> </div>
<div style="display:none"> Gerrit-Reviewer: Felix Held <felix-coreboot@felixheld.de> </div>
<div style="display:none"> Gerrit-Reviewer: Nico Huber <nico.h@gmx.de> </div>
<div style="display:none"> Gerrit-Reviewer: Patrick Rudolph <patrick.rudolph@9elements.com> </div>
<div style="display:none"> Gerrit-Reviewer: Patrick Rudolph <siro@das-labor.org> </div>
<div style="display:none"> Gerrit-Reviewer: Paul Menzel <paulepanter@users.sourceforge.net> </div>
<div style="display:none"> Gerrit-Reviewer: Philipp Deppenwiese <zaolin.daisuki@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: build bot (Jenkins) <no-reply@coreboot.org> </div>
<div style="display:none"> Gerrit-CC: Evgeny Zinoviev <me@ch1p.com> </div>
<div style="display:none"> Gerrit-CC: Martin Roth <martinroth@google.com> </div>
<div style="display:none"> Gerrit-CC: Patrick Georgi <pgeorgi@google.com> </div>