# Mostly a copy of linux-firmware PKGBUILD by Tobias Powalowski <tpowa@archlinux.org>
# Maintainer: Victor Dmitriev <mrvvitek@gmail.com>
# Contributor: xduugu

pkgbase=linux-firmware-git
pkgname=(linux-firmware-whence-git linux-firmware-git amd-ucode-git
  linux-firmware-{nfp,mellanox,marvell,qcom,liquidio,qlogic,bnx2x}-git
)
pkgver=20250305.a3e1417a
pkgrel=1
pkgdesc="Firmware files for Linux"
url="https://gitlab.com/kernel-firmware/linux-firmware"
license=(
  GPL-2.0-only
  GPL-2.0-or-later
  GPL-3.0-only
  custom
)
arch=('any')
makedepends=(
  git
  parallel
  python
  rdfind
)
options=(
  !strip
  !debug
)
#source=("${pkgbase}::git+${url}.git?signed")
# NOTE: upstream doesn't sign most commits anymore, but still signs all tags.
# Packages in the official repos package tags.
# You can check signatures with the following commands:
#git log --format=raw --show-signature main
#git tag -v $(git tag)
# NOTE: upstream still signs tags, but now PKGBUILD doesn't check the signature
source=("${pkgbase}::git+${url}.git")
sha256sums=('SKIP')
validpgpkeys=('4CDE8575E547BF835FE15807A31B6BD72486CFD6') # Josh Boyer <jwboyer@fedoraproject.org>

pkgver() {
  cd ${pkgbase}

  # Commit date + short rev
  echo $(TZ=UTC git show -s --pretty=%cd --date=format-local:%Y%m%d HEAD).$(git rev-parse --short HEAD)
}

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
}

package_linux-firmware-whence-git() {
  conflicts=("${pkgname%-git}" 'linux-firmware<=20211216.f682ecb')
  provides=("${pkgname%-git}=$pkgver")
  pkgdesc+=" - contains the WHENCE license file which documents the vendor license details"

  install -Dt "${pkgdir}/usr/share/licenses/${pkgname%-git}" -m644 ${pkgbase}/WHENCE
}

package_linux-firmware-git() {
  conflicts=("${pkgname%-git}")
  provides=("${pkgname%-git}=$pkgver")
  depends=('linux-firmware-whence')

  cd ${pkgbase}

  ZSTD_CLEVEL=19 make DESTDIR="${pkgdir}" FIRMWAREDIR=/usr/lib/firmware install-zst

  install -Dt "${pkgdir}/usr/share/licenses/${pkgname%-git}" -m644 LICEN*

  cd "${pkgdir}"

  # remove arm64 firmware https://bugs.archlinux.org/task/76583
  rm usr/lib/firmware/mrvl/prestera/mvsw_prestera_fw_arm64-v4.1.img.zst

  # split
  _pick amd-ucode usr/lib/firmware/amd-ucode

  _pick linux-firmware-nfp usr/lib/firmware/netronome
  _pick linux-firmware-nfp usr/share/licenses/${pkgname%-git}/LICENCE.Netronome

  _pick linux-firmware-mellanox usr/lib/firmware/mellanox

  _pick linux-firmware-marvell usr/lib/firmware/{libertas,mwl8k,mwlwifi,mrvl}
  _pick linux-firmware-marvell usr/share/licenses/${pkgname%-git}/LICENCE.{Marvell,NXP}

  _pick linux-firmware-qcom usr/lib/firmware/{qcom,a300_*}
  _pick linux-firmware-qcom usr/share/licenses/${pkgname%-git}/LICENSE.qcom*

  _pick linux-firmware-liquidio usr/lib/firmware/liquidio
  _pick linux-firmware-liquidio usr/share/licenses/${pkgname%-git}/LICENCE.cavium_liquidio

  _pick linux-firmware-qlogic usr/lib/firmware/{qlogic,qed,ql2???_*,c{b,t,t2}fw-*}
  _pick linux-firmware-qlogic usr/share/licenses/${pkgname%-git}/LICENCE.{qla1280,qla2xxx}

  _pick linux-firmware-bnx2x usr/lib/firmware/bnx2x*
}

package_amd-ucode-git() {
  conflicts=("${pkgname%-git}")
  provides=("${pkgname%-git}=$pkgver")
  pkgdesc="Microcode update image for AMD CPUs"
  license=(custom)

  mv -v amd-ucode/* "${pkgdir}"

  install -Dt "${pkgdir}/boot" -m644 amd-ucode.img

  install -Dt "${pkgdir}/usr/share/licenses/${pkgname%-git}" -m644 ${pkgbase}/LICENSE.amd-ucode
}

package_linux-firmware-nfp-git() {
  conflicts=("${pkgname%-git}" 'linux-firmware<=20211216.f682ecb')
  provides=("${pkgname%-git}=$pkgver")
  pkgdesc+=" - nfp / Firmware for Netronome Flow Processors"
  depends=('linux-firmware-whence')

  mv -v linux-firmware-nfp/* "${pkgdir}"
}

package_linux-firmware-mellanox-git() {
  conflicts=("${pkgname%-git}" 'linux-firmware<=20211216.f682ecb')
  provides=("${pkgname%-git}=$pkgver")
  pkgdesc+=" - mellanox / Firmware for Mellanox Spectrum switches"
  depends=('linux-firmware-whence')

  mv -v linux-firmware-mellanox/* "${pkgdir}"
}

package_linux-firmware-marvell-git() {
  conflicts=("${pkgname%-git}" 'linux-firmware<=20211216.f682ecb')
  provides=("${pkgname%-git}=$pkgver")
  pkgdesc+=" - marvell / Firmware for Marvell devices"
  depends=('linux-firmware-whence')

  mv -v linux-firmware-marvell/* "${pkgdir}"
}

package_linux-firmware-qcom-git() {
  conflicts=("${pkgname%-git}" 'linux-firmware<=20211216.f682ecb')
  provides=("${pkgname%-git}=$pkgver")
  pkgdesc+=" - qcom / Firmware for Qualcomm SoCs"
  depends=('linux-firmware-whence')

  mv -v linux-firmware-qcom/* "${pkgdir}"
}

package_linux-firmware-liquidio-git() {
  conflicts=("${pkgname%-git}" 'linux-firmware<=20211216.f682ecb')
  provides=("${pkgname%-git}=$pkgver")
  pkgdesc+=" - liquidio / Firmware for Cavium LiquidIO server adapters"
  depends=('linux-firmware-whence')

  mv -v linux-firmware-liquidio/* "${pkgdir}"
}

package_linux-firmware-qlogic-git() {
  conflicts=("${pkgname%-git}" 'linux-firmware<=20211216.f682ecb')
  provides=("${pkgname%-git}=$pkgver")
  pkgdesc+=" - qlogic / Firmware for QLogic devices"
  depends=('linux-firmware-whence')

  mv -v linux-firmware-qlogic/* "${pkgdir}"
}

package_linux-firmware-bnx2x-git() {
  conflicts=("${pkgname%-git}" 'linux-firmware<=20211216.f682ecb')
  provides=("${pkgname%-git}=$pkgver")
  pkgdesc+=" - bnx2x / Firmware for Broadcom NetXtreme II 10Gb ethernet adapters"
  depends=('linux-firmware-whence')

  mv -v linux-firmware-bnx2x/* "${pkgdir}"
}
