#!/usr/bin/bash # # Pull the model-specific Qualcomm blobs off this machine's Windows partition. # # Fedora ships everything for the C630 that Qualcomm allows to be # redistributed, which covers ath10k WCN3990 (WiFi/Bluetooth) outright. What it # cannot ship is the per-model signed firmware, which is signed against this # machine's own keys and lives only in its Windows install. # # Without those you lose accelerated graphics, audio, the sensor hub (lid # switch, accelerometer, auto-rotate) and hardware video decode. # # Graphics is the surprising one. The generic Adreno 630 pieces are packaged, # but this device's tree asks for a model-signed zap shader — # qcom/sdm850/LENOVO/81JL/qcdxkmsuc850.mbn — and Fedora's generic # sdm845/a630_zap.mbn is a different device's file. set -euo pipefail if [ "$(id -u)" -ne 0 ]; then echo "c630-firmware: needs root — try: sudo c630-firmware" >&2 exit 1 fi echo "Looking for a Windows installation to extract firmware from..." echo if ! command -v qcom-firmware-extract >/dev/null; then echo "qcom-firmware-extract is not installed. Install it with:" >&2 echo " sudo dnf install qcom-firmware-extract" >&2 exit 1 fi qcom-firmware-extract "$@" echo # The ADSP has to be up before the root filesystem is mounted, so these have to # travel in the initramfs. Only write the glob now that the files exist — # dracut objects to install_items that match nothing. FW_DIR=/usr/lib/firmware/updates/qcom/sdm850/LENOVO/81JL if compgen -G "${FW_DIR}/*.mbn" >/dev/null || compgen -G "${FW_DIR}/*.elf" >/dev/null; then printf 'install_items+=" %s/*.mbn %s/*.elf "\n' "$FW_DIR" "$FW_DIR" \ > /etc/dracut.conf.d/20-c630-extracted-firmware.conf echo "Extracted firmware will be included in the initramfs." fi echo "Regenerating the initramfs..." dracut --force --regenerate-all cat <<'EOF' Done. Reboot to pick up the new firmware. If qcom-firmware-extract could not find the Windows partition, mount it by hand and point the tool at it: sudo mkdir -p /mnt/windows sudo mount /dev/disk/by-partlabel/Windows /mnt/windows # adjust as needed sudo qcom-firmware-extract --windows-dir /mnt/windows See docs/firmware.md in the c630 repo for the full file list and the manual fallback if the tool does not recognise this model. EOF