Skip to content

Commit 4fea838

Browse files
committed
boards: dell-optiplex-9020-sff: switch to downloadable ME and add CircleCI entry
Per PR review feedback (#2152): 1. Ship IFD and GbE blobs in-tree (anonymized MAC 00:de:ad:c0:ff:ee), replacing per-user BIOS extraction as the default path. 2. Add download-clean-me script that downloads the public Lenovo installer glrg22ww.exe (same source as t440p, since ME firmware is platform-generic for Lynx Point) and runs me_cleaner -r -t with a pinned ME_BIN_HASH verify step. 3. Add CircleCI build job for dell-optiplex-9020-sff as a non-seeding 25.09 board modeled on t440p (depends on the coreboot-25.09 seed). 4. Regenerate hashes.txt against the new in-tree ifd.bin/gbe.bin. 5. Update README and board config to document the new blob flow. The extract script is retained as a fallback path for users who want to preserve their original LAN MAC via their own Dell BIOS backup. Signed-off-by: Michael Gogiashvili <gogiaschvili@protonmail.com>
1 parent 41de8eb commit 4fea838

8 files changed

Lines changed: 143 additions & 36 deletions

File tree

.circleci/config.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,13 @@ workflows:
528528
- x86-musl-cross-make [cross compiler]
529529

530530
# ── coreboot 25.09 boards (alphabetical) ───────────────────────────────
531+
- build:
532+
name: dell-optiplex-9020-sff
533+
target: dell-optiplex-9020-sff
534+
subcommand: ""
535+
requires:
536+
- EOL_t480-hotp-maximized [seed:coreboot-25.09]
537+
531538
- build:
532539
name: EOL_m900_tower-hotp-maximized
533540
target: EOL_m900_tower-hotp-maximized

blobs/optiplex_9020/.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# me.bin is downloaded and neutralized on demand by download-clean-me.
2+
# original_dell_bios.bin is the user's private BIOS backup (if they use the
3+
# extract script instead). Neither should be committed.
4+
me.bin
5+
original_dell_bios.bin

blobs/optiplex_9020/README.md

Lines changed: 48 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,54 +2,72 @@
22

33
- [Overview](#overview)
44
- [Blob Strategy](#blob-strategy)
5+
- [Building with Default Blobs](#building-with-default-blobs)
56
- [Using Your Own Blobs](#using-your-own-blobs)
67

78
## Overview
89

9-
Heads on the Dell OptiPlex 9020 SFF requires three small binary blobs, all
10-
extracted from the user's own Dell BIOS backup. **No proprietary code blobs
11-
are downloaded from third parties** — everything comes from your hardware.
10+
Heads on the Dell OptiPlex 9020 SFF requires three small binary blobs:
1211

13-
| Blob | Size | What it is |
14-
|-----------|----------|-----------------------------------------------------------|
15-
| `ifd.bin` | 4 KB | Intel Flash Descriptor (resized: ME shrunk, BIOS grown) |
16-
| `me.bin` | ~120 KB | Intel ME, **neutralized + soft-disabled** via me_cleaner |
17-
| `gbe.bin` | 16 KB | Intel Gigabit Ethernet config (incl. LAN MAC address) |
12+
| Blob | Size | Source |
13+
|-----------|----------|----------------------------------------------------------|
14+
| `ifd.bin` | 4 KB | Intel Flash Descriptor, shipped in-tree (anonymized) |
15+
| `me.bin` | ~120 KB | Intel ME, downloaded and neutralized by `download-clean-me` |
16+
| `gbe.bin` | 8 KB | Intel Gigabit Ethernet config, shipped in-tree (anonymized MAC) |
1817

19-
**Notably NOT required** (this is the blob-minimized setup):
18+
`ifd.bin` and `gbe.bin` are committed to the repository directly. They contain
19+
no personal data: the GbE MAC is set to the anonymized `00:de:ad:c0:ff:ee`,
20+
matching the convention used by other Heads boards. The IFD has its ME region
21+
shrunk and BIOS region expanded, ready for a neutralized ME.
2022

21-
- `mrc.bin`**eliminated**. Haswell native RAM initialization (NRI) is used
22-
instead, via coreboot's `CONFIG_USE_NATIVE_RAMINIT=y`. No proprietary
23-
memory-init blob.
24-
- FSP — Haswell does not use Intel Firmware Support Package.
25-
- Intel ME in full — only the ~120 KB FTPR bring-up module remains; all AMT,
26-
networking, anti-theft and backdoor modules removed.
23+
`me.bin` is the only blob that is **not** committed (it is proprietary Intel
24+
firmware). It is downloaded on demand from the public Lenovo installer
25+
`glrg22ww.exe` -- the same source used by the t440p -- because the ME firmware
26+
is platform-generic for Lynx Point, not vendor-specific.
2727

2828
## Blob Strategy
2929

30-
The Intel ME on the 9020 (Lynx Point, ME 9.x) is **neutralized and
31-
soft-disabled** using [me_cleaner](https://github.com/corna/me_cleaner)
32-
with the flags `-S -r -t -d`:
30+
The Intel ME on the 9020 (Lynx Point, ME 9.x) is **neutralized and shrunk**
31+
using [me_cleaner](https://github.com/corna/me_cleaner) with the flags
32+
`-r -t`:
3333

34-
- `-S` sets the AltMeDisable bit (HAP) in PCHSTRP10 → ME disabled after boot
3534
- `-r` removes non-essential ME modules (TDT, FPF, HOSTCOMM, SESSMGR, ...)
3635
- `-t` truncates the ME region to the minimum bootable size (~120 KB)
37-
- `-d` additionally deactivates ME features
3836

39-
Result: ME shrunk from 6 MB → ~120 KB, **98% reduction**. The remaining FTPR
40-
module is required for power/clock management during boot; it cannot be
41-
removed without bricking the board. The ME's RSA signature remains valid
42-
(verified by me_cleaner), so the board boots.
37+
Result: ME shrunk from 5 MB to ~120 KB. The remaining FTPR module is required
38+
for power/clock management during boot; it cannot be removed without bricking
39+
the board. The ME's RSA signature remains valid (verified by me_cleaner), so
40+
the board boots.
41+
42+
**Notably NOT required** (this is the blob-minimized setup):
43+
44+
- `mrc.bin` -- eliminated. Haswell native RAM initialization (NRI) is used
45+
instead, via coreboot's `CONFIG_USE_NATIVE_RAMINIT=y`.
46+
- FSP -- Haswell does not use Intel Firmware Support Package.
47+
- Intel ME in full -- only the ~120 KB FTPR bring-up module remains; all AMT,
48+
networking, anti-theft and backdoor modules removed.
4349

4450
> **Note on "completely removing" the ME:** The ME is physically present in
4551
> the Lynx Point PCH silicon. Software cannot remove hardware. me_cleaner's
4652
> neutralization is the maximum achievable on this platform.
4753
54+
## Building with Default Blobs
55+
56+
The standard build path downloads and neutralizes the ME automatically:
57+
58+
```console
59+
$ make BOARD=dell-optiplex-9020-sff
60+
```
61+
62+
The build system invokes `download-clean-me` to fetch the Lenovo installer,
63+
extract `ME9.1_5M_Production.bin`, and run me_cleaner. No manual steps
64+
required.
65+
4866
## Using Your Own Blobs
4967

50-
If you have a different Dell 9020 SFF (or want to re-extract from a fresh
51-
backup), first build Heads at least once to download the coreboot sources,
52-
then run the extraction script:
68+
If you prefer to extract the blobs from your own Dell BIOS backup (for
69+
example, to preserve your original LAN MAC address), build Heads once to
70+
download the coreboot sources, then run the extraction script:
5371

5472
```console
5573
$ make BOARD=dell-optiplex-9020-sff # downloads coreboot sources
@@ -60,6 +78,6 @@ $ ./blobs/optiplex_9020/extract /path/to/original_dell_bios.bin ./blobs/optiplex
6078
$ make BOARD=dell-optiplex-9020-sff # rebuild with your blobs
6179
```
6280

63-
The extraction script performs the same operations that produced the blobs
64-
shipped here. Your MAC address will differ; if you want anonymity, override
65-
it to `00:de:ad:c0:ff:ee` using [nvmutil](https://libreboot.org/docs/install/nvmutil.html).
81+
The extraction script performs a more aggressive neutralization
82+
(`me_cleaner -S -r -t -d`, including soft-disable via the AltMeDisable/HAP
83+
bit) and preserves your hardware's original MAC address.
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#!/usr/bin/env bash
2+
# =============================================================================
3+
# Download Intel ME firmware for the Dell OptiPlex 9020 SFF, neutralize it,
4+
# and shrink it to the minimum bootable size.
5+
#
6+
# The 9020 SFF is a Haswell + Lynx Point platform (Intel ME 9.1). It shares
7+
# the same ME firmware generation as the ThinkPad T440p, so this script
8+
# reuses the publicly available Lenovo installer (glrg22ww.exe) as the ME
9+
# source. The ME firmware is platform-generic for Lynx Point, not
10+
# vendor-specific.
11+
#
12+
# Usage: ./download-clean-me <path_to_output_directory>
13+
#
14+
# Requires COREBOOT_DIR pointing at a built coreboot source tree (for
15+
# util/me_cleaner) and the innoextract tool.
16+
# =============================================================================
17+
set -e
18+
19+
function usage() {
20+
echo -n \
21+
"Usage: $(basename "$0") path_to_output_directory
22+
Download Intel ME firmware from Lenovo, neutralize, and shrink.
23+
"
24+
}
25+
26+
# Expected SHA256 of the resulting neutralized me.bin.
27+
# Sourced from the Lenovo glrg22ww.exe installer (same as the t440p).
28+
ME_BIN_HASH="b7cf4c0cf514bbf279d9fddb12c34fca5c1c23e94b000c26275369b924ab9c25"
29+
30+
if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
31+
if [[ "${1:-}" == "--help" ]]; then
32+
usage
33+
else
34+
if [[ -z "${COREBOOT_DIR}" ]]; then
35+
echo "ERROR: No COREBOOT_DIR variable defined."
36+
exit 1
37+
fi
38+
39+
output_dir="$(realpath "${1:-./}")"
40+
41+
if [[ ! -f "${output_dir}/me.bin" ]]; then
42+
# Unpack Lenovo's Windows installer into a temporary directory and
43+
# extract the Intel ME blob.
44+
pushd "$(mktemp -d)"
45+
46+
curl -O https://download.lenovo.com/pccbbs/mobiles/glrg22ww.exe
47+
innoextract glrg22ww.exe
48+
49+
mv app/ME9.1_5M_Production.bin "${COREBOOT_DIR}/util/me_cleaner"
50+
51+
popd
52+
53+
# Neutralize and shrink Intel ME. Note that this doesn't include
54+
# --soft-disable to set the "ME Disable" or "ME Disable B" (e.g.,
55+
# High Assurance Program) bits, as they are defined within the Flash
56+
# Descriptor.
57+
# https://github.com/corna/me_cleaner/wiki/External-flashing#neutralize-and-shrink-intel-me-useful-only-for-coreboot
58+
pushd "${COREBOOT_DIR}/util/me_cleaner"
59+
60+
python me_cleaner.py -r -t -O me_shrinked.bin ME9.1_5M_Production.bin
61+
62+
mv me_shrinked.bin "${output_dir}/me.bin"
63+
rm ./*.bin
64+
65+
popd
66+
fi
67+
68+
if ! echo "${ME_BIN_HASH} ${output_dir}/me.bin" | sha256sum --check; then
69+
echo "ERROR: SHA256 checksum for me.bin doesn't match."
70+
exit 1
71+
fi
72+
fi
73+
fi

blobs/optiplex_9020/gbe.bin

8 KB
Binary file not shown.

blobs/optiplex_9020/hashes.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
4bbe2955e5b417fda53b29da8a864ae726de79af2629991ead1ee24536d6de1a ifd.bin
2+
fa6baa411b46272b7398940d7edf2864742b94967205f9dea15f8772b766acc3 gbe.bin

blobs/optiplex_9020/ifd.bin

4 KB
Binary file not shown.

boards/dell-optiplex-9020-sff/dell-optiplex-9020-sff.config

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,20 @@ CONFIG_COREBOOT_CONFIG=config/coreboot-dell-optiplex-9020-sff.config
4848
CONFIG_LINUX_CONFIG=config/linux-t440p.config
4949

5050
# --- Blob handling -----------------------------------------------------------
51-
# The Coreboot build depends on the three blobs extracted from the Dell BIOS
52-
# backup: ifd.bin (resized descriptor), me.bin (neutralized ME), gbe.bin.
51+
# The Coreboot build depends on the three blobs: ifd.bin (resized descriptor),
52+
# me.bin (neutralized ME), gbe.bin. ifd.bin and gbe.bin are shipped in-tree
53+
# (anonymized, no personal data). me.bin is downloaded and neutralized on
54+
# demand from the Lenovo installer, the same source used by the t440p (the ME
55+
# firmware is platform-generic for Lynx Point, not vendor-specific).
5356
$(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \
5457
$(pwd)/blobs/optiplex_9020/ifd.bin \
5558
$(pwd)/blobs/optiplex_9020/me.bin \
5659
$(pwd)/blobs/optiplex_9020/gbe.bin
5760

58-
# When the blobs are missing, run the extract script to pull IFD/ME/GbE out
59-
# of the original Dell BIOS backup and neutralize the ME.
60-
$(pwd)/blobs/optiplex_9020/ifd.bin $(pwd)/blobs/optiplex_9020/me.bin $(pwd)/blobs/optiplex_9020/gbe.bin:
61+
# When me.bin is missing, download and neutralize it from the Lenovo installer.
62+
$(pwd)/blobs/optiplex_9020/me.bin:
6163
COREBOOT_DIR="$(build)/$(coreboot_base_dir)" \
62-
$(pwd)/blobs/optiplex_9020/extract "$(pwd)/blobs/optiplex_9020/original_dell_bios.bin" "$(pwd)/blobs/optiplex_9020"
64+
$(pwd)/blobs/optiplex_9020/download-clean-me $(pwd)/blobs/optiplex_9020
6365

6466
# --- Modules packed into tools.cpio ------------------------------------------
6567
CONFIG_CRYPTSETUP2=y

0 commit comments

Comments
 (0)