tawasuyu

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 1574Shell 204Rust 111Markdown 993763 Definitions

⎇ e263b66ec1149b4c0541b044836e4030e9773aa4 scripts/metal-firmware.sh Shell · 60 lines · 2.6 KB History raw

Etapa metal: habilita DRM_I915 + firmware (panel TigerLake se apaga sin él) ff17454a4 · sergio ·

1#!/usr/bin/env sh
2# metal-firmware.sh — inyecta el firmware del WiFi AX201 (y reg.db) en /lib/firmware de un rootfs.
3#
4# El firmware de iwlwifi son BLOBS binarios NO compilables desde fuente (Intel no libera el código); la
5# soberanía de hammer (build-from-source) no aplica acá — son datos fijos como el microcódigo de la CPU.
6# Se fijan por contenido (igual que un tarball pinned): se copian de un linux-firmware ya presente y se
7# descomprimen a .ucode plano (el kernel metal NO habilita FW_LOADER_COMPRESS, así evitamos esa dep).
8#
9# Target: Intel Wi-Fi 6 AX201 [8086:a0f0] en TigerLake ⇒ familias QuZ-a0-hr-b0 + cc-a0 (el driver elige
10# la API más alta que soporta) + regulatory.db(+.p7s) que cfg80211 verifica con la clave built-in.
11#
12# Uso:   scripts/metal-firmware.sh <rootfs-dir>
13# Vars:  FWSRC  dir origen del firmware (default /lib/firmware del host)
14#
15# TODO(soberanía): reemplazar FWSRC=host por un pin a un commit de linux-firmware (recipe fetch+extract).
16set -eu
17
18DST="${1:?uso: metal-firmware.sh <rootfs-dir>}"
19FWSRC="${FWSRC:-/lib/firmware}"
20OUT="$DST/lib/firmware"
21mkdir -p "$OUT"
22
23# patrones de firmware que el AX201 puede pedir (ambas familias, todas las API presentes)
24PATTERNS="iwlwifi-QuZ-a0-hr-b0-*.ucode iwlwifi-cc-a0-*.ucode"
25n=0
26for pat in $PATTERNS; do
27  for src in "$FWSRC"/$pat "$FWSRC"/$pat.zst "$FWSRC"/$pat.xz; do
28    [ -e "$src" ] || continue
29    base=$(basename "$src")
30    case "$base" in
31      *.zst) dst="$OUT/${base%.zst}"; zstd -q -d -f -o "$dst" "$src" ;;
32      *.xz)  dst="$OUT/${base%.xz}";  xz -dc "$src" > "$dst" ;;
33      *)     dst="$OUT/$base";        cp "$src" "$dst" ;;
34    esac
35    n=$((n+1))
36  done
37done
38
39# regulatory db (texto firmado; cfg80211 lo carga vía firmware loader y verifica .p7s con clave built-in)
40for f in regulatory.db regulatory.db.p7s; do
41  if [ -e "$FWSRC/$f" ]; then cp "$FWSRC/$f" "$OUT/$f"; n=$((n+1)); fi
42done
43
44# i915 (panel/GPU TigerLake): DMC (enciende el display tras ExitBootServices) + GuC/HuC. El driver pide
45# versiones EXACTAS por nombre; copiamos TODAS las tgl_* (1.3M) para que encuentre la que su versión usa.
46mkdir -p "$OUT/i915"
47for src in "$FWSRC"/i915/tgl_*.bin "$FWSRC"/i915/tgl_*.bin.zst; do
48  [ -e "$src" ] || continue
49  base=$(basename "$src")
50  case "$base" in
51    *.zst) zstd -q -d -f -o "$OUT/i915/${base%.zst}" "$src" ;;
52    *.xz)  xz -dc "$src" > "$OUT/i915/${base%.xz}" ;;
53    *)     cp "$src" "$OUT/i915/$base" ;;
54  esac
55  n=$((n+1))
56done
57
58[ "$n" -gt 0 ] || { echo "metal-firmware: NO encontré firmware AX201 en $FWSRC" >&2; exit 1; }
59echo "metal-firmware: $n blobs → $OUT"
60ls "$OUT" | sed 's/^/  /'