# 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"]