# Maintainer: Tobias Powalowski <tpowa@archlinux.org>
# Contributor: Thomas Bächler <thomas@archlinux.org>

pkgbase=linux-firmware
pkgname=(
  linux-firmware
  linux-firmware-whence
  linux-firmware-other

  # Splits
  amd-ucode
  linux-firmware-amdgpu
  linux-firmware-atheros
  linux-firmware-broadcom
  linux-firmware-cirrus
  linux-firmware-intel
  linux-firmware-liquidio
  linux-firmware-marvell
  linux-firmware-mediatek
  linux-firmware-mellanox
  linux-firmware-nfp
  linux-firmware-nvidia
  linux-firmware-qcom
  linux-firmware-qlogic
  linux-firmware-radeon
  linux-firmware-realtek
)
pkgver=20260622
pkgrel=1
epoch=1
pkgdesc="Firmware files for Linux"
url="https://gitlab.com/kernel-firmware/linux-firmware"
license=(LicenseRef-WHENCE)
arch=(any)
makedepends=(
  git
  parallel
  python
  rdfind
)
options=(
  !debug
  !strip
)
source=("git+$url.git?signed#tag=${pkgver}")
b2sums=('272122f3b49da2b2c335a60db97797c5c38c13b82e32cb42313d13307df792af59fa33239c1a5c709ec1f4d96863514f4e75f733aa06a3f98d0c713532ef95f9')
validpgpkeys=(
  4CDE8575E547BF835FE15807A31B6BD72486CFD6 # Josh Boyer <jwboyer@fedoraproject.org>
)

_backports=(
)

_reverts=(
)

prepare() {
  cd ${pkgbase}

  local c
  for c in "${_backports[@]}"; do
    echo Backporting $(git log --oneline -1 "${c}")
    git cherry-pick -n "${c}"
  done
  for c in "${_reverts[@]}"; do
    echo Reverting $(git log --oneline -1 "${c}")
    git revert -n "${c}"
  done
}

build() {
  mkdir -p kernel/x86/microcode
  cat ${pkgbase}/amd-ucode/microcode_amd*.bin > kernel/x86/microcode/AuthenticAMD.bin

  # Reproducibility: set the timestamp on the bin file
  if [[ -n ${SOURCE_DATE_EPOCH} ]]; then
    touch -d @${SOURCE_DATE_EPOCH} kernel/x86/microcode/AuthenticAMD.bin
  fi

  # Reproducibility: strip the inode and device numbers from the cpio archive
  echo kernel/x86/microcode/AuthenticAMD.bin |
    bsdtar --uid 0 --gid 0 -cnf - -T - |
    bsdtar --null -cf - --format=newc @- > amd-ucode.img
}

_pick() {
  local p="$1" f d; shift
  for f; do
    d="$srcdir/$p/${f#${pkgdir}/}"
    mkdir -p "$(dirname "$d")"
    mv "$f" "$d"
    rmdir -p --ignore-fail-on-non-empty "$(dirname "$f")"
  done
}

_licdir=${pkgbase}/LICENSES

package_linux-firmware() {
  pkgdesc+=" - Default set"
  license=(CC0-1.0)
  depends=(
    linux-firmware-amdgpu
    linux-firmware-atheros
    linux-firmware-broadcom
    linux-firmware-cirrus
    linux-firmware-intel
    linux-firmware-mediatek
    linux-firmware-nvidia
    linux-firmware-other
    linux-firmware-radeon
    linux-firmware-realtek
  )
  optdepends=(
    'linux-firmware-liquidio: Firmware for Cavium LiquidIO server adapters'
    'linux-firmware-marvell: Firmware for Marvell devices'
    'linux-firmware-mellanox: Firmware for Mellanox Spectrum switches'
    'linux-firmware-nfp: Firmware for Netronome Flow Processors'
    'linux-firmware-qcom: Firmware for Qualcomm SoCs'
    'linux-firmware-qlogic: Firmware for QLogic devices'
  )
}

