Files
takana/recipes/sof-firmware.toml
sergioandClaude Opus 5 099226b2d1 firmware del metal: el TODO de soberanía cerrado — los blobs dejan de copiarse del host
`scripts/metal-firmware.sh` llevaba desde que se escribió con este pie:

    TODO(soberanía): reemplazar FWSRC=host por un pin a un commit de linux-firmware

Eso significaba que una imagen de takana para el metal sólo se podía armar desde una
máquina que YA tuviera el firmware instalado por otra distro. Un instalador que sólo se
puede construir desde la distro a la que viene a reemplazar no es un instalador.

Cuatro recetas, y la partición entre ellas es la decisión:

  · linux-firmware  — tarball 20260910 pineado. 648 MB, ~2 GB extraídos. Es una BASE y no
    entra en ningún perfil: nadie manda eso en una imagen de escritorio.
  · firmware-tigerlake — DERIVADA, recorta ~25 MB: las tres familias que este metal pide.
    Es la que viaja. Otro metal = otra derivada de dos líneas, no otro fetch de 648 MB.
    Misma economía que atuq sobre firefox (SDD 26).
  · sof-firmware  — porque el SOF NO viene en linux-firmware. Medido, no supuesto:
        entradas del tarball ... 5323
        intel/sof .............. 0     ✗
        i915/tgl ............... 15    ✓
        iwlwifi ................ 201   ✓
  · intel-ucode   — tampoco viene: trae amd-ucode pero el de Intel lo publica Intel.

Y una contraintuitiva que queda escrita para no re-tropezarla: TigerLake va por IPC3, no
por IPC4. Lo esperable era tomar la serie más alta de sof-bin (v2.14.x); medido, esa serie
no contiene NINGÚN fichero tgl. El firmware de TGL sólo existe en la rama IPC3, y el más
nuevo que lo trae es v2.2.x/sof-v2.2/sof-tgl.ri.

El sha256 de linux-firmware se contrastó contra el sha256sums.asc que kernel.org publica
firmado — no contra el fichero que bajamos, que sería comprobar que un fichero es igual a
sí mismo.

⚠ NINGUNA ESTÁ SELLADA: escritas desde el laptop, que no tiene lab ni store. Las aserciones
de cada `install` están puestas para que el primer build falle ruidoso en vez de producir
un /lib/firmware a medias — que no falla al construir y falla meses después en el metal
como «no hay WiFi», sin una línea que lo asocie con esto (CLAUDE.md §3).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 15:12:08 -04:00

98 lines
5.3 KiB
TOML

