mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-11 14:02:52 +02:00
b30c7e330b
The same ROM images that you flash on Intel GPU variants, are now flashed on Nvidia models. The same ROM will work on both. If an Intel GPU variant is present, libgfxinit is used, and the VGA ROM is used if an Nvidia GPU variant; however, release ROMs will scrub the nvidia option ROM, so release ROMs will only work on Intel GPUs unless you run the blobutil inject command. I decided to no longer have this under WIP, but to put it in master. The issue with it pertains to video drivers, which is not Libreboot's problem. Nouveau crashes under Linux, so use "nomodeset" if it does. The "nv" drivers in BSD systems work very well. The nvidia model of E6400 isn't recommended for other reasons, namely: poor thermal cooling (thermal pad on the GPU) and that Nvidia GPU doesn't get very good performance on any libre drivers anyway. The Intel GPU variant is better, in terms of power efficiency and software support; the intel variant also works with native graphics initialisation in coreboot. This board port already only enables SeaBIOS, which will simply execute the VGA ROM. Blobutil already supports reading the config, detecting that a VGA ROM is needed, because that part of the WIP E6400 branch was already merged in lbmk master. Signed-off-by: Leah Rowe <leah@libreboot.org>
238 lines
7.3 KiB
Bash
Executable File
238 lines
7.3 KiB
Bash
Executable File
#!/usr/bin/env sh
|
|
|
|
# helper script: generate release archive (ROM images)
|
|
#
|
|
# Copyright (C) 2020,2021,2022,2023 Leah Rowe <info@minifree.org>
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
|
|
[ "x${DEBUG+set}" = 'xset' ] && set -v
|
|
set -u -e
|
|
|
|
. "include/err.sh"
|
|
|
|
projectname="$(cat projectname)"
|
|
version="version-unknown"
|
|
versiondate="version-date-unknown"
|
|
tree="default"
|
|
target=""
|
|
CONFIG_HAVE_MRC=""
|
|
CONFIG_HAVE_ME_BIN=""
|
|
CONFIG_KBC1126_FIRMWARE=""
|
|
CONFIG_INCLUDE_SMSC_SCH5545_EC_FW=""
|
|
ifdtool="cbutils/${tree}/ifdtool"
|
|
cbfstool="cbutils/${tree}/cbfstool"
|
|
microcode_required="y"
|
|
|
|
main()
|
|
{
|
|
printf "Building ROM image archives for version %s\n" "${version}"
|
|
|
|
init_check
|
|
|
|
for romdir in bin/*; do
|
|
[ -d "${romdir}" ] || continue
|
|
make_archive "${romdir}"
|
|
done
|
|
|
|
printf "\nROM archives available at release/%s/roms/\n\n" "${version}"
|
|
}
|
|
|
|
init_check()
|
|
{
|
|
[ -f version ] && \
|
|
version="$(cat version)"
|
|
[ -f versiondate ] && \
|
|
versiondate="$(cat versiondate)"
|
|
[ ! -d "bin/" ] && \
|
|
err "init_check: no ROMs built yet (error)"
|
|
[ -d "release/" ] || \
|
|
mkdir -p release/ || \
|
|
err "init_check: !mkdir -p release/"
|
|
[ -d "release/${version}/" ] || \
|
|
mkdir -p "release/${version}/" || \
|
|
err "init_check: !mkdir -p release/${version}/"
|
|
[ ! -d "release/${version}/roms/" ] || \
|
|
rm -Rf "release/${version}/roms/" || \
|
|
err "init_check: !rm -Rf release/${version}/roms/"
|
|
|
|
if [ ! -d "release/${version}/roms/" ]; then
|
|
mkdir -p "release/${version}/roms/" || \
|
|
err "init_check: !mkdir -p release/${version}/roms/"
|
|
fi
|
|
}
|
|
|
|
make_archive()
|
|
{
|
|
builddir="${1}"
|
|
romdir="$(mktemp -d -t coreboot_rom.XXXXXXXXXX)" || \
|
|
err "make_archive: cannot create tmpdir"
|
|
rm -Rf "${romdir}" || err "make_archive: can't remove tmpdir"
|
|
target="${builddir##*/}"
|
|
romdir="${romdir}/bin/${target}"
|
|
mkdir -p "${romdir}" || \
|
|
err "make_archive: can't mkdir tmpdir"
|
|
cp "${builddir}"/* "${romdir}" || \
|
|
err "make_archive: cannot copy ROM images directory -> ${romdir}"
|
|
|
|
echo ${target}
|
|
|
|
[ -f "resources/coreboot/${target}/target.cfg" ] || \
|
|
err "make_archive: ${target}: target.cfg is missing"
|
|
|
|
. "resources/coreboot/${target}/target.cfg"
|
|
[ "${microcode_required}" = "y" ] || \
|
|
[ "${microcode_required}" = "n" ] || microcode_required="y"
|
|
|
|
CONFIG_HAVE_MRC="y"
|
|
CONFIG_HAVE_ME_BIN="y"
|
|
CONFIG_KBC1126_FIRMWARE="y"
|
|
CONFIG_INCLUDE_SMSC_SCH5545_EC_FW="y"
|
|
grep "CONFIG_HAVE_ME_BIN=y" "resources/coreboot/${target}/config/"* || \
|
|
CONFIG_HAVE_ME_BIN="n"
|
|
grep "CONFIG_HAVE_MRC=y" "resources/coreboot/${target}/config/"* || \
|
|
CONFIG_HAVE_MRC="n"
|
|
grep "CONFIG_KBC1126_FIRMWARE=y" \
|
|
"resources/coreboot/${target}/config"/* || \
|
|
CONFIG_KBC1126_FIRMWARE="n"
|
|
grep "CONFIG_INCLUDE_SMSC_SCH5545_EC_FW=y" \
|
|
"resources/coreboot/${target}/config"/* || \
|
|
CONFIG_INCLUDE_SMSC_SCH5545_EC_FW="n"
|
|
|
|
# remove ME/MRC/EC firmware from ROM images
|
|
if [ "${CONFIG_HAVE_ME_BIN}" = "y" ] || \
|
|
[ "${target}" = "e6400_4mb" ] || \
|
|
[ "${microcode_required}" = "n" ]; then
|
|
strip_archive "${romdir}"
|
|
fi
|
|
|
|
printf "Generating release/%s/roms/%s-%s_%s.tar.xz\n" \
|
|
"${version}" "${projectname}" "${version}" "${target##*/}"
|
|
printf "%s\n" "${version}" > "${romdir}/version" || \
|
|
err "make_archive: can't create ${romdir}/version"
|
|
printf "%s\n" "${versiondate}" > "${romdir}/versiondate" || \
|
|
err "make_archive: can't create ${romdir}/versiondate"
|
|
printf "%s\n" "${projectname}" > "${romdir}/projectname" || \
|
|
err "make_archive: can't create ${romdir}/projectname"
|
|
|
|
archivename="${projectname}-${version}_${target##*/}"
|
|
f="release/${version}/roms/${archivename}"
|
|
(
|
|
cd "${romdir%/bin/${target}}" || err "make_archive: can't cd to tmpdir"
|
|
tar -c "bin/${target}/" | xz -9e > "${archivename}.tar.xz" || \
|
|
err "make_archive:cant make ${projectname}-${version}_${target##*/}"
|
|
)
|
|
cp "${romdir%/bin/${target}}/${archivename}.tar.xz" "${f}.tar.xz" || \
|
|
err "make_archive: can't copy tarball"
|
|
rm -Rf "${romdir%/bin/${target}}" || \
|
|
err "make_archive: can't delete tmpdir"
|
|
}
|
|
|
|
strip_archive()
|
|
{
|
|
romdir=${1}
|
|
|
|
[ -d "coreboot/${tree}" ] || \
|
|
./update project trees coreboot ${tree} || \
|
|
err "strip_archive: coreboot/${tree}: can't fetch source"
|
|
./build coreboot utils ${tree} || \
|
|
err "strip_archive: coreboot/${tree}: can't build utils"
|
|
|
|
if [ "${microcode_required}" = "n" ]; then
|
|
for romfile in "${romdir}"/*.rom; do
|
|
[ -f "${romfile}" ] || continue
|
|
strip_ucode "${romfile}"
|
|
done
|
|
for romfile in "${romdir}"/*.tmprom; do
|
|
[ -f "${romfile}" ] || continue
|
|
mv "${romfile}" "${romfile%.tmprom}.rom" || \
|
|
err "can't make no-u rom: ${romfile%.tmprom}.rom"
|
|
done
|
|
fi
|
|
|
|
# Hash the rom before removing blobs
|
|
rm -f "${romdir}/blobhashes" || \
|
|
err "strip_archive: !rm -f ${blobdir}/blobhashes"
|
|
touch "${romdir}/blobhashes" || \
|
|
err "strip_archive: !touch ${blobdir}/blobhashes"
|
|
|
|
(
|
|
cd "${romdir}" || err "strip_archive: !cd ${romdir}"
|
|
sha1sum *.rom >> blobhashes || \
|
|
err "strip_archive: ${romdir}: !sha1sum *.rom >> blobhashes"
|
|
)
|
|
|
|
for romfile in "${romdir}"/*.rom; do
|
|
[ -f "${romfile}" ] || continue
|
|
strip_rom_image "${romfile}"
|
|
done
|
|
}
|
|
|
|
strip_ucode()
|
|
{
|
|
romfile=${1}
|
|
|
|
_newrom_b="${romfile%.rom}_nomicrocode.tmprom"
|
|
cp "${romfile}" "${_newrom_b}" || \
|
|
err "strip_rom_image: cp \"${romfile}\" \"${_newrom_b}\""
|
|
microcode_present="y"
|
|
"${cbfstool}" "${_newrom_b}" remove -n \
|
|
cpu_microcode_blob.bin 2>/dev/null || microcode_present="n"
|
|
if [ "${microcode_present}" = "n" ]; then
|
|
printf "REMARK: '%s' already lacks microcode\n" \
|
|
"${romfile}"
|
|
printf "Renaming default ROM file instead.\n"
|
|
mv "${romfile}" "${_newrom_b}" || \
|
|
err "strip_rom_image: can't rename no-u ${romfile}"
|
|
fi
|
|
}
|
|
|
|
strip_rom_image()
|
|
{
|
|
romfile=${1}
|
|
|
|
[ -f "${romfile}" ] || return 0
|
|
|
|
if [ "${CONFIG_HAVE_ME_BIN}" = "y" ]; then
|
|
"${ifdtool}" --nuke me "${romfile}" -O "${romfile}" || \
|
|
err "strip_rom_images: ${romfile}: cannot nuke Intel ME"
|
|
fi
|
|
|
|
if [ "${CONFIG_HAVE_MRC}" = "y" ]; then
|
|
"${cbfstool}" "${romfile}" remove -n mrc.bin || \
|
|
err "strip_rom_images: ${romfile}: cannot nuke mrc.bin"
|
|
"${cbfstool}" "${romfile}" print || :
|
|
fi
|
|
|
|
if [ "${CONFIG_KBC1126_FIRMWARE}" = "y" ]; then
|
|
"${cbfstool}" "${romfile}" remove -n ecfw1.bin || \
|
|
err "strip_rom_images: ${romfile}: can't nuke ecfw1.bin"
|
|
"${cbfstool}" "${romfile}" remove -n ecfw2.bin || \
|
|
err "strip_rom_images: ${romfile}: can't nuke ecfw2.bin"
|
|
fi
|
|
|
|
[ "${CONFIG_INCLUDE_SMSC_SCH5545_EC_FW}" != "y" ] || \
|
|
"${cbfstool}" "${romfile}" remove -n sch5545_ecfw.bin || \
|
|
err "strip_rom_images: ${romfile}: can't nuke sch5545ec fw"
|
|
|
|
# TODO: replace this board-specific hack
|
|
if [ "${target}" = "e6400_4mb" ]; then
|
|
"${cbfstool}" "${romfile}" remove -n "pci10de,06eb.rom" || \
|
|
err "strip_rom_images: ${romfile}: can't nuke e6400 vga rom"
|
|
fi
|
|
}
|
|
|
|
main $@
|