From 965b6a7ed73f1dbd78a353c83b99a88b50c86f38 Mon Sep 17 00:00:00 2001
From: Leah Rowe <leah@libreboot.org>
Date: Fri, 6 Oct 2023 03:32:38 +0100
Subject: rename build/firmware/ to build/fw/

Signed-off-by: Leah Rowe <leah@libreboot.org>
---
 script/build/firmware/coreboot | 415 -----------------------------------------
 script/build/firmware/serprog  |  80 --------
 script/build/fw/coreboot       | 415 +++++++++++++++++++++++++++++++++++++++++
 script/build/fw/serprog        |  80 ++++++++
 4 files changed, 495 insertions(+), 495 deletions(-)
 delete mode 100755 script/build/firmware/coreboot
 delete mode 100755 script/build/firmware/serprog
 create mode 100755 script/build/fw/coreboot
 create mode 100755 script/build/fw/serprog

(limited to 'script/build')

diff --git a/script/build/firmware/coreboot b/script/build/firmware/coreboot
deleted file mode 100755
index 15430255..00000000
--- a/script/build/firmware/coreboot
+++ /dev/null
@@ -1,415 +0,0 @@
-#!/usr/bin/env sh
-# SPDX-License-Identifier: GPL-3.0-or-later
-# SPDX-FileCopyrightText: 2014-2016,2020,2021,2023 Leah Rowe <leah@libreboot.org>
-# SPDX-FileCopyrightText: 2021,2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
-# SPDX-FileCopyrightText: 2022 Caleb La Grange <thonkpeasant@protonmail.com>
-# SPDX-FileCopyrightText: 2022 Alper Nebi Yasak <alpernebiyasak@gmail.com>
-# SPDX-FileCopyrightText: 2023 Riku Viitanen <riku.viitanen@protonmail.com>
-
-[ "x${DEBUG+set}" = 'xset' ] && set -v
-set -u -e
-
-. "include/err.sh"
-. "include/option.sh"
-
-read projectname < projectname
-
-seavgabiosrom="elf/seabios/default/libgfxinit/vgabios.bin"
-grub_background="background1280x800.png"
-grubelf="elf/grub/grub.elf"
-cfgsdir="config/coreboot"
-kmapdir="config/grub/keymap"
-
-# Disable all payloads by default.
-# target.cfg files have to specifically enable [a] payload(s)
-pv="payload_grub payload_grub_withseabios payload_seabios payload_memtest"
-pv="${pv} payload_seabios_withgrub payload_uboot"
-v="romdir cbdir cbfstool cbrom initmode displaymode cbcfg targetdir tree arch"
-v="${v} grub_timeout ubdir blobs_required board grub_scan_disk uboot_config"
-eval "$(setvars "n" ${pv})"
-eval "$(setvars "" ${v})"
-eval "$(setvars "" boards _displaymode _payload _keyboard all targets)"
-
-main()
-{
-	while [ $# -gt 0 ]; do
-		case ${1} in
-		help) usage && exit 0 ;;
-		list) listitems config/coreboot && exit 0 ;;
-		-d) _displaymode="${2}" ;;
-		-p) _payload="${2}" ;;
-		-k) _keyboard="${2}" ;;
-		*)
-			[ "${1}" = "all" ] && all="y"
-			boards="${1} ${boards}"
-			shift && continue ;;
-		esac
-		shift 2
-	done
-
-	[ "${all}" = "y" ] && boards=""
-	[ ! -z ${boards} ] || boards=$(listitems config/coreboot) || \
-	    err "Cannot generate list of boards for building"
-
-	for x in ${boards}; do
-		eval "$(setvars "n" ${pv})"
-		eval "$(setvars "" ${v})"
-		board="${x}"
-		check_target
-		prepare_target
-		[ -f "bin/${x}" ] || continue
-		targets="bin/${x}\n${targets}"
-	done
-
-	[ -z ${targets} ] && err "No ROM images were compiled"
-	printf "ROM images available in these directories:\n${targets%, }\n"
-}
-
-check_target()
-{
-	targetdir="${cfgsdir}/${board}"
-	[ -f "${targetdir}/target.cfg" ] || \
-		err "Missing target.cfg for target: ${board}"
-
-	# Override the above defaults using target.cfg
-	. "${targetdir}/target.cfg"
-
-	[ -z ${grub_scan_disk} ] && \
-		grub_scan_disk="both"
-	[ "${grub_scan_disk}" != "both" ] && [ "${grub_scan_disk}" != "ata" ] \
-	    && [ "${grub_scan_disk}" != "ahci" ] && \
-		grub_scan_disk="both"
-
-	[ -z ${tree} ] && \
-		err "Target '${board}' defines no tree. Skipping build."
-	[ -z ${arch} ] && \
-		err "Target '${board}' defines no arch. Skipping build."
-
-	[ "${payload_memtest}" != "y" ] && \
-		payload_memtest="n"
-	[ "${payload_grub_withseabios}" = "y" ] && \
-		payload_grub="y"
-	[ "${payload_grub_withseabios}" = "y" ] && \
-		eval "$(setvars "y" payload_seabios payload_seabios_withgrub)"
-	[ "${payload_seabios_withgrub}" = "y" ] && \
-		payload_seabios="y"
-
-	# The reverse logic must not be applied. If SeaBIOS-with-GRUB works,
-	# that doesn't mean GRUB-withSeaBIOS will. For example, the board
-	# might have a graphics card whose vga rom coreboot doesn't execute
-	[ "${payload_grub}" != "y" ] && [ "${payload_seabios}" != "y" ] && \
-	    [ "${payload_uboot}" != "y" ] && \
-		for configfile in "${targetdir}/config/"*; do
-			[ -e "${configfile}" ] || continue
-			err "target '${board}' defines no payload"
-		done
-
-	[ "${payload_uboot}" != "n" ] && [ "${payload_uboot}" != "y" ] && \
-		payload_uboot="n"
-	[ "${payload_uboot}" = "y" ] && [ -z ${uboot_config} ] && \
-		uboot_config="default"
-	[ "${blobs_required}" != "n" ] && [ "${blobs_required}" != "y" ] && \
-		blobs_required="y"
-
-	# Override all payload directives with cmdline args
-	[ -z ${_payload} ] && return 0
-	printf "setting payload to: %s\n" "${_payload}"
-	eval "$(setvars "n" payload_grub payload_memtest payload_seabios \
-	    payload_seabios_withgrub payload_uboot payload_grub_withseabios)"
-	eval "payload_${_payload}=y"
-}
-
-prepare_target()
-{
-	romdir="bin/${board}"
-	cbdir="coreboot/${board}"
-	[ "${board}" = "${tree}" ] || cbdir="coreboot/${tree}"
-	cbfstool="cbutils/${tree}/cbfstool"
-	cbrom="${cbdir}/build/coreboot.rom"
-
-	x_ ./build coreboot utils ${tree}
-
-	build_dependency_seabios
-
-	memtest_bin="memtest86plus/build${arch#*_}/memtest.bin"
-	[ "${payload_memtest}" != "y" ] || [ -f "${memtest_bin}" ] || \
-		x_ ./update project build -b ${memtest_bin%/*}
-
-	x_ rm -f "${romdir}/"*
-
-	build_dependency_grub
-	build_dependency_uboot
-	build_target
-}
-
-build_dependency_seabios()
-{
-	[ "${payload_seabios}" = "y" ] || return 0
-
-	if [ ! -f "${seavgabiosrom}" ] \
-	    || [ ! -f elf/seabios/default/libgfxinit/bios.bin.elf ] \
-	    || [ ! -f elf/seabios/default/vgarom/bios.bin.elf ] \
-	    || [ ! -f elf/seabios/default/normal/bios.bin.elf ]; then
-		x_ ./update project build -b seabios
-	fi
-}
-
-build_dependency_grub()
-{
-	[ "${payload_grub}" != "y" ] && \
-	    [ "${payload_seabios_withgrub}" != "y" ] && return 0
-
-	rebuild_grub="n"
-	[ -f "${grubelf}" ] || rebuild_grub="y"
-	for keymapfile in "${kmapdir}"/*.gkb; do
-		[ "${rebuild_grub}" = "y" ] || break
-		[ -f "${keymapfile}" ] || continue
-
-		keymap="${keymapfile##*/}"
-		keymap="${keymap%.gkb}"
-		[ ! -f "elf/grub/keymap_${keymap}.cfg" ] && \
-		    rebuild_grub="y" && break
-	done
-	[ "${rebuild_grub}" = "y" ] || return 0
-	x_ ./build coreboot grub
-}
-
-build_dependency_uboot()
-{
-	[ "${payload_uboot}" = "y" ] || return 0
-
-	x_ ./update project build -b u-boot ${board}
-	ubdir="elf/u-boot/${board}/${uboot_config}"
-	ubootelf="${ubdir}/u-boot.elf"
-	[ ! -f "${ubootelf}" ] && [ -f "${ubdir}/u-boot.bin" ] && \
-		ubootelf="${ubdir}/u-boot.bin"
-	[ -f "${ubootelf}" ] && return 0
-	err "Could not find u-boot build for board, ${board}"
-}
-
-build_target()
-{
-	for x in "normal" "vgarom" "libgfxinit"; do
-		initmode="${x}"
-		hmode="vesafb"
-		[ "${initmode}" = "vgarom" ] || hmode="corebootfb"
-		modes="${hmode} txtmode"
-		[ -z ${_displaymode} ] || modes="${_displaymode}"
-		for y in ${modes}; do
-			displaymode="${y}"
-			[ "${initmode}" = "normal" ] && \
-			    [ "$displaymode" != "txtmode" ] && continue
-			cbcfg="${targetdir}/config/${initmode}_${displaymode}"
-			[ "${initmode}" = "normal" ] && cbcfg="${cbcfg%_*}"
-			build_roms "${cbcfg}"	
-		done
-	done
-}
-
-# Main ROM building function. This calls all other functions below
-build_roms()
-{
-	cbcfg="${1}"
-	[ ! -f "${cbcfg}" ] && \
-		printf "'%s' does not exist. Skipping build for %s %s %s\n" \
-		    "${cbcfg}" "${board}" "${displaymode}" "${initmode}" \
-		    1>&2 && return 0
-
-	x_ ./update project build -b coreboot ${board}
-
-	_cbrom="elf/coreboot/${board}/${initmode}_${displaymode}"
-	[ "${initmode}" = "normal" ] && \
-		_cbrom="${_cbrom%_${displaymode}}"
-	_cbrom="${_cbrom}/coreboot.rom"
-	cbrom="$(mktemp -t coreboot_rom.XXXXXXXXXX)"
-	x_ cp "${_cbrom}" "${cbrom}"
-
-	[ "${payload_memtest}" != "y" ] || \
-		x_ "${cbfstool}" "${cbrom}" add-payload \
-		    -f "${memtest_bin}" -n img/memtest -c lzma
-	[ "${payload_seabios}" = "y" ] && \
-		build_seabios_roms
-	[ "${payload_grub}" != "y" ] || \
-		x_ build_grub_roms "${cbrom}" "grub"
-	[ "${payload_uboot}" = "y" ] || return 0
-	build_uboot_roms
-}
-
-build_seabios_roms()
-{
-	if [ "${payload_seabios_withgrub}" = "y" ]; then
-		tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX)
-		x_ cp "${cbrom}" "${tmprom}"
-		x_ build_grub_roms "${tmprom}" "seabios_withgrub"
-		x_ rm -f "${tmprom}"
-	else
-		t=$(mkSeabiosRom "${cbrom}" "fallback/payload") || \
-		    err "build_seabios_roms: cannot build tmprom"
-		newrom="${romdir}/seabios_${board}_${initmode}_${displaymode}"
-		[ "${initmode}" = "normal" ] && newrom="${romdir}/seabios" \
-			&& newrom="${newrom}_${board}_${initmode}"
-		x_ moverom "${t}" "${newrom}.rom"
-		x_ rm -f "${t}"
-	fi
-}
-
-# Make separate ROM images with GRUB payload, for each supported keymap
-build_grub_roms()
-{
-	tmprom="${1}"
-	payload1="${2}" # allow values: grub, seabios, seabios_withgrub
-
-	grub_cbfs="fallback/payload"
-	[ "${payload1}" = "grub" ] && [ "${payload_grub_withseabios}" = "y" ] \
-		&& x_ mv "$(mkSeabiosRom "${tmprom}" "seabios.elf")" "${tmprom}"
-	[ "${payload1}" != "grub" ] && [ "${payload_seabios_withgrub}" = "y" ] \
-		&& grub_cbfs="img/grub2" && \
-		x_ mv "$(mkSeabiosRom "${tmprom}" fallback/payload)" "${tmprom}"
-
-	# we only need insert grub.elf once, for each coreboot config:
-	x_ "${cbfstool}" "${tmprom}" add-payload -f "${grubelf}" \
-	    -n ${grub_cbfs} -c lzma
-
-	# we only need insert background.png once, for each coreboot config:
-	if [ "${displaymode}" = "vesafb" ] || \
-	    [ "${displaymode}" = "corebootfb" ]; then
-		backgroundfile="config/grub/background/${grub_background}"
-		x_ "${cbfstool}" "${tmprom}" add -f ${backgroundfile} \
-		    -n background.png -t raw
-	fi
-
-	tmpcfg=$(mktemp -t coreboot_rom.XXXXXXXXXX)
-	x_ printf "set grub_scan_disk=\"%s\"\n" "${grub_scan_disk}" >"${tmpcfg}"
-	[ "${grub_scan_disk}" = "both" ] || \
-	    x_ "${cbfstool}" "${tmprom}" add -f "${tmpcfg}" -n scan.cfg -t raw
-	x_ printf "set timeout=%s\n" "${grub_timeout}" > "${tmpcfg}"
-	[ -z "${grub_timeout}" ] || x_ "${cbfstool}" "${tmprom}" add \
-	    -f "${tmpcfg}" -n timeout.cfg -t raw
-	x_ rm -f "${tmpcfg}"
-
-	keymaps=""
-	for kmapfile in "${kmapdir}"/*; do
-		keymaps="${keymaps} ${kmapfile}"
-	done
-	[ -z ${_keyboard} ] || keymaps="${kmapdir}/${_keyboard}.gkb"
-
-	for keymapfile in ${keymaps}; do
-		[ -f "${keymapfile}" ] || continue
-		keymap="${keymapfile##*/}"
-		keymap="${keymap%.gkb}"
-		tmpgrubrom="$(mkGrubRom "${keymap}" "${tmprom}")"
-
-		newrom="${romdir}/${payload1}_${board}_${initmode}_"
-		newrom="${newrom}${displaymode}_${keymap}.rom"
-		[ "${initmode}" = "normal" ] && \
-			newrom="${romdir}/${payload1}_${board}_" && \
-			newrom="${newrom}${initmode}_${keymap}.rom"
-		x_ moverom "${tmpgrubrom}" "${newrom}"
-		x_ rm -f "${tmpgrubrom}"
-	done
-}
-
-# make a rom in /tmp/ and then print the path of that ROM
-mkGrubRom() {
-	_keymap="${1}"
-	_cbrom="${2}"
-
-	keymapcfg="elf/grub/keymap_${_keymap}.cfg"
-
-	tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX)
-	x_ cp "${_cbrom}" "${tmprom}"
-	x_ "${cbfstool}" "${tmprom}" add -f "${keymapcfg}" -n keymap.cfg -t raw
-
-	printf "%s\n" "${tmprom}"
-}
-
-# make a rom in /tmp/ and then print the path of that ROM
-mkSeabiosRom() {
-	_cbrom="${1}" # rom to insert seabios in. will not be touched
-		# (a tmpfile will be made instead)
-	_seabios_cbfs_path="${2}" # e.g. fallback/payload
-	_seabioself="elf/seabios/default/${initmode}/bios.bin.elf"
-	tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX)
-
-	x_ cp "${_cbrom}" "${tmprom}"
-	x_ "${cbfstool}" "${tmprom}" add-payload -f "${_seabioself}" \
-	    -n ${_seabios_cbfs_path} -c lzma
-	x_ "${cbfstool}" "${tmprom}" add-int -i 3000 -n etc/ps2-keyboard-spinup
-
-	z="2"; [ "${initmode}" = "vgarom" ] && z="0"
-	x_ "${cbfstool}" "${tmprom}" add-int -i $z -n etc/pci-optionrom-exec
-	x_ "${cbfstool}" "${tmprom}" add-int -i 0 -n etc/optionroms-checksum
-	[ "${initmode}" != "libgfxinit" ] || \
-		x_ "${cbfstool}" "${tmprom}" add -f "${seavgabiosrom}" \
-		    -n vgaroms/seavgabios.bin -t raw
-
-	printf "%s\n" "${tmprom}"
-}
-
-build_uboot_roms()
-{
-	tmprom="$(mkUbootRom "${cbrom}" "fallback/payload")"
-	newrom="${romdir}/uboot_payload_${board}_${initmode}_${displaymode}.rom"
-	[ "${initmode}" = "normal" ] && \
-		newrom="${romdir}/uboot_payload_${board}_${initmode}.rom"
-	x_ moverom "${tmprom}" "${newrom}"
-	x_ rm -f "${tmprom}"
-}
-
-# make a rom in /tmp/ and then print the path of that ROM
-mkUbootRom() {
-	_cbrom="${1}"
-	_uboot_cbfs_path="${2}"
-
-	_ubdir="elf/u-boot/${board}/${uboot_config}"
-	_ubootelf="${_ubdir}/u-boot.elf"
-	[ -f "${_ubootelf}" ] || _ubootelf="${_ubdir}/u-boot.bin"
-	[ -f "${_ubootelf}" ] || err "mkUbootRom: ${board}: cant find u-boot"
-
-	tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX)
-
-	x_ cp "${_cbrom}" "${tmprom}"
-	x_ "${cbfstool}" "${tmprom}" add-payload -f "${_ubootelf}" \
-	    -n ${_uboot_cbfs_path} -c lzma
-
-	printf "%s\n" "${tmprom}"
-}
-
-# it is assumed that no other work will be done on the ROM
-# after calling this function. therefore this function is "final"
-moverom() {
-	rompath="${1}"
-	newrom="${2}"
-
-	printf "Creating target image: %s\n" "${newrom}"
-
-	[ -d "${newrom%/*}" ] || x_ mkdir -p "${newrom%/*}/"
-	[ "${blobs_required}" = "n" ] && newrom="${newrom%.rom}_noblobs.rom"
-	x_ cp "${rompath}" "${newrom}"
-}
-
-usage()
-{
-	cat <<- EOF
-	USAGE:	./build firmware coreboot target
-	To build *all* boards, do this: ./build firmware coreboot all
-	To list *all* boards, do this: ./build firmware coreboot list
-	
-	Optional Flags:
-	-d: displaymode
-	-p: payload
-	-k: keyboard layout
-
-	Example commands:
-		./build firmware coreboot x60
-		./build firmware coreboot x200_8mb x60
-		./build firmware coreboot x60 -p grub -d corebootfb -k usqwerty
-
-	possible values for 'target':
-	$(listitems "config/coreboot")
-
-	Refer to the ${projectname} documentation for more information.
-	EOF
-}
-
-main $@
diff --git a/script/build/firmware/serprog b/script/build/firmware/serprog
deleted file mode 100755
index 0966af77..00000000
--- a/script/build/firmware/serprog
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env sh
-# SPDX-License-Identifier: GPL-3.0-or-later
-# SPDX-FileCopyrightText: 2023 Riku Viitanen <riku.viitanen@protonmail.com>
-
-[ "x${DEBUG+set}" = 'xset' ] && set -v
-set -u -e
-
-. "include/err.sh"
-
-pico_src_dir=util-fw/rp2040/pico-serprog
-pico_sdk_dir=util-fw/rp2040/pico-sdk
-
-stm32_src_dir=util-fw/stm32-vserprog
-
-usage="usage: ./build firmware serprog <rp2040|stm32> [board]"
-
-main()
-{
-	[ -z "${1+x}" ] && err "${usage}"
-	if [ "${1}" = "rp2040" ]; then
-		platform="rp2040"
-		boards_dir=${pico_sdk_dir}/src/boards/include/boards
-		[ -d "${pico_src_dir}/" ] || \
-			x_ ./update project repo "rpi-pico-serprog"
-	elif [ "${1}" = "stm32" ]; then
-		platform="stm32"
-		boards_dir=${stm32_src_dir}/boards
-		[ -d "${stm32_src_dir}/" ] || \
-			x_ ./update project repo "stm32-vserprog"
-	else
-		err "${usage}"
-	fi
-	x_ mkdir -p "bin/serprog_${platform}"
-
-	if [ $# -gt 1 ] ; then
-		[ "${2}" = "list" ] && print_boards ${boards_dir} && return 0
-		build_${platform}_rom "${2}"
-	else
-		printf "Building all serprog targets\n"
-		list_boards "${boards_dir}" | while read board; do
-			build_${platform}_rom "${board}"
-		done
-	fi
-}
-
-build_rp2040_rom()
-{
-	board=${1}
-	printf "Building pico-serprog for ${board}\n"
-	x_ cmake -DPICO_BOARD="${board}" -DPICO_SDK_PATH="${pico_sdk_dir}" \
-	    -B "${pico_src_dir}/build" "${pico_src_dir}"
-	x_ cmake --build "${pico_src_dir}/build"
-	x_ mv ${pico_src_dir}/build/pico_serprog.uf2 \
-	   bin/serprog_rp2040/serprog_${board}.uf2
-	printf "output to bin/serprog_rp2040/serprog_${board}.uf2\n"
-}
-
-build_stm32_rom()
-{
-	board=${1}
-	printf "Building stm32-vserprog for ${board}\n"
-	x_ make -C ${stm32_src_dir} libopencm3-just-make BOARD=${board}
-	x_ make -C ${stm32_src_dir} BOARD=${board}
-	x_ mv ${stm32_src_dir}/stm32-vserprog.hex \
-	   bin/serprog_stm32/serprog_${board}.hex
-	printf "output to bin/serprog_stm32/serprog_${board}.hex\n"
-}
-
-print_boards()
-{
-	printf "Available boards:\n"
-	list_boards "${1}"
-}
-
-list_boards()
-{
-	basename -a -s .h ${1}/*.h
-}
-
-main $@
diff --git a/script/build/fw/coreboot b/script/build/fw/coreboot
new file mode 100755
index 00000000..15430255
--- /dev/null
+++ b/script/build/fw/coreboot
@@ -0,0 +1,415 @@
+#!/usr/bin/env sh
+# SPDX-License-Identifier: GPL-3.0-or-later
+# SPDX-FileCopyrightText: 2014-2016,2020,2021,2023 Leah Rowe <leah@libreboot.org>
+# SPDX-FileCopyrightText: 2021,2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
+# SPDX-FileCopyrightText: 2022 Caleb La Grange <thonkpeasant@protonmail.com>
+# SPDX-FileCopyrightText: 2022 Alper Nebi Yasak <alpernebiyasak@gmail.com>
+# SPDX-FileCopyrightText: 2023 Riku Viitanen <riku.viitanen@protonmail.com>
+
+[ "x${DEBUG+set}" = 'xset' ] && set -v
+set -u -e
+
+. "include/err.sh"
+. "include/option.sh"
+
+read projectname < projectname
+
+seavgabiosrom="elf/seabios/default/libgfxinit/vgabios.bin"
+grub_background="background1280x800.png"
+grubelf="elf/grub/grub.elf"
+cfgsdir="config/coreboot"
+kmapdir="config/grub/keymap"
+
+# Disable all payloads by default.
+# target.cfg files have to specifically enable [a] payload(s)
+pv="payload_grub payload_grub_withseabios payload_seabios payload_memtest"
+pv="${pv} payload_seabios_withgrub payload_uboot"
+v="romdir cbdir cbfstool cbrom initmode displaymode cbcfg targetdir tree arch"
+v="${v} grub_timeout ubdir blobs_required board grub_scan_disk uboot_config"
+eval "$(setvars "n" ${pv})"
+eval "$(setvars "" ${v})"
+eval "$(setvars "" boards _displaymode _payload _keyboard all targets)"
+
+main()
+{
+	while [ $# -gt 0 ]; do
+		case ${1} in
+		help) usage && exit 0 ;;
+		list) listitems config/coreboot && exit 0 ;;
+		-d) _displaymode="${2}" ;;
+		-p) _payload="${2}" ;;
+		-k) _keyboard="${2}" ;;
+		*)
+			[ "${1}" = "all" ] && all="y"
+			boards="${1} ${boards}"
+			shift && continue ;;
+		esac
+		shift 2
+	done
+
+	[ "${all}" = "y" ] && boards=""
+	[ ! -z ${boards} ] || boards=$(listitems config/coreboot) || \
+	    err "Cannot generate list of boards for building"
+
+	for x in ${boards}; do
+		eval "$(setvars "n" ${pv})"
+		eval "$(setvars "" ${v})"
+		board="${x}"
+		check_target
+		prepare_target
+		[ -f "bin/${x}" ] || continue
+		targets="bin/${x}\n${targets}"
+	done
+
+	[ -z ${targets} ] && err "No ROM images were compiled"
+	printf "ROM images available in these directories:\n${targets%, }\n"
+}
+
+check_target()
+{
+	targetdir="${cfgsdir}/${board}"
+	[ -f "${targetdir}/target.cfg" ] || \
+		err "Missing target.cfg for target: ${board}"
+
+	# Override the above defaults using target.cfg
+	. "${targetdir}/target.cfg"
+
+	[ -z ${grub_scan_disk} ] && \
+		grub_scan_disk="both"
+	[ "${grub_scan_disk}" != "both" ] && [ "${grub_scan_disk}" != "ata" ] \
+	    && [ "${grub_scan_disk}" != "ahci" ] && \
+		grub_scan_disk="both"
+
+	[ -z ${tree} ] && \
+		err "Target '${board}' defines no tree. Skipping build."
+	[ -z ${arch} ] && \
+		err "Target '${board}' defines no arch. Skipping build."
+
+	[ "${payload_memtest}" != "y" ] && \
+		payload_memtest="n"
+	[ "${payload_grub_withseabios}" = "y" ] && \
+		payload_grub="y"
+	[ "${payload_grub_withseabios}" = "y" ] && \
+		eval "$(setvars "y" payload_seabios payload_seabios_withgrub)"
+	[ "${payload_seabios_withgrub}" = "y" ] && \
+		payload_seabios="y"
+
+	# The reverse logic must not be applied. If SeaBIOS-with-GRUB works,
+	# that doesn't mean GRUB-withSeaBIOS will. For example, the board
+	# might have a graphics card whose vga rom coreboot doesn't execute
+	[ "${payload_grub}" != "y" ] && [ "${payload_seabios}" != "y" ] && \
+	    [ "${payload_uboot}" != "y" ] && \
+		for configfile in "${targetdir}/config/"*; do
+			[ -e "${configfile}" ] || continue
+			err "target '${board}' defines no payload"
+		done
+
+	[ "${payload_uboot}" != "n" ] && [ "${payload_uboot}" != "y" ] && \
+		payload_uboot="n"
+	[ "${payload_uboot}" = "y" ] && [ -z ${uboot_config} ] && \
+		uboot_config="default"
+	[ "${blobs_required}" != "n" ] && [ "${blobs_required}" != "y" ] && \
+		blobs_required="y"
+
+	# Override all payload directives with cmdline args
+	[ -z ${_payload} ] && return 0
+	printf "setting payload to: %s\n" "${_payload}"
+	eval "$(setvars "n" payload_grub payload_memtest payload_seabios \
+	    payload_seabios_withgrub payload_uboot payload_grub_withseabios)"
+	eval "payload_${_payload}=y"
+}
+
+prepare_target()
+{
+	romdir="bin/${board}"
+	cbdir="coreboot/${board}"
+	[ "${board}" = "${tree}" ] || cbdir="coreboot/${tree}"
+	cbfstool="cbutils/${tree}/cbfstool"
+	cbrom="${cbdir}/build/coreboot.rom"
+
+	x_ ./build coreboot utils ${tree}
+
+	build_dependency_seabios
+
+	memtest_bin="memtest86plus/build${arch#*_}/memtest.bin"
+	[ "${payload_memtest}" != "y" ] || [ -f "${memtest_bin}" ] || \
+		x_ ./update project build -b ${memtest_bin%/*}
+
+	x_ rm -f "${romdir}/"*
+
+	build_dependency_grub
+	build_dependency_uboot
+	build_target
+}
+
+build_dependency_seabios()
+{
+	[ "${payload_seabios}" = "y" ] || return 0
+
+	if [ ! -f "${seavgabiosrom}" ] \
+	    || [ ! -f elf/seabios/default/libgfxinit/bios.bin.elf ] \
+	    || [ ! -f elf/seabios/default/vgarom/bios.bin.elf ] \
+	    || [ ! -f elf/seabios/default/normal/bios.bin.elf ]; then
+		x_ ./update project build -b seabios
+	fi
+}
+
+build_dependency_grub()
+{
+	[ "${payload_grub}" != "y" ] && \
+	    [ "${payload_seabios_withgrub}" != "y" ] && return 0
+
+	rebuild_grub="n"
+	[ -f "${grubelf}" ] || rebuild_grub="y"
+	for keymapfile in "${kmapdir}"/*.gkb; do
+		[ "${rebuild_grub}" = "y" ] || break
+		[ -f "${keymapfile}" ] || continue
+
+		keymap="${keymapfile##*/}"
+		keymap="${keymap%.gkb}"
+		[ ! -f "elf/grub/keymap_${keymap}.cfg" ] && \
+		    rebuild_grub="y" && break
+	done
+	[ "${rebuild_grub}" = "y" ] || return 0
+	x_ ./build coreboot grub
+}
+
+build_dependency_uboot()
+{
+	[ "${payload_uboot}" = "y" ] || return 0
+
+	x_ ./update project build -b u-boot ${board}
+	ubdir="elf/u-boot/${board}/${uboot_config}"
+	ubootelf="${ubdir}/u-boot.elf"
+	[ ! -f "${ubootelf}" ] && [ -f "${ubdir}/u-boot.bin" ] && \
+		ubootelf="${ubdir}/u-boot.bin"
+	[ -f "${ubootelf}" ] && return 0
+	err "Could not find u-boot build for board, ${board}"
+}
+
+build_target()
+{
+	for x in "normal" "vgarom" "libgfxinit"; do
+		initmode="${x}"
+		hmode="vesafb"
+		[ "${initmode}" = "vgarom" ] || hmode="corebootfb"
+		modes="${hmode} txtmode"
+		[ -z ${_displaymode} ] || modes="${_displaymode}"
+		for y in ${modes}; do
+			displaymode="${y}"
+			[ "${initmode}" = "normal" ] && \
+			    [ "$displaymode" != "txtmode" ] && continue
+			cbcfg="${targetdir}/config/${initmode}_${displaymode}"
+			[ "${initmode}" = "normal" ] && cbcfg="${cbcfg%_*}"
+			build_roms "${cbcfg}"	
+		done
+	done
+}
+
+# Main ROM building function. This calls all other functions below
+build_roms()
+{
+	cbcfg="${1}"
+	[ ! -f "${cbcfg}" ] && \
+		printf "'%s' does not exist. Skipping build for %s %s %s\n" \
+		    "${cbcfg}" "${board}" "${displaymode}" "${initmode}" \
+		    1>&2 && return 0
+
+	x_ ./update project build -b coreboot ${board}
+
+	_cbrom="elf/coreboot/${board}/${initmode}_${displaymode}"
+	[ "${initmode}" = "normal" ] && \
+		_cbrom="${_cbrom%_${displaymode}}"
+	_cbrom="${_cbrom}/coreboot.rom"
+	cbrom="$(mktemp -t coreboot_rom.XXXXXXXXXX)"
+	x_ cp "${_cbrom}" "${cbrom}"
+
+	[ "${payload_memtest}" != "y" ] || \
+		x_ "${cbfstool}" "${cbrom}" add-payload \
+		    -f "${memtest_bin}" -n img/memtest -c lzma
+	[ "${payload_seabios}" = "y" ] && \
+		build_seabios_roms
+	[ "${payload_grub}" != "y" ] || \
+		x_ build_grub_roms "${cbrom}" "grub"
+	[ "${payload_uboot}" = "y" ] || return 0
+	build_uboot_roms
+}
+
+build_seabios_roms()
+{
+	if [ "${payload_seabios_withgrub}" = "y" ]; then
+		tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX)
+		x_ cp "${cbrom}" "${tmprom}"
+		x_ build_grub_roms "${tmprom}" "seabios_withgrub"
+		x_ rm -f "${tmprom}"
+	else
+		t=$(mkSeabiosRom "${cbrom}" "fallback/payload") || \
+		    err "build_seabios_roms: cannot build tmprom"
+		newrom="${romdir}/seabios_${board}_${initmode}_${displaymode}"
+		[ "${initmode}" = "normal" ] && newrom="${romdir}/seabios" \
+			&& newrom="${newrom}_${board}_${initmode}"
+		x_ moverom "${t}" "${newrom}.rom"
+		x_ rm -f "${t}"
+	fi
+}
+
+# Make separate ROM images with GRUB payload, for each supported keymap
+build_grub_roms()
+{
+	tmprom="${1}"
+	payload1="${2}" # allow values: grub, seabios, seabios_withgrub
+
+	grub_cbfs="fallback/payload"
+	[ "${payload1}" = "grub" ] && [ "${payload_grub_withseabios}" = "y" ] \
+		&& x_ mv "$(mkSeabiosRom "${tmprom}" "seabios.elf")" "${tmprom}"
+	[ "${payload1}" != "grub" ] && [ "${payload_seabios_withgrub}" = "y" ] \
+		&& grub_cbfs="img/grub2" && \
+		x_ mv "$(mkSeabiosRom "${tmprom}" fallback/payload)" "${tmprom}"
+
+	# we only need insert grub.elf once, for each coreboot config:
+	x_ "${cbfstool}" "${tmprom}" add-payload -f "${grubelf}" \
+	    -n ${grub_cbfs} -c lzma
+
+	# we only need insert background.png once, for each coreboot config:
+	if [ "${displaymode}" = "vesafb" ] || \
+	    [ "${displaymode}" = "corebootfb" ]; then
+		backgroundfile="config/grub/background/${grub_background}"
+		x_ "${cbfstool}" "${tmprom}" add -f ${backgroundfile} \
+		    -n background.png -t raw
+	fi
+
+	tmpcfg=$(mktemp -t coreboot_rom.XXXXXXXXXX)
+	x_ printf "set grub_scan_disk=\"%s\"\n" "${grub_scan_disk}" >"${tmpcfg}"
+	[ "${grub_scan_disk}" = "both" ] || \
+	    x_ "${cbfstool}" "${tmprom}" add -f "${tmpcfg}" -n scan.cfg -t raw
+	x_ printf "set timeout=%s\n" "${grub_timeout}" > "${tmpcfg}"
+	[ -z "${grub_timeout}" ] || x_ "${cbfstool}" "${tmprom}" add \
+	    -f "${tmpcfg}" -n timeout.cfg -t raw
+	x_ rm -f "${tmpcfg}"
+
+	keymaps=""
+	for kmapfile in "${kmapdir}"/*; do
+		keymaps="${keymaps} ${kmapfile}"
+	done
+	[ -z ${_keyboard} ] || keymaps="${kmapdir}/${_keyboard}.gkb"
+
+	for keymapfile in ${keymaps}; do
+		[ -f "${keymapfile}" ] || continue
+		keymap="${keymapfile##*/}"
+		keymap="${keymap%.gkb}"
+		tmpgrubrom="$(mkGrubRom "${keymap}" "${tmprom}")"
+
+		newrom="${romdir}/${payload1}_${board}_${initmode}_"
+		newrom="${newrom}${displaymode}_${keymap}.rom"
+		[ "${initmode}" = "normal" ] && \
+			newrom="${romdir}/${payload1}_${board}_" && \
+			newrom="${newrom}${initmode}_${keymap}.rom"
+		x_ moverom "${tmpgrubrom}" "${newrom}"
+		x_ rm -f "${tmpgrubrom}"
+	done
+}
+
+# make a rom in /tmp/ and then print the path of that ROM
+mkGrubRom() {
+	_keymap="${1}"
+	_cbrom="${2}"
+
+	keymapcfg="elf/grub/keymap_${_keymap}.cfg"
+
+	tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX)
+	x_ cp "${_cbrom}" "${tmprom}"
+	x_ "${cbfstool}" "${tmprom}" add -f "${keymapcfg}" -n keymap.cfg -t raw
+
+	printf "%s\n" "${tmprom}"
+}
+
+# make a rom in /tmp/ and then print the path of that ROM
+mkSeabiosRom() {
+	_cbrom="${1}" # rom to insert seabios in. will not be touched
+		# (a tmpfile will be made instead)
+	_seabios_cbfs_path="${2}" # e.g. fallback/payload
+	_seabioself="elf/seabios/default/${initmode}/bios.bin.elf"
+	tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX)
+
+	x_ cp "${_cbrom}" "${tmprom}"
+	x_ "${cbfstool}" "${tmprom}" add-payload -f "${_seabioself}" \
+	    -n ${_seabios_cbfs_path} -c lzma
+	x_ "${cbfstool}" "${tmprom}" add-int -i 3000 -n etc/ps2-keyboard-spinup
+
+	z="2"; [ "${initmode}" = "vgarom" ] && z="0"
+	x_ "${cbfstool}" "${tmprom}" add-int -i $z -n etc/pci-optionrom-exec
+	x_ "${cbfstool}" "${tmprom}" add-int -i 0 -n etc/optionroms-checksum
+	[ "${initmode}" != "libgfxinit" ] || \
+		x_ "${cbfstool}" "${tmprom}" add -f "${seavgabiosrom}" \
+		    -n vgaroms/seavgabios.bin -t raw
+
+	printf "%s\n" "${tmprom}"
+}
+
+build_uboot_roms()
+{
+	tmprom="$(mkUbootRom "${cbrom}" "fallback/payload")"
+	newrom="${romdir}/uboot_payload_${board}_${initmode}_${displaymode}.rom"
+	[ "${initmode}" = "normal" ] && \
+		newrom="${romdir}/uboot_payload_${board}_${initmode}.rom"
+	x_ moverom "${tmprom}" "${newrom}"
+	x_ rm -f "${tmprom}"
+}
+
+# make a rom in /tmp/ and then print the path of that ROM
+mkUbootRom() {
+	_cbrom="${1}"
+	_uboot_cbfs_path="${2}"
+
+	_ubdir="elf/u-boot/${board}/${uboot_config}"
+	_ubootelf="${_ubdir}/u-boot.elf"
+	[ -f "${_ubootelf}" ] || _ubootelf="${_ubdir}/u-boot.bin"
+	[ -f "${_ubootelf}" ] || err "mkUbootRom: ${board}: cant find u-boot"
+
+	tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX)
+
+	x_ cp "${_cbrom}" "${tmprom}"
+	x_ "${cbfstool}" "${tmprom}" add-payload -f "${_ubootelf}" \
+	    -n ${_uboot_cbfs_path} -c lzma
+
+	printf "%s\n" "${tmprom}"
+}
+
+# it is assumed that no other work will be done on the ROM
+# after calling this function. therefore this function is "final"
+moverom() {
+	rompath="${1}"
+	newrom="${2}"
+
+	printf "Creating target image: %s\n" "${newrom}"
+
+	[ -d "${newrom%/*}" ] || x_ mkdir -p "${newrom%/*}/"
+	[ "${blobs_required}" = "n" ] && newrom="${newrom%.rom}_noblobs.rom"
+	x_ cp "${rompath}" "${newrom}"
+}
+
+usage()
+{
+	cat <<- EOF
+	USAGE:	./build firmware coreboot target
+	To build *all* boards, do this: ./build firmware coreboot all
+	To list *all* boards, do this: ./build firmware coreboot list
+	
+	Optional Flags:
+	-d: displaymode
+	-p: payload
+	-k: keyboard layout
+
+	Example commands:
+		./build firmware coreboot x60
+		./build firmware coreboot x200_8mb x60
+		./build firmware coreboot x60 -p grub -d corebootfb -k usqwerty
+
+	possible values for 'target':
+	$(listitems "config/coreboot")
+
+	Refer to the ${projectname} documentation for more information.
+	EOF
+}
+
+main $@
diff --git a/script/build/fw/serprog b/script/build/fw/serprog
new file mode 100755
index 00000000..0966af77
--- /dev/null
+++ b/script/build/fw/serprog
@@ -0,0 +1,80 @@
+#!/usr/bin/env sh
+# SPDX-License-Identifier: GPL-3.0-or-later
+# SPDX-FileCopyrightText: 2023 Riku Viitanen <riku.viitanen@protonmail.com>
+
+[ "x${DEBUG+set}" = 'xset' ] && set -v
+set -u -e
+
+. "include/err.sh"
+
+pico_src_dir=util-fw/rp2040/pico-serprog
+pico_sdk_dir=util-fw/rp2040/pico-sdk
+
+stm32_src_dir=util-fw/stm32-vserprog
+
+usage="usage: ./build firmware serprog <rp2040|stm32> [board]"
+
+main()
+{
+	[ -z "${1+x}" ] && err "${usage}"
+	if [ "${1}" = "rp2040" ]; then
+		platform="rp2040"
+		boards_dir=${pico_sdk_dir}/src/boards/include/boards
+		[ -d "${pico_src_dir}/" ] || \
+			x_ ./update project repo "rpi-pico-serprog"
+	elif [ "${1}" = "stm32" ]; then
+		platform="stm32"
+		boards_dir=${stm32_src_dir}/boards
+		[ -d "${stm32_src_dir}/" ] || \
+			x_ ./update project repo "stm32-vserprog"
+	else
+		err "${usage}"
+	fi
+	x_ mkdir -p "bin/serprog_${platform}"
+
+	if [ $# -gt 1 ] ; then
+		[ "${2}" = "list" ] && print_boards ${boards_dir} && return 0
+		build_${platform}_rom "${2}"
+	else
+		printf "Building all serprog targets\n"
+		list_boards "${boards_dir}" | while read board; do
+			build_${platform}_rom "${board}"
+		done
+	fi
+}
+
+build_rp2040_rom()
+{
+	board=${1}
+	printf "Building pico-serprog for ${board}\n"
+	x_ cmake -DPICO_BOARD="${board}" -DPICO_SDK_PATH="${pico_sdk_dir}" \
+	    -B "${pico_src_dir}/build" "${pico_src_dir}"
+	x_ cmake --build "${pico_src_dir}/build"
+	x_ mv ${pico_src_dir}/build/pico_serprog.uf2 \
+	   bin/serprog_rp2040/serprog_${board}.uf2
+	printf "output to bin/serprog_rp2040/serprog_${board}.uf2\n"
+}
+
+build_stm32_rom()
+{
+	board=${1}
+	printf "Building stm32-vserprog for ${board}\n"
+	x_ make -C ${stm32_src_dir} libopencm3-just-make BOARD=${board}
+	x_ make -C ${stm32_src_dir} BOARD=${board}
+	x_ mv ${stm32_src_dir}/stm32-vserprog.hex \
+	   bin/serprog_stm32/serprog_${board}.hex
+	printf "output to bin/serprog_stm32/serprog_${board}.hex\n"
+}
+
+print_boards()
+{
+	printf "Available boards:\n"
+	list_boards "${1}"
+}
+
+list_boards()
+{
+	basename -a -s .h ${1}/*.h
+}
+
+main $@
-- 
cgit v1.2.1