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

mirada-usb: modo hardware nouveau para GTX 1060 (Pascal/GP106)

- Hornea firmware nvidia/gp106 (ctxsw/acr/sec2) descomprimido a .bin (nouveau da GL 3D).
- init: modo HARDWARE por defecto (WGPU_BACKEND=gl sobre gallium-nouveau, que da float16
  vía unpackHalf2x16; tapa lavapipe). Pascal no tiene NVK ⇒ greeter va por GL, no Vulkan.
- cmdline default = hardware; 'mirada.sw nouveau.modeset=0' = fallback software.
- CHIP/FW_SRC parametrizables para otras GPUs.

Regresión: el fallback software sigue levantando el compositor en la imagen final.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

cf2e8bf44dda9b1b3e679dae2cc104d4833d4c85 · por sergio · (hace 3 meses) · padre c82588ced · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

2 archivos · +49 −14

diff --git a/docs/mirada-usb-nvidia.md b/docs/mirada-usb-nvidia.md
index e044eaa5..09b8636e 100644
--- a/docs/mirada-usb-nvidia.md
+++ b/docs/mirada-usb-nvidia.md
@@ -34,20 +34,29 @@ imagen viene de Alpine (deuda de soberanía: falta `recipes/{llvm,mesa-llvmpipe,
 de shaders **float16** (`SHADER_FLOAT16_IN_FLOAT32`, `unpack2x16float`) que **llvmpipe y lavapipe NO
 proveen** — sólo una **GPU real**. Por eso el login sólo se pinta con hardware.
 
-## Los dos modos (cmdline)
+## Target actual: GTX 1060 (Pascal / GP106)
 
-- **Por defecto (`mirada.sw nouveau.modeset=0`)** → SOFTWARE. Garantiza que el **compositor** se ve en
-  la pantalla de la NVIDIA en el primer boot, sin driver ni firmware. El greeter no completa (float16).
-- **Hardware nouveau** → en el menú, `e`, **quitá `mirada.sw nouveau.modeset=0`**. nouveau intentará
-  manejar la GPU y mesa usará `nouveau_dri.so` (GL) → el greeter con float16 real debería pintar.
-  **Requiere firmware GSP** de la GPU en `/lib/firmware/nvidia/<chip>/gsp/*.bin` (Turing/RTX en adelante).
+Pascal **no** usa GSP (eso es Turing+). La imagen hornea el firmware de aceleración `nvidia/gp106/`
+(ctxsw `gr/` + `acr`/`sec2`, **descomprimido a `.bin`**) que nouveau necesita para dar **GL 3D**.
+**NVK (Vulkan) no soporta Pascal** ⇒ el greeter va por el **backend GL de wgpu sobre gallium-nouveau**
+(que da `unpackHalf2x16` = float16). Reconstruir para otra GPU: `CHIP=<gpXXX> FW_SRC=<dir> scripts/mirada-usb.sh`.
 
-## Falta para el greeter completo en la NVIDIA (v2)
+## Los dos modos (cmdline, editable con `e` en systemd-boot)
 
-1. **Modelo EXACTO de la GPU** → elegir el firmware GSP correcto (imprescindible para el modeset de
-   nouveau en Turing+) y confirmar soporte.
-2. **Firmware nouveau** en `/lib/firmware/` (pasar `FW_SRC=<dir>` al script para hornearlo).
-3. **NVK** (Vulkan nouveau) para que wgpu use Vulkan por hardware (o GL nouveau vía naga).
+- **Por defecto (`console=tty0`)** → HARDWARE nouveau. nouveau maneja la GTX 1060 (firmware ya horneado),
+  el compositor y el greeter pintan por gallium-nouveau GL. El init exporta `WGPU_BACKEND=gl` y tapa
+  lavapipe para que wgpu no caiga a software.
+- **Fallback software** → en el menú, `e`, agregá **`mirada.sw nouveau.modeset=0`**. Fuerza
+  llvmpipe/lavapipe sobre simpledrm: el **compositor** arranca seguro; el **greeter no completa**
+  (los rasterizadores software no dan float16). Útil si nouveau diera problemas.
+
+## Pendiente / deuda
+
+- **Confirmar en el metal**: el camino nouveau-GL sólo se puede validar en la 1060 real (QEMU no tiene
+  nouveau; el proxy virgl requiere `egl-headless`, no disponible acá). El software sí está validado.
+- **Soberanía**: el stack GL/Vulkan viene de Alpine (mesa 26 + LLVM 22). Falta
+  `recipes/{llvm,mesa-llvmpipe,mesa-nouveau}` desde fuente. El firmware nouveau es un blob NVIDIA (no
+  reproducible por naturaleza).
 
 ## Validar en VM
 
diff --git a/scripts/mirada-usb.sh b/scripts/mirada-usb.sh
index 83b2f8cb..f1adbc58 100644
--- a/scripts/mirada-usb.sh
+++ b/scripts/mirada-usb.sh
@@ -173,6 +173,24 @@ for round in 1 2 3; do
   done
 done
 
+# 5d) FIRMWARE nouveau (aceleración 3D). Pascal/Maxwell2 (GP10x/GM20x) piden los blobs firmados de
+#   ctxsw (gr/) + acr/sec2 para dar GL por hardware; sin ellos nouveau da display pero NO 3D ⇒ el
+#   greeter caería a software (sin float16). Turing+ (RTX) piden ADEMÁS gsp/. CHIP=gp106 para la GTX
+#   1060. FW_SRC = árbol linux-firmware del host (o pasá el tuyo). NO es soberano (blob firmado NVIDIA).
+CHIP="${CHIP:-gp106}"
+FW_SRC="${FW_SRC:-/lib/firmware}"
+if [ -n "$CHIP" ] && [ -d "$FW_SRC/nvidia/$CHIP" ]; then
+  echo "==> firmware nouveau nvidia/$CHIP ← $FW_SRC"
+  mkdir -p "$RFS/lib/firmware/nvidia"
+  cp -aL "$FW_SRC/nvidia/$CHIP" "$RFS/lib/firmware/nvidia/$CHIP"
+  # DESCOMPRIMIR .bin.zst/.xz → .bin: el request_firmware de nouveau busca `.bin`; el kernel sólo
+  # descomprime al vuelo si tiene FW_LOADER_COMPRESS (incierto en linux-generic). Descomprimir asegura.
+  find "$RFS/lib/firmware/nvidia/$CHIP" -name '*.zst' -exec sh -c 'zstd -q -d -f "$1" && rm -f "$1"' _ {} \; 2>/dev/null || true
+  find "$RFS/lib/firmware/nvidia/$CHIP" -name '*.xz'  -exec sh -c 'xz -q -d -f "$1"' _ {} \; 2>/dev/null || true
+elif [ -n "$CHIP" ]; then
+  echo "  ⚠ no encuentro firmware nvidia/$CHIP en $FW_SRC — nouveau no dará 3D (greeter caerá a sw)" >&2
+fi
+
 # 6) /sbin/init = lanzador de mirada (software)
 echo "==> lanzador /sbin/init"
 cat > "$RFS/sbin/init" <<'INIT'
@@ -208,9 +226,14 @@ if grep -qw 'mirada.sw' /proc/cmdline 2>/dev/null; then
   export GALLIUM_DRIVER=llvmpipe
   export VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/lvp_icd.x86_64.json
   export VK_DRIVER_FILES=/usr/share/vulkan/icd.d/lvp_icd.x86_64.json
+else
+  # HARDWARE (nouveau). En Pascal (GTX 10xx / GP10x) NVK NO existe (sólo Turing+) ⇒ el greeter debe ir
+  # por el backend GL de wgpu sobre gallium-nouveau (que sí da unpackHalf2x16 = float16). Forzamos GL y
+  # tapamos lavapipe: si dejáramos Vulkan, wgpu caería a lavapipe (software, sin float16) y fallaría.
+  echo "  ## modo HARDWARE (nouveau GL): greeter por gallium-nouveau"
+  export WGPU_BACKEND=gl
+  export VK_ICD_FILENAMES=/dev/null
 fi
-# En modo hardware el loader Vulkan escanea /usr/share/vulkan/icd.d/ y elige el mejor ICD (nouveau NVK
-# si está, si no lavapipe); no fijamos VK_ICD_FILENAMES para no tapar el hardware.
 
 echo ""
 echo "  ##  hammer · mirada live"
@@ -243,8 +266,11 @@ if [ "$PACKAGE" = "1" ]; then
   # driver ni del firmware. Para el greeter completo (login) hace falta GPU real: en el menú de
   # systemd-boot, tecla 'e', quitá `mirada.sw nouveau.modeset=0` para que nouveau intente el hardware
   # (requiere firmware GSP en /lib/firmware — ver FW_SRC).
+  # Default = HARDWARE nouveau (ya horneamos el firmware gp106): nouveau maneja la GTX 1060 y el greeter
+  # pinta por gallium-nouveau GL. Si nouveau diera problemas, en el menú (tecla 'e') agregá
+  # `mirada.sw nouveau.modeset=0` para caer a software (compositor sí, greeter no).
   ROOTFS="$RFS" KERNEL="$KGEN" IMG="work/hammer-mirada-usb.img" \
-    OPTIONS="${CMDLINE:-mirada.sw nouveau.modeset=0 console=tty0 loglevel=4}" \
+    OPTIONS="${CMDLINE:-console=tty0 loglevel=4}" \
     scripts/metal-usb-sdboot.sh
   echo ""
   echo "✓ imagen: work/hammer-mirada-usb.img"