vendor.sh 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. # SPDX-License-Identifier: GPL-3.0-only
  2. # Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com>
  3. # Copyright (c) 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
  4. # Copyright (c) 2023-2024 Leah Rowe <leah@libreboot.org>
  5. e6400_unpack="$PWD/src/bios_extract/dell_inspiron_1100_unpacker.py"
  6. me7updateparser="$PWD/util/me7_update_parser/me7_update_parser.py"
  7. pfs_extract="$PWD/src/biosutilities/Dell_PFS_Extract.py"
  8. uefiextract="$PWD/elf/uefitool/uefiextract"
  9. appdir="vendorfiles/app"
  10. cbcfgsdir="config/coreboot"
  11. eval `setvars "" EC_url_bkup EC_hash DL_hash DL_url_bkup MRC_refcode_gbe vcfg \
  12. E6400_VGA_DL_hash E6400_VGA_DL_url E6400_VGA_DL_url_bkup E6400_VGA_offset \
  13. E6400_VGA_romname CONFIG_HAVE_MRC SCH5545EC_DL_url_bkup SCH5545EC_DL_hash \
  14. mecleaner kbc1126_ec_dump MRC_refcode_cbtree _dl SCH5545EC_DL_url _7ztest \
  15. CONFIG_BOARD_DELL_E6400 CONFIG_HAVE_ME_BIN EC_url CONFIG_REFCODE_BLOB_FILE \
  16. CONFIG_ME_BIN_PATH CONFIG_KBC1126_FIRMWARE _dest tree CONFIG_GBE_BIN_PATH \
  17. CONFIG_KBC1126_FW1_OFFSET CONFIG_KBC1126_FW2 CONFIG_KBC1126_FW2_OFFSET rom \
  18. CONFIG_VGA_BIOS_FILE CONFIG_VGA_BIOS_ID CONFIG_KBC1126_FW1 cbdir DL_url \
  19. CONFIG_INCLUDE_SMSC_SCH5545_EC_FW CONFIG_SMSC_SCH5545_EC_FW_FILE boarddir \
  20. CONFIG_IFD_BIN_PATH CONFIG_MRC_FILE CONFIG_HAVE_REFCODE_BLOB cbfstoolref`
  21. vendor_download()
  22. {
  23. export PATH="$PATH:/sbin"
  24. [ $# -gt 0 ] || $err "No argument given"
  25. board="$1" && readcfg && readkconfig && bootstrap && getfiles; return 0
  26. }
  27. readcfg()
  28. {
  29. boarddir="$cbcfgsdir/$board"
  30. eval `setcfg "$boarddir/target.cfg"`; chkvars vcfg tree
  31. cbdir="src/coreboot/$tree"
  32. cbfstool="elf/cbfstool/$tree/cbfstool"
  33. mecleaner="$PWD/$cbdir/util/me_cleaner/me_cleaner.py"
  34. kbc1126_ec_dump="$PWD/$cbdir/util/kbc1126/kbc1126_ec_dump"
  35. cbfstool="elf/cbfstool/$tree/cbfstool"
  36. x_ ./update trees -d coreboot $tree
  37. }
  38. readkconfig()
  39. {
  40. check_defconfig "$boarddir" 1>"$TMPDIR/vendorcfg.list" && return 1
  41. while read -r cbcfgfile; do
  42. set +u +e; . "$cbcfgfile" 2>/dev/null; set -u -e
  43. done < "$TMPDIR/vendorcfg.list"
  44. for c in CONFIG_HAVE_MRC CONFIG_HAVE_ME_BIN CONFIG_KBC1126_FIRMWARE \
  45. CONFIG_VGA_BIOS_FILE CONFIG_INCLUDE_SMSC_SCH5545_EC_FW; do
  46. eval "[ \"\${$c}\" = \"/dev/null\" ] && continue"
  47. eval "[ -z \"\${$c}\" ] && continue"
  48. eval `setcfg "config/vendor/$vcfg/pkg.cfg"`; return 0
  49. done
  50. printf "Vendor files not needed for: %s\n" "$board" 1>&2; return 1
  51. }
  52. bootstrap()
  53. {
  54. x_ ./update trees -f coreboot ${cbdir##*/}
  55. for d in uefitool biosutilities bios_extract; do
  56. x_ ./update trees -b "$d"
  57. done
  58. [ -d "${kbc1126_ec_dump%/*}" ] && x_ make -C "$cbdir/util/kbc1126"
  59. [ -n "$MRC_refcode_cbtree" ] && \
  60. cbfstoolref="elf/cbfstool/$MRC_refcode_cbtree/cbfstool" && \
  61. x_ ./update trees -d coreboot $MRC_refcode_cbtree; return 0
  62. }
  63. getfiles()
  64. {
  65. [ -z "$CONFIG_HAVE_ME_BIN" ] || fetch intel_me "$DL_url" \
  66. "$DL_url_bkup" "$DL_hash" "$CONFIG_ME_BIN_PATH"
  67. [ -z "$CONFIG_INCLUDE_SMSC_SCH5545_EC_FW" ] || fetch sch5545ec \
  68. "$SCH5545EC_DL_url" "$SCH5545EC_DL_url_bkup" "$SCH5545EC_DL_hash" \
  69. "$CONFIG_SMSC_SCH5545_EC_FW_FILE"
  70. [ -z "$CONFIG_KBC1126_FIRMWARE" ] || fetch kbc1126ec "$EC_url" \
  71. "$EC_url_bkup" "$EC_hash" "$CONFIG_KBC1126_FW1"
  72. [ -z "$CONFIG_VGA_BIOS_FILE" ] || fetch "e6400vga" \
  73. "$E6400_VGA_DL_url" "$E6400_VGA_DL_url_bkup" "$E6400_VGA_DL_hash" \
  74. "$CONFIG_VGA_BIOS_FILE"
  75. [ -z "$CONFIG_HAVE_MRC" ] || fetch "mrc" "$MRC_url" "$MRC_url_bkup" \
  76. "$MRC_hash" "$CONFIG_MRC_FILE"; return 0
  77. }
  78. fetch()
  79. {
  80. dl_type="$1"; dl="$2"; dl_bkup="$3"; dlsum="$4"; _dest="${5##*../}"
  81. [ "$5" = "/dev/null" ] && return 0; _dl="$XBMK_CACHE/file/$dlsum"
  82. download "$dl" "$dl_bkup" "$_dl" "$dlsum"
  83. rm -Rf "${_dl}_extracted" || \
  84. $err "!rm -Rf ${_ul}_extracted"
  85. e "$_dest" f && return 0
  86. mkdir -p "${_dest%/*}" || $err "mkdirs: !mkdir -p ${_dest%/*}"
  87. remkdir "$appdir"
  88. extract_archive "$_dl" "$appdir" || [ "$dl_type" = "e6400vga" ] || \
  89. $err "mkdirs $_dest $dl_type: !extract"
  90. eval "extract_$dl_type"; set -u -e
  91. e "$_dest" f missing && $err "!extract_$dl_type"; return 0
  92. }
  93. extract_intel_me()
  94. {
  95. e "$mecleaner" f not && $err "$cbdir: me_cleaner missing"
  96. _me="$PWD/$_dest" # must always be an absolute path
  97. cdir="$PWD/$appdir" # must always be an absolute path
  98. [ $# -gt 0 ] && _me="${1}" && cdir="$2"
  99. e "$_me" f && return 0
  100. sdir="$(mktemp -d)"; [ -z "$sdir" ] && return 0
  101. mkdir -p "$sdir" || $err "extract_intel_me: !mkdir -p \"$sdir\""
  102. set +u +e
  103. (
  104. [ "${cdir#/a}" != "$cdir" ] && cdir="${cdir#/}"
  105. cd "$cdir" || $err "extract_intel_me: !cd \"$cdir\""
  106. for i in *; do
  107. [ -f "$_me" ] && break
  108. [ -L "$i" ] && continue
  109. if [ -f "$i" ]; then
  110. "$mecleaner" -r -t -O "$sdir/vendorfile" \
  111. -M "$_me" "$i" && break
  112. "$mecleaner" -r -t -O "$_me" "$i" && break
  113. "$me7updateparser" -O "$_me" "$i" && break
  114. _7ztest="${_7ztest}a"
  115. extract_archive "$i" "$_7ztest" || continue
  116. extract_intel_me "$_me" "$cdir/$_7ztest"
  117. elif [ -d "$i" ]; then
  118. extract_intel_me "$_me" "$cdir/$i"
  119. else
  120. continue
  121. fi
  122. cdir="$1"
  123. [ "${cdir#/a}" != "$cdir" ] && cdir="${cdir#/}"
  124. cd "$cdir" || :
  125. done
  126. )
  127. rm -Rf "$sdir" || $err "extract_intel_me: !rm -Rf $sdir"
  128. }
  129. extract_archive()
  130. {
  131. innoextract "$1" -d "$2" || python "$pfs_extract" "$1" -e || 7z x \
  132. "$1" -o"$2" || unar "$1" -o "$2" || unzip "$1" -d "$2" || return 1
  133. }
  134. extract_kbc1126ec()
  135. {
  136. e "$kbc1126_ec_dump" f missing && $err "$cbdir: kbc1126 util missing"
  137. (
  138. x_ cd "$appdir/"; mv Rompaq/68*.BIN ec.bin || :
  139. if [ ! -f "ec.bin" ]; then
  140. unar -D ROM.CAB Rom.bin || unar -D Rom.CAB Rom.bin || \
  141. unar -D 68*.CAB Rom.bin || $err "can't extract Rom.bin"
  142. x_ mv Rom.bin ec.bin
  143. fi
  144. [ -f ec.bin ] || $err "extract_kbc1126_ec $board: can't extract"
  145. "$kbc1126_ec_dump" ec.bin || $err "!1126ec $board extract ecfw"
  146. ) || $err "can't extract kbc1126 ec firmware"
  147. e "$appdir/ec.bin.fw1" f not && $err "$board: kbc1126ec fetch failed"
  148. e "$appdir/ec.bin.fw2" f not && $err "$board: kbc1126ec fetch failed"
  149. cp "$appdir/"ec.bin.fw* "${_dest%/*}/" || $err "!cp 1126ec $_dest"
  150. }
  151. extract_e6400vga()
  152. {
  153. set +u +e; chkvars E6400_VGA_offset E6400_VGA_romname
  154. tail -c +$E6400_VGA_offset "$_dl" | gunzip > "$appdir/bios.bin" || :
  155. (
  156. x_ cd "$appdir"
  157. [ -f "bios.bin" ] || $err "extract_e6400vga: can't extract bios.bin"
  158. "$e6400_unpack" bios.bin || printf "TODO: fix dell extract util\n"
  159. ) || $err "can't extract e6400 vga rom"
  160. cp "$appdir/$E6400_VGA_romname" "$_dest" || $err "64 !cp $board $_dest"
  161. }
  162. extract_sch5545ec()
  163. {
  164. # full system ROM (UEFI), to extract with UEFIExtract:
  165. _bios="${_dl}_extracted/Firmware/1 $dlsum -- 1 System BIOS vA.28.bin"
  166. # this is the SCH5545 firmware, inside of the extracted UEFI ROM:
  167. _sch5545ec_fw="$_bios.dump/4 7A9354D9-0468-444A-81CE-0BF617D890DF"
  168. _sch5545ec_fw="$_sch5545ec_fw/54 D386BEB8-4B54-4E69-94F5-06091F67E0D3"
  169. _sch5545ec_fw="$_sch5545ec_fw/0 Raw section/body.bin" # <-- this!
  170. "$uefiextract" "$_bios" || $err "sch5545 !extract"
  171. cp "$_sch5545ec_fw" "$_dest" || $err "$_dest: !sch5545 copy"
  172. }