summaryrefslogtreecommitdiff
path: root/resources/scripts/blobs/download
blob: b9471946269e66eebf516f0990763d3cd5108854 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/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

Fail(){
	printf "\nERROR: $@\n"
	exit 1
}

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
	Fail "failed to obtain ${_failed}\nYou may try manually extracting blobs with './blobutil extract'"
	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

	printf 'extracting and stripping intel management engine\n'
	innoextract blobs/me.exe -d blobs || Fail 'could not extract me executable with innoextract' 
	./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 \
	|| return 1
	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 || Fail 'could not download me_cleaner'
	fi

	if [ ! -d coreboot/default ]; then
		printf "downloading coreboot\n"
		./download coreboot default || Fail 'could not download coreboot'
	fi
	
	if [ ! -f "coreboot/default/util/ifdtool/ifdtool" ]; then
	printf "building ifdtool from coreboot\n"
	( cd coreboot/default/util/ifdtool && make ) || Fail 'could not build ifdtool'
	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