#!/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
# Only the GPU zap shader has to travel in the initramfs. msm_dpu probes around
# six seconds in, while the initramfs is still the root filesystem, and never
# retries. Everything else — ADSP, CDSP, SLPI, venus, modem — is probed well
# after the real root is mounted and loads from there quite happily.
#
# This matters: qcdsp2850.mbn alone is 60MB. Globbing the whole directory into
# the initramfs, which is what this used to do, would have bloated it roughly
# twentyfold to no purpose.
FW_DIR=/usr/lib/firmware/updates/qcom/sdm850/LENOVO/81JL
if [ -f "${FW_DIR}/qcdxkmsuc850.mbn" ]; then
    printf 'install_items+=" %s/qcdxkmsuc850.mbn "\n' "$FW_DIR" \
        > /etc/dracut.conf.d/20-c630-zap-shader.conf
    echo "GPU zap shader 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
