Tim Crawford 1d973574fe
scripts: Version EC separately from SBIOS
The original rationale for having the EC version match the SBIOS version
was to ensure that compatible versions of each were installed. So we set
the EC version to the SBIOS version and always flash both of them, even
if only one actually changed.

At some point, a mechanism should be implemented that checks for a
minimum supported/compatible version. This would be comparable to the
LVFS MetaInfo's "requires" field.

Ref: f4f4d5b61dbe ("Build EC as a submodule, specifying version")
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2024-02-28 18:36:04 -07:00

123 lines
3.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
export XGCCPATH="${XGCCPATH:-$PWD/coreboot/util/crossgcc/xgcc/bin}"
export PATH="$XGCCPATH:$PATH:/usr/sbin"
if [ -z "$1" ]
then
echo "$0 <model>" >&2
exit 1
fi
MODEL="$1"
if [ ! -d "models/${MODEL}" ]
then
echo "model '${MODEL}' not found" >&2
exit 1
fi
MODEL_DIR="$(realpath "models/${MODEL}")"
DATE="$(git show --format="%cd" --date="format:%Y-%m-%d" --no-patch --no-show-signature)"
REV="$(git describe --always --dirty --abbrev=7)"
VERSION="${DATE}_${REV}"
echo "Building '${VERSION}' for '${MODEL}'"
# Clean build directory
mkdir -p build
BUILD="$(realpath "build/${MODEL}")"
rm -rf "${BUILD}"
mkdir -p "${BUILD}"
UEFIPAYLOAD="${BUILD}/UEFIPAYLOAD.fd"
COREBOOT="${BUILD}/firmware.rom"
USB="${BUILD}/usb.img"
EDK2_ARGS=(
-D SHELL_TYPE=NONE
-D SOURCE_DEBUG_ENABLE=FALSE
)
# Rebuild firmware-setup (used by edk2)
touch apps/firmware-setup/Cargo.toml
make -C apps/firmware-setup
EDK2_ARGS+=(
-D FIRMWARE_OPEN_FIRMWARE_SETUP="firmware-setup/firmware-setup.inf"
)
# Rebuild gop-policy (used by edk2)
if [ -e "${MODEL_DIR}/IntelGopDriver.inf" ] && [ -e "${MODEL_DIR}/vbt.rom" ]
then
touch apps/gop-policy/Cargo.toml
FIRMWARE_OPEN_VBT="${MODEL_DIR}/vbt.rom" \
make -C apps/gop-policy
EDK2_ARGS+=(
-D FIRMWARE_OPEN_GOP_POLICY="gop-policy/gop-policy.inf"
-D FIRMWARE_OPEN_GOP="IntelGopDriver.inf"
)
fi
# Add any arguments in edk2.config
if [ -e "${MODEL_DIR}/edk2.config" ]
then
while read line
do
if [[ "$line" != "#"* ]]
then
EDK2_ARGS+=(-D "$line")
fi
done < "${MODEL_DIR}/edk2.config"
fi
# Rebuild UefiPayloadPkg using edk2
PACKAGES_PATH="${MODEL_DIR}:$(realpath apps)" \
./scripts/_build/edk2.sh \
"${UEFIPAYLOAD}" \
"${EDK2_ARGS[@]}"
# Rebuild coreboot
# NOTE: coreboot expects paths to be relative to it
FIRMWARE_OPEN_MODEL_DIR="../models/${MODEL}" \
FIRMWARE_OPEN_UEFIPAYLOAD="${UEFIPAYLOAD}" \
KERNELVERSION="${VERSION}" \
./scripts/_build/coreboot.sh \
"${MODEL_DIR}/coreboot.config" \
"${COREBOOT}"
# Rebuild EC firmware for System76 EC models
if [ ! -e "${MODEL_DIR}/ec.rom" ] && [ -e "${MODEL_DIR}/ec.config" ]
then
./scripts/_build/ec.sh \
"${MODEL_DIR}/ec.config" \
"${BUILD}/ec.rom"
fi
if [ "${MODEL}" != "qemu" ]
then
# Rebuild firmware-update
export BASEDIR="system76_${MODEL}_${VERSION}"
pushd apps/firmware-update >/dev/null
rm -rf "build/x86_64-unknown-uefi"
make "build/x86_64-unknown-uefi/boot.img"
cp -v "build/x86_64-unknown-uefi/boot.img" "${USB}.partial"
popd >/dev/null
# Copy firmware to USB image
mmd -i "${USB}.partial@@1M" "::${BASEDIR}/firmware"
mcopy -v -i "${USB}.partial@@1M" "${COREBOOT}" "::${BASEDIR}/firmware/firmware.rom"
if [ -e "${BUILD}/ec.rom" ]
then
mcopy -v -i "${USB}.partial@@1M" "${BUILD}/ec.rom" "::${BASEDIR}/firmware/ec.rom"
elif [ -e "${MODEL_DIR}/ec.rom" ]
then
mcopy -v -i "${USB}.partial@@1M" "${MODEL_DIR}/ec.rom" "::${BASEDIR}/firmware/ec.rom"
fi
if [ -e "${MODEL_DIR}/uecflash.efi" ]
then
mcopy -v -i "${USB}.partial@@1M" "${MODEL_DIR}/uecflash.efi" "::${BASEDIR}/firmware/uecflash.efi"
fi
mv -v "${USB}.partial" "${USB}"
fi
echo "Built '${VERSION}' for '${MODEL}'"