• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env bash
2#
3# SPDX-License-Identifier: GPL-2.0-only
4
5file_type_mma="mma"
6flashrom_temp_image=/tmp/flash_image_mma.bin
7mma_test_metadata_bin=mma_test_metadata.bin
8mma_test_metadata_bin_path=/tmp/"${mma_test_metadata_bin}"
9
10printf_separator() {
11	printf '=%.0s' {1..80}
12	printf '\n'
13}
14
15show_usage() {
16	printf "MMA blobs version : 2.1018\n"
17	printf "usage: $(basename "${0}") %s\n" \
18		"set [<mma_test_name_efi> <mma_test_param_bin>] | reset"
19	printf '=%.0s' {1..29}
20	printf "All possible MMA tests"
21	printf '=%.0s' {1..29}
22	printf "\n"
23	printf_separator
24	printf "Test Name \tMargin1D.efi\n"
25        printf "Test Config\n"
26        printf "\t\t%s %s\n" \
27		Margin1DCkAllConfig.bin \
28		Margin1DCmdAllConfig.bin \
29		Margin1DCmdVrefConfig.bin \
30		Margin1DCtlAllConfig.bin \
31		Margin1DRxDqsDelayConfig.bin \
32		Margin1DRxVrefConfig.bin \
33		Margin1DTxDqDelayConfig.bin \
34		Margin1DTxVrefConfig.bin
35	printf_separator
36	printf "Test Name \tMargin2D.efi\n"
37	printf "Test Config\n"
38	printf "\t\t%s %s\n" \
39		Margin2D_Cmd_Ch0_D0_R0_Config.bin \
40		Margin2D_Cmd_Ch0_D1_R0_Config.bin \
41		Margin2D_Cmd_Ch1_D0_R0_Config.bin \
42		Margin2D_Cmd_Ch1_D1_R0_Config.bin \
43		Margin2D_Rx_Ch0_D0_R0_Config.bin \
44		Margin2D_Rx_Ch0_D0_R1_Config.bin \
45		Margin2D_Rx_Ch0_D1_R0_Config.bin \
46		Margin2D_Rx_Ch0_D1_R1_Config.bin \
47		Margin2D_Rx_Ch1_D0_R0_Config.bin \
48		Margin2D_Rx_Ch1_D0_R1_Config.bin \
49		Margin2D_Rx_Ch1_D1_R0_Config.bin \
50		Margin2D_Rx_Ch1_D1_R1_Config.bin \
51		Margin2D_Tx_Ch0_D0_R0_Config.bin \
52		Margin2D_Tx_Ch0_D0_R1_Config.bin \
53		Margin2D_Tx_Ch0_D1_R0_Config.bin \
54		Margin2D_Tx_Ch0_D1_R1_Config.bin \
55		Margin2D_Tx_Ch1_D0_R0_Config.bin \
56		Margin2D_Tx_Ch1_D0_R1_Config.bin \
57		Margin2D_Tx_Ch1_D1_R0_Config.bin \
58		Margin2D_Tx_Ch1_D1_R1_Config.bin
59	printf_separator
60	printf "Test name \tMarginMapper.efi\n"
61	printf "Test Config\n"
62        printf "\t\t%s %s\n" \
63		MarginMapperRxVref-RxDqsDelayConfigVCh0ACh0_single_ch.bin \
64		MarginMapperRxVref-RxDqsDelayConfigVCh0ACh1_dual_ch.bin \
65		MarginMapperRxVref-RxDqsDelayConfigVCh1ACh0_dual_ch.bin \
66		MarginMapperRxVref-RxDqsDelayConfigVCh1ACh1_single_ch.bin \
67		MarginMapperTxVref-TxDqDelayConfigVCh0ACh0_single_ch.bin \
68		MarginMapperTxVref-TxDqDelayConfigVCh0ACh1_dual_ch.bin \
69		MarginMapperTxVref-TxDqDelayConfigVCh1ACh0_dual_ch.bin \
70		MarginMapperTxVref-TxDqDelayConfigVCh1ACh1_single_ch.bin \
71		ScoreRxVref-RxDqsDelayConfigVCh0ACh0_single_ch.bin \
72		ScoreRxVref-RxDqsDelayConfigVCh0ACh1_dual_ch.bin \
73		ScoreRxVref-RxDqsDelayConfigVCh1ACh0_dual_ch.bin \
74		ScoreRxVref-RxDqsDelayConfigVCh1ACh1_single_ch.bin \
75		ScoreTxVref-TxDqDelayConfigVCh0ACh0_single_ch.bin \
76		ScoreTxVref-TxDqDelayConfigVCh0ACh1_dual_ch.bin \
77		ScoreTxVref-TxDqDelayConfigVCh1ACh0_dual_ch.bin \
78		ScoreTxVref-TxDqDelayConfigVCh1ACh1_single_ch.bin
79	printf_separator
80	printf "Test Name \tRMT.efi\n"
81	printf "Test Config\n"
82        printf "\t\t%s %s\n" \
83		RMTConfig.bin
84	printf_separator
85}
86
87write_flash() {
88	printf "Writing back flash contents "${flashrom_temp_image}"\n"
89	flashrom -p internal -w "${flashrom_temp_image}" --noverify-all || \
90		{
91			printf "failed to read flash\n" ;
92			exit -1;
93		}
94}
95
96remove_file_if_exists() {
97	if [ -f "${1}" ]; then
98		printf "removing old "${1}"\n"
99		rm -f "${1}"
100	fi
101}
102
103remove_metadata() {
104	printf "Removing "${mma_test_metadata_bin}" from "${flashrom_temp_image}"\n"
105	cbfstool "${flashrom_temp_image}" remove -n ${mma_test_metadata_bin}
106	outout=$(cbfstool "${flashrom_temp_image}" print | \
107			grep ${mma_test_metadata_bin})
108
109	if [ -z "${outout}" ];then
110		printf "Removed ${mma_test_metadata_bin} from %s\n" \
111			"${flashrom_temp_image}"
112	else
113		printf "Failed to remove ${mma_test_metadata_bin} from %s\n" \
114			"${flashrom_temp_image}"
115		print_failed
116		exit -1;
117	fi
118}
119
120generate_metadata() {
121	remove_file_if_exists "${mma_test_metadata_bin_path}"
122
123	printf "Creating "${mma_test_metadata_bin_path}"\n"
124	#
125	#Format of $mma_test_metadata_bin
126	#MMA_TEST_NAME=xxxxxx.efi;MMA_TEST_PARAM=xxxxxx.bin;
127	#
128	printf "MMA_TEST_NAME=${mma_test_name};MMA_TEST_PARAM=${mma_test_param};" \
129		 > "${mma_test_metadata_bin_path}"
130}
131
132add_metadata_to_flashfile() {
133	cbfstool "${flashrom_temp_image}" add -f "${mma_test_metadata_bin_path}" \
134		-n ${mma_test_metadata_bin} -t ${file_type_mma} || \
135		{
136			printf "failed to add "${mma_test_metadata_bin_path}"\n" ;
137			exit -1;
138		}
139}
140
141cleanup() {
142	remove_file_if_exists "${flashrom_temp_image}"
143	remove_file_if_exists "${mma_test_metadata_bin_path}"
144}
145
146print_success() {
147	printf "============== SUCCESS ==============\n"
148}
149
150print_failed() {
151	printf "============== FAILED ==============\n"
152}
153
154#
155# main entry point
156#
157
158main() {
159	case "${#}:${1}" in
160		(3:set)
161			mma_test_name=${2}
162			mma_test_param=${3}
163			;;
164		(1:reset)
165			;;
166		(*)
167			show_usage
168			exit -1
169	esac
170
171	if [ "${1}"  != "reset" ];then
172		printf "mma_test_name = ${mma_test_name}\n"
173		printf "mma_test_param = ${mma_test_param}\n"
174	fi
175
176	remove_file_if_exists "${flashrom_temp_image}"
177
178	printf "Reading flash contents to "${flashrom_temp_image}"\n"
179	flashrom -p internal -r "${flashrom_temp_image}" || \
180		{
181			printf "failed to read flash\n" ;
182			exit -1;
183		}
184
185	outdata=$(cbfstool "${flashrom_temp_image}" print | \
186			grep ${mma_test_metadata_bin})
187
188	case "$1" in
189		("set")
190			[ "${outdata}" ] && remove_metadata
191			generate_metadata
192			add_metadata_to_flashfile
193			write_flash
194			;;
195		("reset")
196			if [ -z "${outdata}" ];then
197				printf "${mma_test_metadata_bin} not found at all.\n"
198			else
199				remove_metadata
200				write_flash
201			fi
202			;;
203	esac
204	cleanup
205	print_success
206}
207
208main "$@"
209