gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 815Rust 56Shell 37Markdown 291229 Definiciones

⎇ b53d91edfadc953291e76e7d53e58a99b162f2da recipes/firmware-tigerlake.toml TOML · 129 líneas · 7.5 KB Historia crudo

busybox sale de las 24 build-deps: ya no viaja en NINGUNA imagen b53d91edf · Sergio ·

1# firmware-tigerlake — los blobs que pide EXACTAMENTE la laptop del usuario, y nada más.
2#
3# ══ QUÉ MÁQUINA ES ═════════════════════════════════════════════════════════════════════════════
4# Medido el 2026-09-16 sobre el metal real (`lspci -nn` + `lsmod`):
5#
6#   00:02.0  Intel TigerLake-LP GT2 [Iris Xe Graphics]  [8086:9a49]   ⇒ i915 / xe
7#   00:14.3  Intel Wi-Fi 6 AX201                        [8086:a0f0]   ⇒ iwlwifi
8#   00:1f.3  Intel 500 Series On-Package HD Audio       [8086:a0c8]   ⇒ snd_sof_pci_intel_tgl
9#
10# Es la misma máquina para la que ya se escribió `scripts/metal-firmware.sh`, que nombra estas tres
11# familias y dice por qué: «son las tres familias de blobs que el metal necesita y ninguna se
12# construye desde fuente». Esta receta es ese script convertido en artefacto sellado, con el
13# firmware viniendo de `linux-firmware` pineado en vez de `/lib/firmware` del host.
14#
15# ══ POR QUÉ DERIVADA Y NO UN SEGUNDO FETCH ═════════════════════════════════════════════════════
16# El árbol completo son ~2 GB extraídos. Esta máquina usa unos 25 MB de eso. Derivar de
17# `linux-firmware` cuesta segundos y no mueve su hash, igual que `atuq` sobre `firefox` (SDD 26).
18# Otro metal = otra receta derivada de dos líneas, no otro tarball de 648 MB.
19#
20# ══ SIN COMPRIMIR, A PROPÓSITO ═════════════════════════════════════════════════════════════════
21# Los blobs se instalan planos (`.ucode`, `.bin`, `.ri`), no `.zst`. El kernel `linux-metal` **no
22# habilita `FW_LOADER_COMPRESS`**, así que un firmware comprimido no se carga y el fallo aparece
23# como «no WiFi» sin una línea que lo explique. Es la razón que ya está escrita en
24# `metal-firmware.sh` y se repite acá porque es justo el tipo de cosa que se pierde al refactorizar.
25#
26# ⚠ **PUNTO DE PARTIDA, NO SELLADA.** Escrita desde el laptop, que no tiene lab ni store. Las
27# aserciones de abajo están puestas para que el PRIMER BUILD falle ruidoso en vez de producir un
28# artefacto flaco: un /lib/firmware a medias no falla al construir, falla meses después en el metal
29# como «no hay WiFi» y nadie lo asocia con esta receta.
30name    = "firmware-tigerlake"
31version = "20260910"          # sigue a linux-firmware: no tiene versión propia
32license = "LicenseRef-linux-firmware-various"
33
34[source]
35# No tiene fuente propia: todo su contenido sale de la dep. Se apunta al árbol vacío del repo por
36# la misma razón que `atuq` usa `source.dir` — la identidad del artefacto son sus fases + su dep,
37# y el `ArtifactHash` ya las incluye.
38dir = "firmware-tigerlake"
39
40[build]
41compiler = "zig-cc"
42target   = "x86_64-linux-musl"
43link     = "static"
44strip_debug = false
45flags    = []
46
47[build.phases]
48configure = "echo 'firmware-tigerlake: nada que configurar'"
49compile   = "echo 'firmware-tigerlake: nada que compilar — son blobs de la dep'"
50install = '''
51set -e
52SRC=/lib/firmware
53DST=/out/lib/firmware
54
55# ── LAS ASERCIONES VAN PRIMERO (CLAUDE.md §3) ────────────────────────────────────────────────
56# Un derivado que no encuentra su base produciría un /lib/firmware con cuatro ficheros, `Store::has`
57# lo daría por presente, y el fallo saldría el día del arranque en metal como «no hay WiFi».
58[ -d "$SRC" ] || { echo "firmware-tigerlake: no está el árbol de linux-firmware en $SRC" >&2; exit 1; }
59[ -f "$SRC/WHENCE" ] || { echo "firmware-tigerlake: falta WHENCE — la dep no se materializó entera" >&2; exit 1; }
60
61mkdir -p "$DST/intel/iwlwifi" "$DST/i915" "$DST/intel/sof" "$DST/intel/sof-tplg"
62
63# ── 1. WiFi: Intel AX201 ─────────────────────────────────────────────────────────────────────
64# El driver elige la API MÁS ALTA que soporta, así que se copian TODAS las revisiones de las dos
65# familias y no sólo la última: qué número pide depende del kernel, no de nosotros.
66# Upstream movió los .ucode a intel/iwlwifi/ y dejó symlinks en la raíz; se cubren los dos sitios.
67wifi=0
68for pat in "iwlwifi-QuZ-a0-hr-b0-*.ucode" "iwlwifi-cc-a0-*.ucode"; do
69  for d in "$SRC/intel/iwlwifi" "$SRC"; do
70    for f in "$d"/$pat; do
71      [ -f "$f" ] || continue
72      cp -L "$f" "$DST/intel/iwlwifi/" && wifi=$((wifi+1))
73    done
74  done
75done
76# El driver busca en /lib/firmware antes que en intel/iwlwifi ⇒ se dejan los dos caminos.
77for f in "$DST"/intel/iwlwifi/*.ucode; do
78  [ -f "$f" ] && cp -L "$f" "$DST/" || true
79done
80[ "$wifi" -gt 0 ] || { echo "firmware-tigerlake: 0 blobs de iwlwifi — el AX201 no va a asociar" >&2; exit 1; }
81
82# regulatory.db: cfg80211 lo verifica contra la clave built-in del kernel. Sin él el WiFi queda
83# limitado al dominio world y en la práctica no ve la mitad de los canales.
84for f in regulatory.db regulatory.db.p7s; do
85  [ -f "$SRC/$f" ] && cp -L "$SRC/$f" "$DST/"
86done
87[ -f "$DST/regulatory.db" ] || { echo "firmware-tigerlake: falta regulatory.db" >&2; exit 1; }
88
89# ── 2. Gráficos: i915 / xe en TigerLake ──────────────────────────────────────────────────────
90# DMC = display microcontroller (sin él no hay ahorro de energía del display ni, en algunos
91# kernels, modeset fiable). GuC/HuC = submission y decodificación por hardware.
92gfx=0
93for f in "$SRC"/i915/tgl_*.bin; do
94  [ -f "$f" ] || continue
95  cp -L "$f" "$DST/i915/" && gfx=$((gfx+1))
96done
97[ "$gfx" -gt 0 ] || { echo "firmware-tigerlake: 0 blobs de i915 tgl — el display va a ir sin DMC" >&2; exit 1; }
98
99# ── 3. Audio: SOF en el DSP de TigerLake ─────────────────────────────────────────────────────
100# El SOF **no viene en linux-firmware** — se midió sobre el tarball (0 coincidencias con
101# `intel/sof`) y por eso existe `recipes/sof-firmware.toml`, que es dep de esta receta. Acá sólo se
102# recoge lo que aquélla ya dejó en su sitio: es la misma jugada que con la dep de linux-firmware.
103snd=0
104if [ -d "$SRC/intel/sof" ]; then
105  mkdir -p "$DST/intel/sof/intel-signed"
106  for f in "$SRC"/intel/sof/intel-signed/sof-tgl*.ri; do
107    [ -f "$f" ] || continue
108    cp "$f" "$DST/intel/sof/intel-signed/"
109    ln -sf "intel-signed/$(basename "$f")" "$DST/intel/sof/$(basename "$f")"
110    snd=$((snd+1))
111  done
112fi
113if [ -d "$SRC/intel/sof-tplg" ]; then
114  for f in "$SRC"/intel/sof-tplg/sof-hda-generic*.tplg; do
115    [ -f "$f" ] && cp -L "$f" "$DST/intel/sof-tplg/" && snd=$((snd+1))
116  done
117fi
118[ "$snd" -gt 0 ] || { echo "firmware-tigerlake: 0 blobs de SOF — ¿se materializó la dep sof-firmware?" >&2; exit 1; }
119
120n=$(find "$DST" -type f | wc -l)
121echo "firmware-tigerlake: $n ficheros (wifi=$wifi i915=$gfx sof=$snd)"
122'''
123
124[deps]
125# `wireless-regdb` entró el 2026-09-17: `regulatory.db` **ya no viene en linux-firmware** —upstream
126# lo sacó, es un proyecto aparte de kernel.org— y esta receta cortaba con «falta regulatory.db».
127# Como las deps se materializan en el mismo `/lib/firmware`, el bucle de copia lo encuentra sin
128# tocar una línea del guion.
129build = ["linux-firmware", "sof-firmware", "wireless-regdb"]