# sof-firmware 2025.12.2 — el DSP de audio de Intel. NO viene en linux-firmware, y eso se midió.
#
# ══ POR QUÉ ES UNA RECETA APARTE ═══════════════════════════════════════════════════════════════
# Al escribir `firmware-tigerlake` se anotó como duda si `intel/sof*` venía dentro de
# `linux-firmware`. Se midió sobre el tarball real (`linux-firmware-20260910.tar.xz`, 2026-09-16):
#
# entradas del tarball ......... 5323
# coincidencias con intel/sof .. 0
# i915/tgl ..................... 15 ✓
# iwlwifi ...................... 201 ✓
#
# ⇒ **no viene.** Intel publica el SOF por su cuenta, en `thesofproject/sof-bin`. Sin esta receta
# una imagen de takana en el metal del usuario arranca muda: `snd_sof_pci_intel_tgl` carga, pide
# `intel/sof/sof-tgl.ri`, no lo encuentra y el DSP no levanta. Es un fallo que no se ve en QEMU,
# donde el audio es virtio — por eso no apareció en ninguno de los tres escritorios ya cerrados.
#
# ══ TIGERLAKE VA POR IPC3, NO POR IPC4 — Y LA INTUICIÓN ES LA CONTRARIA ════════════════════════
# IPC4 es el camino nuevo y el default en las plataformas recientes, así que lo esperable sería
# tomar la serie más alta (`v2.14.x`). Medido sobre el tarball de sof-bin: **`sof-ipc4-v2.14.1` no
# contiene NINGÚN fichero `tgl`**. El firmware de TigerLake sólo existe en la rama IPC3, y el más
# nuevo que lo trae es `v2.2.x/sof-v2.2/sof-tgl.ri`. Las topologías van con él: `sof-tplg-v2.2`.
#
# tar -tzf sof-bin.tar.gz | grep "sof-ipc4-v2.14.1" | grep -i tgl ⇒ vacío
# tar -tzf sof-bin.tar.gz | grep -E "/sof-v[0-9.]+/sof-tgl\.ri$" ⇒ v2.1.1, v2.2
#
# Si algún día se sube de serie, esto se re-mide: tomar «la más alta» es exactamente el error que
# esta nota existe para evitar.
#
# ══ intel-signed VS community ══════════════════════════════════════════════════════════════════
# El árbol trae las dos firmas del mismo binario. Se instala **intel-signed**, que es el que la
# Artix del usuario tiene enlazado hoy (`sof-tgl.ri → intel-signed/sof-tgl.ri`) y el único que el
# DSP acepta con secure boot del audio activo. `community` es para DSP desbloqueados.
#
# ⚠ **PUNTO DE PARTIDA, NO SELLADA.** Escrita desde el laptop, sin lab ni store. Primer build en el
# worker.
name = "sof-firmware"
version = "2025.12.2"
license = "BSD-3-Clause" # LICENCE.Intel en la raíz del árbol
[source]
tarball = "https://github.com/thesofproject/sof-bin/archive/refs/tags/v2025.12.2.tar.gz"
# sha256 del tarball bajado el 2026-09-16.
sha256 = "a5fb05464273a2963a35950be72e094c0ed89318a44b3c62cb0c93393436ae3c"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
strip_debug = false # blobs firmados: tocarlos invalida la firma
flags = []
[build.phases]
configure = "echo 'sof-firmware: nada que configurar — son blobs firmados'"
compile = "echo 'sof-firmware: nada que compilar — son blobs firmados'"
# NO se usa el `install.sh` del árbol: hace rsync a `/lib/firmware` del sistema vivo y decide la
# serie por variables de entorno. Acá la serie es una DECISIÓN de la receta y entra en el hash.
install = '''
set -e
FW=v2.2.x/sof-v2.2
TPLG=v2.2.x/sof-tplg-v2.2
DST=/out/lib/firmware/intel
[ -d "$FW" ] || { echo "sof-firmware: no está $FW — ¿cambió el layout de sof-bin?" >&2; exit 1; }
[ -d "$TPLG" ] || { echo "sof-firmware: no está $TPLG" >&2; exit 1; }
mkdir -p "$DST/sof/intel-signed" "$DST/sof-tplg"
# ── firmware del DSP ─────────────────────────────────────────────────────────────────────────
# Sólo las variantes de TigerLake: `sof-tgl.ri` (LP, que es esta laptop) y `sof-tgl-h.ri` (H).
# El árbol entero son ~80 MB de plataformas que este metal no tiene.
n=0
for v in sof-tgl.ri sof-tgl-h.ri; do
if [ -f "$FW/intel-signed/$v" ]; then
cp "$FW/intel-signed/$v" "$DST/sof/intel-signed/$v"
# El driver pide `intel/sof/sof-tgl.ri` a secas; el symlink es el que usa la distro de origen.
ln -sf "intel-signed/$v" "$DST/sof/$v"
n=$((n+1))
fi
done
[ "$n" -gt 0 ] || { echo "sof-firmware: 0 blobs de tgl en $FW/intel-signed" >&2; exit 1; }
# ── topologías ───────────────────────────────────────────────────────────────────────────────
# `sof-hda-generic-*.tplg` es lo que monta el HD Audio on-package del 500 Series. Cuál de las
# variantes (1ch/2ch/4ch, con o sin kwd) elige el driver depende del códec detectado en boot, así
# que van todas las genéricas: son unos pocos KB cada una y elegir a mano sería adivinar.
t=0
for f in "$TPLG"/sof-hda-generic*.tplg; do
[ -f "$f" ] || continue
cp "$f" "$DST/sof-tplg/" && t=$((t+1))
done
[ "$t" -gt 0 ] || { echo "sof-firmware: 0 topologías hda-generic en $TPLG" >&2; exit 1; }
echo "sof-firmware: $n firmware + $t topologías (serie IPC3 v2.2, TigerLake)"
'''
[deps]
build = ["busybox"]