package_linux-firmware-whence() {
  pkgdesc+=" - WHENCE file (vendor licenses)"

  install -Dm644 ${pkgbase}/WHENCE -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-other() {
  pkgdesc+=" - Unsorted firmware for various devices"

  local fwdir="${pkgdir}/usr/lib/firmware"
  ZSTD_CLEVEL=19 make -C ${pkgbase} FIRMWAREDIR="${fwdir}" install-zst

  # split
  _pick amd-ucode "${fwdir}"/amd-ucode

  _pick amdgpu "${fwdir}"/amdgpu

  _pick atheros "${fwdir}"/{ar[0-9]*,ath*,carl9170*,htc_*,qca,wil6210*}

  _pick broadcom "${fwdir}"/{bnx2*,brcm,cypress,tigon}

  _pick cirrus "${fwdir}"/{cirrus,cs42l43*}

  _pick intel "${fwdir}"/{e100,hfi1_*,i915,intel,isci,iwlwifi*,ixp4xx,qat_*,xe}

  _pick liquidio "${fwdir}"/liquidio

  _pick marvell "${fwdir}"/{libertas,mwl8k,mwlwifi,mrvl}

  _pick mediatek "${fwdir}"/{mediatek,mt7*,rt[237]*}

  _pick mellanox "${fwdir}"/mellanox

  _pick nfp "${fwdir}"/netronome

  _pick nvidia "${fwdir}"/nvidia

  _pick qcom "${fwdir}"/{qcom,a300_*}

  _pick qlogic "${fwdir}"/{qlogic,qed,ql2???_*,c{b,t,t2}fw-*}

  _pick radeon "${fwdir}"/radeon

  _pick realtek "${fwdir}"/{realtek,rtlwifi,rtw8*,rtl_*}

  # dedup after splitting
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/LICEN[CS]E* \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_amd-ucode() {
  pkgdesc="Microcode update image for AMD CPUs"
  license=(LicenseRef-amd-ucode)

  mv -v ${pkgname}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 amd-ucode.img -t "${pkgdir}/boot"
  install -Dm644 ${_licdir}/LICENSE.amd-ucode \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-amdgpu() {
  pkgdesc+=" - Firmware for AMD Radeon GPUs"
  license+=(
    LicenseRef-amdgpu
    MIT
  )
  depends=(linux-firmware-whence)

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/LICENSE.amd{gpu,isp} \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-atheros() {
  pkgdesc+=" - Firmware for Qualcomm Atheros WiFi and Bluetooth adapters"
  license+=(
    GPL-2.0-only
    LicenseRef-atheros
  )
  depends=(linux-firmware-whence)

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/NOTICE.{qca,qcom} \
    ${_licdir}/LICENCE.{atheros_,open-ath9k-htc-}firmware \
    ${_licdir}/LICENSE.{QualcommAtheros*,qcom} \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-broadcom() {
  pkgdesc+=" - Firmware for Broadcom and Cypress network adapters"
  license+=(LicenseRef-broadcom)
  depends=(linux-firmware-whence)
  provides=(linux-firmware-bnx2x)
  conflicts=(linux-firmware-bnx2x)
  replaces=('linux-firmware-bnx2x<=20250613.12fe085f-4')

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/LICENCE.{bnx2*,broadcom_*,cypress,tigon} \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-cirrus() {
  pkgdesc+=" - Firmware for Cirrus Logic audio devices"
  license+=(LicenseRef-cirrus)
  depends=(linux-firmware-whence)

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/LICENSE.cirrus \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-intel() {
  pkgdesc+=" - Firmware for Intel devices"
  license+=(
    Apache-2.0
    GPL-2.0-only
    LicenseRef-intel
  )
  depends=(linux-firmware-whence)

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 \
    ${_licdir}/LICENCE.{IntcSST2,adsp_sst,e100,fw_sst_0f28} \
    ${_licdir}/LICENCE.{ibt,iwlwifi,qat}_firmware \
    ${_licdir}/LICENSE.{hfi1,ipu3}_firmware \
    ${_licdir}/LICENSE.{i915,ice*,intel*,ivsc,ixp4xx,xe} \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-liquidio() {
  pkgdesc+=" - Firmware for Cavium LiquidIO server adapters"
  license+=(LicenseRef-liquidio)
  depends=(linux-firmware-whence)

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/LICENCE.cavium_liquidio \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-marvell() {
  pkgdesc+=" - Firmware for Marvell devices"
  license+=(LicenseRef-marvell)
  depends=(linux-firmware-whence)

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/LICENCE.{Marvell,NXP} \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-mediatek() {
  pkgdesc+=" - Firmware for MediaTek and Ralink devices"
  license+=(LicenseRef-mediatek)
  depends=(linux-firmware-whence)

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/LICENCE.{mediatek,ralink*} \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-mellanox() {
  pkgdesc+=" - Firmware for Mellanox Spectrum switches"
  depends=(linux-firmware-whence)

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/LICENSE.mellanox \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-nfp() {
  pkgdesc+=" - Firmware for Netronome Flow Processors"
  license+=(LicenseRef-netronome)
  depends=(linux-firmware-whence)

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/LICENCE.Netronome \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-nvidia() {
  pkgdesc+=" - Firmware for NVIDIA GPUs and SoCs"
  license+=(LicenseRef-nvidia)
  depends=(linux-firmware-whence)

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/LICENCE.nvidia \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-qcom() {
  pkgdesc+=" - Firmware for Qualcomm SoCs"
  license+=(
    BSD-3-Clause
    LicenseRef-qcom
  )
  depends=(
    linux-firmware-atheros
    linux-firmware-whence
  )

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/{NOTICE.qcom,LICENSE.qcom*,LICENSE.dell} \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-qlogic() {
  pkgdesc+=" - Firmware for QLogic devices"
  license+=(LicenseRef-qlogic)
  depends=(linux-firmware-whence)

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/LICENCE.qla* \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-radeon() {
  pkgdesc+=" - Firmware for ATI Radeon GPUs"
  license+=(LicenseRef-radeon)
  depends=(linux-firmware-whence)

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/LICENSE.radeon \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

package_linux-firmware-realtek() {
  pkgdesc+=" - Firmware for Realtek devices"
  license+=(LicenseRef-realtek)
  depends=(linux-firmware-whence)

  mv -v ${pkgname#linux-firmware-}/* "${pkgdir}"
  make -C ${pkgbase} FIRMWAREDIR="${pkgdir}/usr/lib/firmware" dedup

  install -Dm644 ${_licdir}/LICENCE.rtlwifi_firmware.txt \
    -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

# vim:set sw=2 sts=-1 et:
