# Maintainer: Shin-ya Koga <shinya.koga@atmark-techno.com>

pkgname=linux-at-a6
pkgver=5.10.242
pkgrel=0
_gitref=$pkgver-r$pkgrel

url="https://armadillo.atmark-techno.com/"
pkgdesc="Linux kernel for atmark a6 series"
makedepends="perl gmp-dev elfutils-dev bash
	sed installkernel bc linux-headers zstd
	bison flex openssl-dev findutils python3 pahole
	lz4 xz u-boot-tools
	wireless-regdb linux-firmware-imx
	linux-firmware-laird-lwb5plus-sdio-sa
"
options="!strip !check"
source="linux-5.10-5.10.242-r0.tar.gz
config-changes-at.armv7
config-changes-at-debug.armv7"
arch="armv7"
license="GPL-2.0"
_flavors="at at-debug"
subpackages="$pkgname-dbg::armv7
	$pkgname-debug::armv7
	$pkgname-debug-dbg:debug_dbg:armv7
"

case "$CARCH" in
	aarch64) _carch="arm64" ;;
	arm*) _carch="arm" ;;
esac

prepare() {
	default_prepare
	_unzstd

	cd "$srcdir/linux-5.10-$_gitref" || return

	# remove localversion from patch if any
	rm -f localversion*

	local flavor=
	for flavor in $_flavors; do
		local _builddir="$srcdir"/build-$flavor
		mkdir -p "$_builddir"
		echo "-$pkgrel-$flavor" > "$_builddir"/localversion-alpine
		_genconfig $flavor
		make -C "$srcdir"/linux-5.10-$_gitref \
			O="$_builddir" \
			ARCH="$_carch" \
			olddefconfig
		_verifyconfig $flavor
	done
}

_unzstd() {
	unzstd --output-dir-mirror "$srcdir/firm" -f -r /lib/firmware/imx/sdma
}

# generate config from defconfig and apply local changes.
# config-changes-$flavor.$CARCH holds a list of = delimited
# config command and values used by kernel scripts/config script.
_genconfig() {
	local flavor=$1 defconfig=
	local builddir="$srcdir"/build-$flavor
	local defconfig=
	case $flavor in
		at|at-debug) defconfig=armadillo-iotg-a6e_defconfig;;
		*) die "Unknown flavor: $flavor" ;;
	esac

	cp "$srcdir"/linux-5.10-$_gitref/arch/$_carch/configs/$defconfig \
		"$builddir"/.config
	"$srcdir"/linux-5.10-$_gitref/scripts/config \
	       --file "$builddir"/.config \
	       --set-str CONFIG_EXTRA_FIRMWARE_DIR "$srcdir/firm/lib/firmware"

	while read -r line; do
		# skip comments
		case "$line" in
			"#"*) continue;;
		esac
		local option=${line%%=*} str=
		local cmd=$(echo $line | cut -d= -f2)
		case "$cmd" in
			y) cmd="enable";;
			n) cmd="disable";;
			m) cmd="module";;
			'"'*) cmd="set-str"; str="${line#*=}";;
			[0-9]*) cmd="set-val"; str="${line#*=}";;
			*) die "Command $cmd not accepted" ;;
		esac
		msg "[$flavor] $cmd: $option $str"
		"$srcdir"/linux-5.10-$_gitref/scripts/config \
			--file "$builddir"/.config \
			--$cmd "$option" "${str//\"/}"
	done < "$srcdir"/config-changes-$flavor.$CARCH
}

# verify if options are set to correct value
_verifyconfig() {
	local flavor=$1
	local builddir="$srcdir"/build-$flavor
	while read -r line; do
		[ ${line:0:1} = "#" ] && continue
		local option=${line%%=*} str="" invert=""
		local cmd=$(echo $line | cut -d= -f2)
		case "$cmd" in
			enable) str="$option=y" ;;
			disable) str="$option"; invert="-v" ;;
			module) str="$option=m" ;;
			set-val) str="$option=${line##*=}" ;;
			set-str) str=${line##*=}
				str="$option=\"${str//\"/}\"" ;;
		esac
		grep -q $invert "^$str" "$builddir"/.config || \
			die "Config: $option not properly set!"
	done < "$srcdir"/config-changes-$flavor.$CARCH
}

build() {
	unset LDFLAGS

	# abuild exports HOSTLD=$LD for cross compilation, but
	# $LD can be empty and this breaks builds, reset a sane default
	[ -n "$HOSTLD" ] || export HOSTLD=ld

	for i in $_flavors; do
		cd "$srcdir"/build-$i
		local _kver=$(make kernelversion)
		if [ "$_kver" != "$pkgver" ]; then
			error "Version in Makefile ($_kver) does not correspond with pkgver ($pkgver)"
			return 1
		fi
		make -j"$(nproc)" ARCH="$_carch" CC="${CC:-gcc}" \
			KBUILD_BUILD_VERSION="$((pkgrel + 1 ))-Alpine" \
			LOADADDR=0x82000000 vmlinux modules dtbs uImage
	done
}

