docs: record what firmware fixed, and what it turns out not to fix
Some checks failed
build image / build (push) Has been cancelled

The motd was the worst of it — it told anyone logging in that "WiFi and
Bluetooth work with the firmware Fedora ships", which is precisely backwards for
the onboard adapter, and pointed at a Windows partition this machine no longer
has.

What the blobs did fix, verified: the GPU initialises, ADSP/CDSP/SLPI all run,
sensors appear as IIO devices, venus registers /dev/video0-3.

What they did not, and why, so nobody repeats the search:

Onboard WiFi is loaded by the modem — wlan*mdsp* is the WLAN Modem DSP — so
ath10k_snoc binds and then waits silently on a QMI service that never arrives.
The modem boots and dies at "RF stuck in QLINK start state", the RF front-end,
which is board-specific wiring in a way the SoC-level blobs are not. These are
Qualcomm *reference* drivers; good enough for the GPU and DSPs, evidently not
for this machine's radio. Three plausible fixes that do not work are recorded
too: rmtfs (correct to enable, does not help), the _nm firmware variants
(rejected at PBL), and unplugging the USB dongle (different bus entirely — it
was never competing).

Audio gets further than expected. The codec answers over SLIMbus with its chip
id, so hardware and ADSP are fine; what fails is the codec's SoundWire block
declaring two data-in ports where the controller expects six. That is a kernel
mismatch and needs a kernel change.

Also record the mesa caveat properly: the GPU works, but freedreno's EGL path
segfaults gnome-shell into a login loop, and LIBGL_ALWAYS_SOFTWARE does nothing
because mutter uses EGL. MESA_LOADER_DRIVER_OVERRIDE=kms_swrast is what works.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XWRjNJMistCy6ngXH5aJLS
This commit is contained in:
2026-07-28 08:24:11 +03:00
parent 18252b37f5
commit 8fa461a41b
3 changed files with 106 additions and 23 deletions

View File

@@ -31,22 +31,31 @@ login. Root is locked.
## Hardware status
| Works out of the box | Needs firmware from Windows | Not supported |
|---------------------------------|-----------------------------|---------------|
| UFS storage, USB, keyboard, touchpad, touchscreen | Graphics (Adreno 630 zap shader) | LTE modem |
| WiFi + Bluetooth (ath10k WCN3990) | Audio | |
| Battery and charging | Sensor hub — lid switch, accelerometer, auto-rotate | |
| Display (unaccelerated) | Hardware video decode (venus) | |
| Works | Works once you supply firmware | Does not work |
|---|---|---|
| UFS storage, USB, keyboard, touchpad, touchscreen | Adreno 630 initialises — see mesa note below | Audio — kernel driver, not firmware |
| Display (unaccelerated), battery, charging | Sensor hub — accelerometer, auto-rotate | Onboard WiFi — needs modem firmware no public source provides |
| USB WiFi dongles, USB phone tethering | Hardware video decode (venus, `/dev/video0-3`) | LTE modem — same reason |
Fedora ships everything Qualcomm permits to be redistributed, which covers
WiFi and Bluetooth outright. Graphics is the awkward case: the generic Adreno
pieces (`a630_gmu.bin`, `a630_sqe.fw`) are packaged, but the C630's device tree
asks for a **model-signed** zap shader, `qcdxkmsuc850.mbn`, which exists only in
your machine's Windows partition — Fedora's generic `sdm845/a630_zap.mbn` is not
what this device requests. Audio, sensors and video decode are the same story.
Verified on hardware. `docs/firmware.md` has the evidence for each, including
the things that look like they should help and do not.
Run `sudo c630-firmware` once after installing — see
[docs/firmware.md](docs/firmware.md) for the full list and a manual fallback.
**Graphics comes with a caveat.** With `qcdxkmsuc850.mbn` in place the GPU
genuinely initialises — `gpu-initialized: 1`, revision 630, executing
submissions. But mesa's freedreno EGL path then segfaults in
`dri2_drm_swap_buffers`, taking gnome-shell down in a login loop. Until that is
fixed upstream, the desktop needs software rendering:
```sh
echo 'MESA_LOADER_DRIVER_OVERRIDE=kms_swrast' | sudo tee /etc/environment
```
Note `LIBGL_ALWAYS_SOFTWARE=1` does *not* work here — mutter uses EGL, which
ignores it.
Getting the firmware: see
[docs/firmware.md](docs/firmware.md). The cabinets from WOA-Project are the
easiest route; `sudo c630-firmware` works if the Windows partition survives.
## Building
@@ -119,7 +128,7 @@ docs/ Installation, firmware, runner setup
## Documentation
- [docs/install.md](docs/install.md) — writing the image and booting the laptop
- [docs/firmware.md](docs/firmware.md) — what needs extracting from Windows and why
- [docs/firmware.md](docs/firmware.md) — the per-model blobs: what they enable, where to get them, and what they do not fix
- [docs/runner-setup.md](docs/runner-setup.md) — one-time Gitea runner preparation
## Boot status
@@ -141,11 +150,11 @@ is installed and corrects the clock once the network is up. Until it does, rpm
rejects package signatures dated after the (wrong) current time and reports
installed packages as missing — see [docs/install.md](docs/install.md).
Onboard WiFi does not appear at all, and audio, sensors, video decode and
accelerated graphics are all absent — every one of them waiting on the
model-signed firmware described in [docs/firmware.md](docs/firmware.md). On
this machine Windows has been wiped, so those blobs are gone; the kernel names
each missing file explicitly in `dmesg`.
With the per-model firmware supplied, the GPU initialises, the ADSP, CDSP and
SLPI all run, sensors appear as IIO devices and venus registers `/dev/video0-3`.
Audio and onboard WiFi remain broken for reasons unrelated to firmware — see
[docs/firmware.md](docs/firmware.md), which records both the evidence and the
several plausible fixes that turn out not to work.
The internal drive needs `build/install-to-disk.sh` rather than `dd`: its UFS
uses 4096-byte logical sectors, which the 512-byte image geometry cannot be