Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Phase 3: GPU, the Adreno X1-85 boots its GMU (2026-11-03)

Attempt 2026-11-03-5. Image d862b3e055610ddf, kernel #6 (2026-11-03 2:23 PM ET), commit d67114c. Sources: the netlog dumps/firstboot/2026-11-03-netlog.txt (1308 lines) and the AP console log dumps/firstboot/2026-11-03-ap.log (both gitignored), plus the owner looking at the panel.

Why

In attempt 2026-11-03-4 (display-2026-11-03.md) the display bound only because the command line carried msm.skip_gpu=1. The GPU SMMU 3da0000.iommu stayed deferred (“supplier 3d90000.clock-controller not ready”). scripts/dt-kconfig-map.py on the mica-el2 DTB showed gpucc (CLK_X1E80100_GPUCC) as the only GPU-path driver still at =m.

Changes (commit d67114c)

  • Kernel: kernel/mica-gpu.config sets CLK_X1E80100_GPUCC=y.
  • Command line: msm.separate_gpu_kms=1 replaces msm.skip_gpu=1. The GPU gets its own DRM device through msm_gpu_probe (adreno_device.c:275, msm_drv.c:1102-1121), so a GPU failure can’t unbind the display.
  • Firmware: qcom/gen70500_sqe.fw and qcom/gen70500_gmu.bin (names from a6xx_catalog.c:1573-1577).
    • They come from linux-firmware-qcom 20260916-1, downloaded into ~/.cache/gbook/pkgs, signature-checked against pacman’s keyring and never installed on the build host.
    • sha256 05ae89e6… (sqe) and 5dfba247… (gmu), the same as kernel.org linux-firmware tag 20260916.
    • scripts/stage-firmware.sh gained this “pkg” source.
  • /init: after the display block, it opens the GPU’s render node in a background subshell that is never waited for. That open triggers msm_open → load_gpu.

Result: pass

  • SMMU: arm-smmu 3da0000.iommu probed at 0.506 s (SMMUv2, 25 context banks). 3d00000.gpu and 3d6a000.gmu joined iommu groups 0 and 1. 3da0000.iommu is gone from every deferred list.
  • GPU DRM device: [drm] Initialized msm 1.13.0 for 3d00000.gpu on minor 1 at 0.542 s.
    • /init found it as renderD128, driver adreno.
    • The display is a separate device: msm-kms for ae01000.display-controller on minor 2 (card2).
  • Firmware and GMU, when /init opened the node at 57.8 s:
    • loaded qcom/gen70500_sqe.fw from new location and loaded qcom/gen70500_gmu.bin from new location
    • Loaded GMU firmware v4.3.17
    • Zap shader not enabled - using SECVID_TRUST_CNTL instead. This is the expected EL2 path: x1-el2.dtso disables gpu_zap_shader, and a6xx_gpu.c:1507-1516 falls back.
  • No GPU errors after the load: no GMU timeout, hang or fault in the rest of the log. gpu-open=opened.
  • devfreq: 3d00000.gpu at 300 MHz, max 1250 MHz.
  • Display unchanged from attempt -4:
    • card2-eDP-1 connected at 2560x1600.
    • VREG_EDP_3P3 and VBL9 enabled after 40 s; backlight 2048/4095.
    • The owner saw the panel stay lit with the banner.
  • Panel identity (the edid_id fix 2d2f2b5): mfr=LGD product=0804 text="RNYV4?LP134WQ". That’s an LG Display LP134WQ… 13.4“ panel. The 0xfe text descriptor is cut at 13 bytes, and ? replaces a non-printing byte.
  • Shutdown: clean. /init sent netlog at about 68 s and ran reboot -f at 128 s. The kernel disabled the panel and both SMMUs, then printed reboot: Restarting system at 128.6 s (2:29 PM ET). With the image stick still in, the firmware stayed on its boot screen. Once the owner pulled the stick, stock booted.
  • Deferred at the end: only arm-scmi (mailbox 17430000).

Leftovers (not failures)

  • gcc-x1e80100 and gpucc-x1e80100 report sync_state() pending due to 3d6a000.gmu. Inference: the GMU node has no platform driver of its own (the a6xx code drives it during the GPU bind), so these providers never get their sync_state(). Not checked against the source yet. clk_ignore_unused pd_ignore_unused are on the command line anyway.
  • adreno 3d00000.gpu: supply vdd not found and vddcx not found: the GPU node in hamoa.dtsi names neither supply, so the driver uses dummy regulators.
  • No rendering test: the initramfs has no Mesa or freedreno userspace. The GPU is up as far as the kernel is concerned.

Next for the GPU

  1. A real workload needs a userspace with Mesa freedreno (a rootfs, not this initramfs).
  2. The zap shader under EL1 (stock firmware qcdxkmsuc8380.mbn) only matters for a non-EL2 boot.