diff options
Diffstat (limited to 'resources/scripts/update')
-rwxr-xr-x | resources/scripts/update/blobs/download | 91 | ||||
-rwxr-xr-x | resources/scripts/update/blobs/inject | 22 | ||||
-rwxr-xr-x | resources/scripts/update/module/biosutilities | 22 | ||||
-rwxr-xr-x | resources/scripts/update/module/uefitool | 22 |
4 files changed, 156 insertions, 1 deletions
diff --git a/resources/scripts/update/blobs/download b/resources/scripts/update/blobs/download index 9beacab8..9fd2a6b9 100755 --- a/resources/scripts/update/blobs/download +++ b/resources/scripts/update/blobs/download @@ -19,6 +19,9 @@ e6400_vga_dl_url="" e6400_vga_dl_url_bkup="" e6400_vga_offset="" e6400_vga_romname="" +sch5545ec_dl_url="" +sch5545ec_dl_url_bkup="" +sch5545ec_dl_hash="" cbdir="coreboot/default" cbcfgsdir="resources/coreboot" @@ -31,6 +34,8 @@ e6400_unpack="$(pwd)/bios_extract/dell_inspiron_1100_unpacker.py" me7updateparser="$(pwd)/resources/blobs/me7_update_parser.py" kbc1126_ec_dump="$(pwd)/${cbdir}/util/kbc1126/kbc1126_ec_dump" board="" +pfs_extract="$(pwd)/biosutilities/Dell_PFS_Extract.py" +uefiextract="$(pwd)/uefitool/uefiextract" _b="" # board shorthand without e.g. _4mb (avoid duplication per flash size) CONFIG_HAVE_MRC="" @@ -40,6 +45,8 @@ CONFIG_HAVE_GBE_BIN="" CONFIG_KBC1126_FIRMWARE="" CONFIG_BOARD_DELL_E6400="" CONFIG_VGA_BIOS_FILE="" +CONFIG_INCLUDE_SMSC_SCH5545_EC_FW="" +CONFIG_SMSC_SCH5545_EC_FW_FILE="" main() { @@ -92,11 +99,15 @@ detect_firmware() && [ "${CONFIG_VGA_BIOS_FILE}" != "" ]; then needs="${needs} E6400VGA" fi + if [ "${CONFIG_INCLUDE_SMSC_SCH5545_EC_FW}" = "y" ]; then + needs="${needs} SCH5545EC" + fi if [ -z ${needs+x} ]; then printf 'No binary blobs needed for this board\n' return 1 fi - printf "Firmware needed for board %s: %s\n" ${board} ${needs} + printf "Firmware needed for board '%s':\n" ${board} + printf "%s\n" ${needs} } scan_sources_config() @@ -152,6 +163,18 @@ scan_sources_config() set ${line} e6400_vga_romname=${2} ;; + SCH5545EC_DL_hash*) + set ${line} + sch5545ec_dl_hash=${2} + ;; + SCH5545EC_DL_url_bkup*) + set ${line} + sch5545ec_dl_url_bkup=${2} + ;; + SCH5545EC_DL_url*) + set ${line} + sch5545ec_dl_url=${2} + ;; esac done << EOF $(eval "awk '${awkstr}' resources/blobs/sources") @@ -174,6 +197,20 @@ build_dependencies() ./download bios_extract \ || fail "could not download bios_extract" fi + if [ ! -d biosutilities ]; then + printf "downloading biosutilities\n" + ./download biosutilities \ + || fail "could not download biosutilities" + fi + if [ ! -d uefitool ]; then + printf "download uefitool (for UEFIExtract)\n" + ./download uefitool \ + || fail "could not download uefitool" + fi + if [ ! -f uefitool/uefiextract ]; then + ./build module uefitool \ + || fail "could not build uefitool" + fi if [ ! -f ${cbdir}/util/kbc1126/kbc1126_ec_dump ]; then printf "Building kbc1126_ec_dump from coreboot\n" make -BC ${cbdir}/util/kbc1126 \ @@ -193,6 +230,9 @@ download_blobs() *ME*) download_blob_intel_me || _failed="${_failed} me" ;; + *SCH5545EC*) + download_sch5545ec || failed="${_failed} sch5545ec" + ;; *EC*) download_ec || _failed="${_failed} ec" ;; @@ -420,6 +460,51 @@ extract_e6400vga() printf "E6400 Nvidia ROM saved to: %s\n" "${_vga_destination}" } +download_sch5545ec() +{ + printf "Downloading SMSC SCH5545 Environment Controller firmware\n" + + fetch_update sch5545ec || return 1 + extract_sch5545ec || return 1 +} + +# TODO: this code is cancer. hardcoded is bad, and stupid. +# TODO: make it *scan* (based on signature, in each file) +extract_sch5545ec() +{ + printf "Extracting SCH5545 Environment Controller firmware for '%s'\n" \ + ${board} + + _sch5545ec_destination=${CONFIG_SMSC_SCH5545_EC_FW_FILE#../../} + + if [ -f "${_sch5545ec_destination}" ]; then + printf 'sch5545 firmware already downloaded\n' + return 0 + fi + + if [ -d "${appdir}" ]; then + rm -Rf "${appdir}" + fi + mkdir -p "${appdir}/" + + cp "${dl_path}" "${appdir}/" + python "${pfs_extract}" "${appdir}/${dlsum}" -e || exit 1 + + # full system ROM (UEFI), to extract with UEFIExtract: + _bios="${appdir}/${dlsum}_extracted/Firmware" + _bios="${_bios}/1 ${dlsum} -- 1 System BIOS vA.28.bin" + + # this is the SCH5545 firmware, inside of the extracted UEFI ROM: + _sch5545ec_fw="${_bios}.dump/4 7A9354D9-0468-444A-81CE-0BF617D890DF" + _sch5545ec_fw="${_sch5545ec_fw}/54 D386BEB8-4B54-4E69-94F5-06091F67E0D3" + _sch5545ec_fw="${_sch5545ec_fw}/0 Raw section/body.bin" # <-- this! + + # this makes the file defined by _sch5545ec_fw available to copy + "${uefiextract}" "${_bios}" || exit 1 + + cp "${_sch5545ec_fw}" "${_sch5545ec_destination}" || exit 1 +} + fetch_update() { printf "Fetching vendor update for board: %s\n" ${board} @@ -440,6 +525,10 @@ fetch_update() dl=${e6400_vga_dl_url} dl_bkup=${e6400_vga_dl_url_bkup} dlsum=${e6400_vga_dl_hash} + elif [ "${fw_type}" = "sch5545ec" ]; then + dl="${sch5545ec_dl_url}" + dl_bkup="${sch5545ec_dl_url_bkup}" + dlsum="${sch5545ec_dl_hash}" else printf "Unsupported download type: %s\n" ${fw_type} return 1 diff --git a/resources/scripts/update/blobs/inject b/resources/scripts/update/blobs/inject index bc8a9a4d..97cb35a6 100755 --- a/resources/scripts/update/blobs/inject +++ b/resources/scripts/update/blobs/inject @@ -34,6 +34,8 @@ CONFIG_KBC1126_FW2_OFFSET="" CONFIG_VGA_BIOS_FILE="" CONFIG_VGA_BIOS_ID="" CONFIG_GBE_BIN_PATH="" +CONFIG_INCLUDE_SMSC_SCH5545_EC_FW="" +CONFIG_SMSC_SCH5545_EC_FW_FILE="" main() { @@ -217,6 +219,11 @@ patch_rom() inject_blob_dell_e6400_vgarom_nvidia fi + if [ "${CONFIG_INCLUDE_SMSC_SCH5545_EC_FW}" = "y" ] \ + && [ "${CONFIG_SMSC_SCH5545_EC_FW_FILE}" != "" ]; then + inject_blob_smsc_sch5545_ec "${rom}" + fi + if [ "${modifygbe}" = "true" ] && ! [ "${release}" = "true" ]; then modify_gbe ${rom} fi @@ -325,6 +332,21 @@ inject_blob_dell_e6400_vgarom_nvidia() -t optionrom || exit 1 } +inject_blob_smsc_sch5545_ec() +{ + rom="${1}" + + _sch5545ec_location="${CONFIG_SMSC_SCH5545_EC_FW_FILE#../../}" + + if [ ! -f "${_sch5545ec_location}" ]; then + printf "SCH5545 firmware file missing\n" 1>&2 + exit 1 + fi + + "${cbfstool}" "${rom}" add -f "${_sch5545ec_location}" \ + -n sch5545_ecfw.bin -t raw || exit 1 +} + modify_gbe() { printf "changing mac address in gbe to ${new_mac}\n" diff --git a/resources/scripts/update/module/biosutilities b/resources/scripts/update/module/biosutilities new file mode 100755 index 00000000..c6de36b1 --- /dev/null +++ b/resources/scripts/update/module/biosutilities @@ -0,0 +1,22 @@ +#!/usr/bin/env sh +# +# Copyright (C) 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 + +./gitclone biosutilities diff --git a/resources/scripts/update/module/uefitool b/resources/scripts/update/module/uefitool new file mode 100755 index 00000000..cd376895 --- /dev/null +++ b/resources/scripts/update/module/uefitool @@ -0,0 +1,22 @@ +#!/usr/bin/env sh +# +# Copyright (C) 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 + +./gitclone uefitool |