From 888fdc31c7bf497255eb2ba5918a2e234ab4329f Mon Sep 17 00:00:00 2001 From: sergio Date: Thu, 30 Jul 2026 03:04:03 -0400 Subject: [PATCH] =?UTF-8?q?firmware:=20SOF=20para=20TigerLake=20=E2=80=94?= =?UTF-8?q?=20el=20DSP=20de=20audio,=20pineado=20como=20el=20de=20i915?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El kernel ya traía el driver (SND_SOC_SOF_TIGERLAKE); faltaban los blobs, y sin ellos SOF carga y falla: en el laptop no hay sonido aunque ALSA esté. Mismo patrón que i915 con su DMC/GuC — driver desde fuente, firmware pineado por contenido, porque Intel no libera el código y la soberanía build-from-source no aplica a datos fijos. Tres piezas, cada una por un motivo distinto: - `sof-tgl.ri` + `sof-tgl-h.ri`: el firmware del DSP. Se copian LOS DOS porque el driver elige según el SKU y no quiero hornear la suposición. **`cp -L` es obligatorio**: en linux-firmware son SYMLINKS a `intel-signed/`, y un symlink relativo copiado a otro árbol apunta a la nada. Verificado: los tres quedan ficheros reales (525K/447K/95K). - `sof-tgl.ldc`: el diccionario de logs del DSP. No es opcional en la práctica — el driver lo pide al inicializar y sin él el firmware arranca SIN TRAZA, o sea que el día que algo falle no hay por dónde mirar. - 47 topologías (`sof-hda-generic-*`, `sof-tgl-*`): describen el grafo de audio. El driver pide UNA por nombre derivado de la máquina, y no se puede saber cuál sin el hardware delante. Copiar de más cuesta megas; copiar de menos cuesta un viaje físico al laptop para descubrir qué nombre pidió. ~3 MB en total. Si no hay SOF en el origen, AVISA y NO falla: el audio del laptop se pierde pero la imagen sigue booteando y en QEMU suena por HDA legacy — fallar bloquearía builds que no necesitan SOF. Verificado que no hay regresión: con los blobs en la imagen, el audio de la VM sigue funcionando por la ruta HDA (48. HDA Intel [alsa], sink y source reales) y cero page-flips fallidos. **El camino SOF en sí queda SIN VALIDAR hasta el próximo viaje al metal** — en QEMU no se ejerce, y eso está escrito en la receta del kernel en vez de dado por bueno. De paso, la cabecera del script deja de mentir: se llama «firmware» y no «wifi» porque copia las TRES familias de blobs que el metal necesita (iwlwifi, i915, SOF). Co-Authored-By: Claude Opus 5 (1M context) --- recipes/linux-metal.toml | 9 +++++---- scripts/metal-firmware.sh | 42 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/recipes/linux-metal.toml b/recipes/linux-metal.toml index b0a3197a..50b06de9 100644 --- a/recipes/linux-metal.toml +++ b/recipes/linux-metal.toml @@ -26,10 +26,11 @@ # · SND_USB_AUDIO — auriculares y micrófonos USB, que es como la mayoría de la gente escucha. # `SND_DYNAMIC_MINORS` porque con varias tarjetas (HDA + HDMI + USB) los minors fijos se agotan. # -# ⚠ FALTA EL FIRMWARE DE SOF en la imagen. El kernel trae el driver; los blobs -# (`intel/sof/sof-tgl.ri`, `intel/sof-tplg/*.tplg`) los tiene que inyectar `metal-firmware.sh`, igual -# que hace con los `tgl_*` de i915. Sin ellos SOF carga y falla, y en el laptop no habrá sonido -# aunque el driver esté. En QEMU no importa: ahí manda la ruta HDA legacy. +# El FIRMWARE de SOF ya lo inyecta `metal-firmware.sh` (2026-07-30): `sof-tgl.ri` + `sof-tgl-h.ri` +# (los dos, porque el driver elige por SKU) + `sof-tgl.ldc` (el diccionario de logs: sin él el DSP +# arranca sin traza) + 47 topologías `sof-hda-generic-*`/`sof-tgl-*`, ~3 MB. Mismo patrón que i915 con +# su DMC/GuC: driver de fuente, firmware pineado por contenido. En QEMU no se ejerce — ahí manda la +# ruta HDA legacy— así que el camino SOF **queda sin validar hasta el próximo viaje al metal**. # # PERFIL ESCRITORIO/JUEGO (plan-jaula-juegos T1 + joyas-reusables #1/#4, 2026-07-16): # - NTSYNC: primitivas de sincronización NT en kernel (wine/proton moderno, reemplaza esync/fsync). diff --git a/scripts/metal-firmware.sh b/scripts/metal-firmware.sh index 54e27044..48fb04b1 100755 --- a/scripts/metal-firmware.sh +++ b/scripts/metal-firmware.sh @@ -9,6 +9,10 @@ # Target: Intel Wi-Fi 6 AX201 [8086:a0f0] en TigerLake ⇒ familias QuZ-a0-hr-b0 + cc-a0 (el driver elige # la API más alta que soporta) + regulatory.db(+.p7s) que cfg80211 verifica con la clave built-in. # +# Copia además el firmware de i915 (DMC/GuC/HuC) y el de SOF (el DSP de audio de TigerLake). El nombre +# del script dice «firmware» y no «wifi» a propósito: son las tres familias de blobs que el metal +# necesita y ninguna se construye desde fuente. +# # Uso: scripts/metal-firmware.sh # Vars: FWSRC dir origen del firmware (default /lib/firmware del host) # @@ -55,6 +59,44 @@ for src in "$FWSRC"/i915/tgl_*.bin "$FWSRC"/i915/tgl_*.bin.zst; do n=$((n+1)) done +# SOF (Sound Open Firmware) para TigerLake. Intel movió el audio de TGL al DSP: el kernel trae el +# driver (`SND_SOC_SOF_TIGERLAKE`, encendido en linux-metal) pero **sin estos blobs carga y falla**, y en +# el laptop no hay sonido aunque ALSA esté. En QEMU no importa: ahí manda la ruta HDA legacy. +# Es el mismo patrón que i915 con su DMC/GuC — driver de fuente, firmware pineado por contenido. +# +# Tres piezas, y las tres hacen falta por motivos distintos: +# · sof-tgl.ri / sof-tgl-h.ri el firmware del DSP (LP y H). Se copian los DOS porque el driver +# elige según el SKU y no queremos hornear la suposición. **`cp -L`**: en linux-firmware son +# SYMLINKS a `intel-signed/`, y un symlink relativo copiado a otro árbol apunta a la nada. +# · sof-tgl.ldc el diccionario de logs del DSP. No es opcional en la práctica: el driver lo pide al +# inicializar y, si falta, el firmware arranca sin traza — o sea que el día que algo falle no hay +# por dónde mirar. 95 KB. +# · sof-tplg/*.tplg las TOPOLOGÍAS: describen el grafo de audio (qué DAI, cuántos canales, qué +# códec). El driver pide UNA por nombre, derivado de la máquina, y no se puede saber cuál sin el +# hardware delante. Se copian las `sof-hda-generic-*` (el caso HDA sobre SOF, que es el del target) +# y las `sof-tgl-*` — ~2 MB en total. Copiar de más cuesta megas; copiar de menos cuesta un viaje +# físico al laptop para descubrir qué nombre pidió. +mkdir -p "$OUT/intel/sof" "$OUT/intel/sof-tplg" +for src in "$FWSRC"/intel/sof/sof-tgl.ri "$FWSRC"/intel/sof/sof-tgl-h.ri "$FWSRC"/intel/sof/sof-tgl.ldc; do + [ -e "$src" ] || continue + cp -L "$src" "$OUT/intel/sof/$(basename "$src")" + n=$((n+1)) +done +for src in "$FWSRC"/intel/sof-tplg/sof-hda-generic-*.tplg "$FWSRC"/intel/sof-tplg/sof-tgl-*.tplg; do + [ -e "$src" ] || continue + cp -L "$src" "$OUT/intel/sof-tplg/$(basename "$src")" + n=$((n+1)) +done +sof_ri=$(ls "$OUT"/intel/sof/*.ri 2>/dev/null | wc -l) +sof_tplg=$(ls "$OUT"/intel/sof-tplg/*.tplg 2>/dev/null | wc -l) +if [ "$sof_ri" -eq 0 ]; then + # Aviso y NO error: el audio del laptop se pierde, pero la imagen sigue booteando y en QEMU suena por + # HDA legacy. Fallar acá bloquearía builds que no necesitan SOF. + echo "metal-firmware: ⚠ SIN firmware SOF en $FWSRC/intel/sof — el laptop TigerLake no tendrá audio" >&2 +else + echo "metal-firmware: SOF = $sof_ri .ri + $sof_tplg topologías" +fi + [ "$n" -gt 0 ] || { echo "metal-firmware: NO encontré firmware AX201 en $FWSRC" >&2; exit 1; } echo "metal-firmware: $n blobs → $OUT" ls "$OUT" | sed 's/^/ /'