_package() {
	local _buildflavor="$1" _outdir="$2"
	local _abi_release=$pkgver-$pkgrel-$_buildflavor

	cd "$srcdir"/build-$_buildflavor

	mkdir -p "$_outdir"/boot "$_outdir"/lib/modules

	cd "$srcdir"/build-$_buildflavor
	# modules_install seems to regenerate a defect Modules.symvers. Work
	# around it by backing it up and restore it after modules_install
	cp Module.symvers Module.symvers.backup

	make -j1 modules_install \
		ARCH="$_carch" \
		INSTALL_MOD_PATH="$_outdir" \
		INSTALL_MOD_STRIP=1 STRIP="${CHOST:+$CHOST-}strip"
	cp Module.symvers.backup Module.symvers

	rm -f "$_outdir/boot/System.map"
	rm -f "$_outdir"/lib/modules/$_abi_release/build \
		"$_outdir"/lib/modules/$_abi_release/source
	rm -rf "$_outdir"/lib/firmware

	cp arch/arm/boot/uImage \
		arch/arm/boot/dts/armadillo-iotg-a6e.dtb \
		arch/arm/boot/dts/armadillo-iotg-a6e-*.dtbo \
		arch/arm/boot/dts/armadillo-610.dtb \
		arch/arm/boot/dts/armadillo-610-*.dtbo \
		arch/arm/boot/dts/armadillo-640.dtb \
		arch/arm/boot/dts/armadillo-640-*.dtbo \
		"$_outdir/boot"

	# remove customize dtbo that is left for user
	rm -f "$_outdir/boot/"armadillo*-at-dtweb.dtbo

	# check we removed all at-dtweb and customize dtbo
	if find "$_outdir/boot" | grep -iE 'at-dtweb|customize'; then
		echo "Found user overlays, see above!!"
		return 1
	fi
}

_dbg() {
	local _buildflavor="$1" _outdir="$2"
	local _abi_release=$pkgver-$pkgrel-$_buildflavor

	pkgdesc="Debug files for kernel (vmlinux, modules debug symbols)"
	depends=
	local dir="$_outdir/usr/lib/debug/lib/modules/$_abi_release/"

	cd "$srcdir"/build-$_buildflavor

	mkdir -p "$dir"
	install -Dt "$dir" -m644 Module.symvers System.map vmlinux

	# install module debug symbols
	# we need 'suffix-y= DEPMOD=:' to avoid compressing them successfully
	make -j1 modules_install \
		ARCH="$_carch" \
		INSTALL_MOD_PATH="$_outdir/usr/lib/debug" \
		INSTALL_MOD_STRIP=--only-keep-debug \
		STRIP="${CHOST:+$CHOST-}strip" \
		suffix-y= DEPMOD=:
}

# main flavor installs in $pkgdir
package() {
	# This provide is here for backwards compatiblity with older build-rootfs
	# package lists and should be removed when updating to alpine 3.18
	provides="linux-at-a6e=$pkgver-r$pkgrel"

	_package at "$pkgdir"
}

debug() {
	provides="linux-at-a6e-debug=$pkgver-r$pkgrel"

	_package at-debug "$subpkgdir"
}

dbg() {
	provides="linux-at-a6e-dbg=$pkgver-r$pkgrel"

	_dbg at "$subpkgdir"
}

debug_dbg() {
	provides="linux-at-a6e-debug-dbg=$pkgver-r$pkgrel"

	_dbg at-debug "$subpkgdir"
}

sha512sums="
3e17d698fbb55e39d0e568b67204c72961d8ee030bfbb5b305c60bb8b00e1a8000ca98bd3eb2fe166041d9d34e92fcb865be772a52a20abc60b341e47ea34dc6  linux-5.10-5.10.242-r0.tar.gz
424d53e9b9fbd09c287f58d24ca35d1a4f6627c46fd10fb3d20a90cd2d3e167eea997ff5da6ea0aba7ac746b5a388fe1f0dd2af43905d63f8cbbe577fb7361ef  config-changes-at.armv7
4307ba0795aaca2bfd000feafbe7500c1e28fcebaab649777bf84b4ab23d551e933fdff15f200cc41d7f80d866d1ef9f086ffa0806d3cb13ae5d186f3831dd14  config-changes-at-debug.armv7
"
