# Firmware The C630's firmware splits into two groups, and the split is about licensing, not difficulty. ## What ships in the image Qualcomm permits redistribution of these, so Fedora packages them and the build installs them: | Package | Files | Enables | |---|---|---| | `qcom-firmware` | `qcom/a630_gmu.bin`, `qcom/a630_sqe.fw`, `qcom/sdm845/a630_zap.mbn` | Adreno 630 — accelerated graphics via freedreno | | `atheros-firmware` | `ath10k/WCN3990/hw1.0/{firmware-5.bin,board-2.bin,wlanmdsp.mbn}` | WiFi and Bluetooth | So graphics and networking work on a freshly written image with no extra steps. ## What has to come off the Windows partition The SDM850's DSP and display firmware is signed against per-model keys. Nobody can redistribute it, and it exists on your machine only inside its Windows install: | File | Enables | |---|---| | `qcadsp850.mbn` | Audio DSP — speakers, microphone | | `qccdsp850.mbn` | Compute DSP — sensor hub, so lid switch, accelerometer, auto-rotate | | `qcdxkmsuc850.mbn` | Display/UEFI secure code | | `qcdsp1v2850.mbn`, `qcdsp2850.mbn` | Modem DSP stages | | `ipa_fws.elf` | IPA — needed by the modem path | They belong under `/lib/firmware/updates/qcom/sdm850/LENOVO/81JL/`. ## Extracting them The image ships Fedora's `qcom-firmware-extract`. Run it once: ```sh sudo c630-firmware sudo reboot ``` That wraps `qcom-firmware-extract` and regenerates the initramfs afterwards, which matters — the ADSP firmware has to be available before the root filesystem is mounted, and `overlay/etc/dracut.conf.d/10-c630.conf` only takes effect on a rebuild. If it cannot find Windows, mount it yourself and point the tool at it: ```sh lsblk -o NAME,SIZE,FSTYPE,LABEL # find the NTFS partition sudo mkdir -p /mnt/windows sudo mount /dev/sda4 /mnt/windows sudo qcom-firmware-extract --windows-dir /mnt/windows ``` `qcom-firmware-extract` was written for the Snapdragon 8cx and X Elite laptops. If it does not recognise the SDM850, copy the files by hand — they are in `Windows/System32/DriverStore/FileRepository/` under a `qcdx*.inf_arm64_*` directory: ```sh sudo find /mnt/windows/Windows/System32/DriverStore/FileRepository \ -iname 'qc*850.mbn' -o -iname 'ipa_fws.elf' -o -iname 'qcdxkmsuc850.mbn' sudo mkdir -p /lib/firmware/updates/qcom/sdm850/LENOVO/81JL sudo cp /lib/firmware/updates/qcom/sdm850/LENOVO/81JL/ sudo dracut --force --regenerate-all ``` Check it took: ```sh dmesg | grep -iE 'remoteproc|adsp|cdsp' ``` ## Baking firmware into the image If you would rather not repeat the extraction on every reinstall, drop the files into `firmware/local/` in this repo, mirroring the `/usr/lib/firmware/updates/` layout: ``` firmware/local/qcom/sdm850/LENOVO/81JL/qcadsp850.mbn firmware/local/qcom/sdm850/LENOVO/81JL/qccdsp850.mbn ... ``` `build/stage2.sh` picks them up automatically. They are gitignored, and should stay that way — this repository is public and the blobs are not yours to publish.