summaryrefslogtreecommitdiff
path: root/resources/scripts/blobs/download
diff options
context:
space:
mode:
Diffstat (limited to 'resources/scripts/blobs/download')
-rwxr-xr-xresources/scripts/blobs/download151
1 files changed, 151 insertions, 0 deletions
diff --git a/resources/scripts/blobs/download b/resources/scripts/blobs/download
new file mode 100755
index 0000000..c274e9d
--- /dev/null
+++ b/resources/scripts/blobs/download
@@ -0,0 +1,151 @@
+#!/usr/bin/env bash
+
+# SPDX-FileCopyrightText: 2022 Caleb La Grange <thonkpeasant@protonmail.com>
+# SPDX-License-Identifier: GPL-3.0-only
+
+board="${1}"
+# A shorthand for each board so as not to duplicate blobs for boards of different sizes
+board_short=${board%%_*mb}
+
+# Allow adding only blobs that can be legally redistributed (ifd+gbe)
+if [ "${2}" = "redistributable" ]; then
+ redistributable=true
+else
+ redistributable=false
+fi
+
+Download_needed(){
+ for need in ${needs}; do
+ case ${need} in
+ *ME*)
+ Extract_me || _failed+=" me"
+ ;;
+ *MRC*)
+ ./download mrc || _failed+=" mrc"
+ ;;
+ esac
+ done
+
+ if [ ! -z ${_failed+x} ]; then
+ printf "\nERROR: failed to obtain${_failed}\nrun: './blobutil extract ${board} /path/to/romdump.rom' to extract the remaining blobs\n"
+ exit 1
+ fi
+}
+
+Extract_me(){
+ _me_destination=${CONFIG_ME_BIN_PATH#../../}
+
+ if [ -f "${_me_destination}" ]; then
+ printf 'me already downloaded\n'
+ return 0
+ fi
+
+ if [ -z "${me_dl+x}" ]; then
+ printf 'no me download available for this board\n'
+ return 1
+ fi
+
+ if [ ! -d "${_me_destination%/*}" ]; then
+ mkdir -p ${_me_destination%/*}
+ fi
+
+ printf "Extracting neutered me for ${board}\n"
+
+ # Delete old me downloads in case user is building for multiple boards
+ if [ -f "blobs/me.exe" ]; then
+ rm blobs/me.exe
+ fi
+
+ if [ -d "blobs/app" ]; then
+ rm -r blobs/app
+ fi
+
+ curl ${me_dl} > blobs/me.exe || curl ${me_dl_bkup} > blobs/me.exe
+
+ if [ ! "$(sha1sum blobs/me.exe)" = "${me_hash} blobs/me.exe" ]; then
+ printf 'checksum of downloaded me did not mactch\ncorrupted me downloaded or wrong me for board\n'
+ rm blobs/me.exe
+ return 1
+ fi
+
+ ( cd blobs && innoextract me.exe )
+ printf 'extracting and stripping intel management engine\n'
+ ./me_cleaner/me_cleaner.py -r -t -O ${_me_destination} blobs/app/*ME*.bin \
+ || ./resources/blobs/me7_update_parser.py -O ${_me_destination} blobs/app/ME7*.bin
+ printf "Truncated and cleaned me output to ${_me_destination}\n"
+}
+
+Build_deps(){
+ if [ ! -d me_cleaner ]; then
+ printf "downloading me_cleaner\n"
+ ./download me_cleaner
+ fi
+
+ if [ ! -d coreboot/default ]; then
+ printf "downloading coreboot\n"
+ ./download coreboot default
+ fi
+
+ if [ ! -f "coreboot/default/util/ifdtool/ifdtool" ]; then
+ printf "building ifdtool from coreboot\n"
+ ( cd coreboot/default/util/ifdtool && make )
+ fi
+}
+
+set -- "resources/coreboot/${board}/config/*"
+. ${1} 2>/dev/null
+. "resources/coreboot/${board}/board.cfg"
+
+if [ "${CONFIG_HAVE_MRC}" = "y" ]; then
+ if [ "${redistributable}" = "false" ]; then
+ printf 'haswell board detected, downloading mrc\n'
+ needs+=" MRC"
+ fi
+
+fi
+
+if [ "${CONFIG_HAVE_IFD_BIN}" = "y" ]; then
+ printf 'board needs intel firmware descriptor\n'
+ needs+=" IFD"
+fi
+
+if [ "${CONFIG_HAVE_ME_BIN}" = "y" ]; then
+ if [ "${redistributable}" = "false" ]; then
+ printf 'board needs intel management engine\n'
+ needs+=" ME"
+ fi
+fi
+
+if [ "${CONFIG_HAVE_GBE_BIN}" = "y" ]; then
+ printf 'board needs gigabit ethernet firmware\n'
+ needs+=" GBE"
+fi
+
+# Quickly exit without wasting more time if there are no blobs needed (GM45)
+if [ -z ${needs+x} ]; then
+ printf 'No binary blobs needed for this board\n'
+ exit 0
+fi
+
+Build_deps
+
+while read -r line ; do
+ case ${line} in
+ ME_hash*)
+ set ${line}
+ me_hash=${2}
+ ;;
+ ME_dl*)
+ set ${line}
+ me_dl=${2}
+ ;;
+ ME_bkup_dl*)
+ set ${line}
+ me_dl_bkup=${2}
+ ;;
+ esac
+done <<< $(eval "awk ' /\{.*${board_short}.*}{/ {flag=1;next} /\}/{flag=0} flag { print }' resources/blobs/sources")
+
+Download_needed
+
+