xref: /aosp_15_r20/external/flashrom/util/ubertest/ubertest.sh (revision 0d6140be3aa665ecc836e8907834fcd3e3b018fc)
1*0d6140beSAndroid Build Coastguard Worker#!/bin/sh
2*0d6140beSAndroid Build Coastguard Worker#
3*0d6140beSAndroid Build Coastguard Worker# Copyright (C) 2016 Google Inc.
4*0d6140beSAndroid Build Coastguard Worker# Copyright (C) 2020 Facebook Inc.
5*0d6140beSAndroid Build Coastguard Worker#
6*0d6140beSAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or modify
7*0d6140beSAndroid Build Coastguard Worker# it under the terms of the GNU General Public License as published by
8*0d6140beSAndroid Build Coastguard Worker# the Free Software Foundation; either version 2 of the License, or
9*0d6140beSAndroid Build Coastguard Worker# (at your option) any later version.
10*0d6140beSAndroid Build Coastguard Worker#
11*0d6140beSAndroid Build Coastguard Worker# This program is distributed in the hope that it will be useful,
12*0d6140beSAndroid Build Coastguard Worker# but WITHOUT ANY WARRANTY; without even the implied warranty of
13*0d6140beSAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*0d6140beSAndroid Build Coastguard Worker# GNU General Public License for more details.
15*0d6140beSAndroid Build Coastguard Worker#
16*0d6140beSAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License
17*0d6140beSAndroid Build Coastguard Worker# along with this program; if not, write to the Free Software
18*0d6140beSAndroid Build Coastguard Worker# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
19*0d6140beSAndroid Build Coastguard Worker
20*0d6140beSAndroid Build Coastguard WorkerEXIT_SUCCESS=0
21*0d6140beSAndroid Build Coastguard WorkerEXIT_FAILURE=1
22*0d6140beSAndroid Build Coastguard WorkerRC=$EXIT_SUCCESS
23*0d6140beSAndroid Build Coastguard WorkerFATAL=0
24*0d6140beSAndroid Build Coastguard WorkerNONFATAL=1
25*0d6140beSAndroid Build Coastguard Worker
26*0d6140beSAndroid Build Coastguard Worker#
27*0d6140beSAndroid Build Coastguard Worker# Stuff obtained from command-line
28*0d6140beSAndroid Build Coastguard Worker#
29*0d6140beSAndroid Build Coastguard Worker
30*0d6140beSAndroid Build Coastguard Worker# Generic options
31*0d6140beSAndroid Build Coastguard WorkerBACKUP_IMAGE=""
32*0d6140beSAndroid Build Coastguard WorkerOLD_FLASHROM=""
33*0d6140beSAndroid Build Coastguard WorkerNEW_FLASHROM=""
34*0d6140beSAndroid Build Coastguard WorkerNO_CLEAN=0
35*0d6140beSAndroid Build Coastguard WorkerSKIP_CONSISTENCY_CHECK=0
36*0d6140beSAndroid Build Coastguard WorkerUPLOAD_RESULTS=0
37*0d6140beSAndroid Build Coastguard Worker
38*0d6140beSAndroid Build Coastguard Worker# LOCAL_FLASHROM is required if both a secondary programmer *and* a remote host
39*0d6140beSAndroid Build Coastguard Worker# are used since OLD_FLASHROM and NEW_FLASHROM will be called on the remote
40*0d6140beSAndroid Build Coastguard Worker# host and we need a local copy of flashrom to control the secondary programmer.
41*0d6140beSAndroid Build Coastguard Worker# By default this will be set to the result of `which flashrom`.
42*0d6140beSAndroid Build Coastguard WorkerLOCAL_FLASHROM=""
43*0d6140beSAndroid Build Coastguard Worker
44*0d6140beSAndroid Build Coastguard Worker# Primary/Secondary programmer options
45*0d6140beSAndroid Build Coastguard WorkerPRIMARY_OPTS=""
46*0d6140beSAndroid Build Coastguard WorkerSECONDARY_OPTS=""
47*0d6140beSAndroid Build Coastguard Worker
48*0d6140beSAndroid Build Coastguard Worker# Calls preflash_hook() and postflash_hook() before and after doing a command.
49*0d6140beSAndroid Build Coastguard WorkerCUSTOM_HOOKS_FILENAME=""
50*0d6140beSAndroid Build Coastguard Worker
51*0d6140beSAndroid Build Coastguard Worker# logfile to store the script's output
52*0d6140beSAndroid Build Coastguard WorkerSCRIPT_LOGFILE="flashrom-test_script_output.txt"
53*0d6140beSAndroid Build Coastguard Worker
54*0d6140beSAndroid Build Coastguard Worker# Test type
55*0d6140beSAndroid Build Coastguard WorkerTEST_TYPE_UNKNOWN=0
56*0d6140beSAndroid Build Coastguard WorkerTEST_TYPE_SINGLE=1
57*0d6140beSAndroid Build Coastguard WorkerTEST_TYPE_ENDURANCE=2
58*0d6140beSAndroid Build Coastguard WorkerTEST_TYPE=$TEST_TYPE_UNKNOWN
59*0d6140beSAndroid Build Coastguard Worker
60*0d6140beSAndroid Build Coastguard Worker# Region modes
61*0d6140beSAndroid Build Coastguard WorkerREGION_MODE_UNKNOWN=0
62*0d6140beSAndroid Build Coastguard WorkerREGION_MODE_CLOBBER=1
63*0d6140beSAndroid Build Coastguard WorkerREGION_MODE_DESCRIPTOR=2
64*0d6140beSAndroid Build Coastguard WorkerREGION_MODE_FLASHMAP=3
65*0d6140beSAndroid Build Coastguard WorkerREGION_MODE_LAYOUT=4
66*0d6140beSAndroid Build Coastguard WorkerREGION_MODE=$REGION_MODE_UNKNOWN
67*0d6140beSAndroid Build Coastguard WorkerDESCRIPTOR_REGION="BIOS"
68*0d6140beSAndroid Build Coastguard WorkerFLASHMAP_REGION="RW_SECTION_A"
69*0d6140beSAndroid Build Coastguard WorkerLAYOUT_FILE=""
70*0d6140beSAndroid Build Coastguard WorkerLAYOUT_REGION="RW"
71*0d6140beSAndroid Build Coastguard WorkerSMALL_REGION=0
72*0d6140beSAndroid Build Coastguard Worker
73*0d6140beSAndroid Build Coastguard Worker# Remote testing options
74*0d6140beSAndroid Build Coastguard WorkerSSH_PORT=""
75*0d6140beSAndroid Build Coastguard WorkerREMOTE_HOST=""
76*0d6140beSAndroid Build Coastguard WorkerREMOTE_PORT_OPTION=""
77*0d6140beSAndroid Build Coastguard WorkerREMOTE_ONLY=0
78*0d6140beSAndroid Build Coastguard WorkerREMOTE_PROGRAMMER_PARAMS=""
79*0d6140beSAndroid Build Coastguard WorkerSSH_CMD="ssh $REMOTE_PORT_OPTION root@${REMOTE_HOST} command -v"
80*0d6140beSAndroid Build Coastguard Worker
81*0d6140beSAndroid Build Coastguard WorkerLOCAL=0
82*0d6140beSAndroid Build Coastguard WorkerREMOTE=1
83*0d6140beSAndroid Build Coastguard WorkerDO_REMOTE=0	# boolean to use for cmd() and tests
84*0d6140beSAndroid Build Coastguard Worker
85*0d6140beSAndroid Build Coastguard Worker# relative path from flashrom root directory
86*0d6140beSAndroid Build Coastguard WorkerTEST_SCRIPT_PATH="util/testing/test_v2.1.sh"
87*0d6140beSAndroid Build Coastguard Worker
88*0d6140beSAndroid Build Coastguard Worker# In case we need to run flashrom locally and we're not already root.
89*0d6140beSAndroid Build Coastguard WorkerSUDO_CMD=""
90*0d6140beSAndroid Build Coastguard Workerif [ "$(id -u)" -ne "0" ]; then
91*0d6140beSAndroid Build Coastguard Worker	SUDO_CMD="sudo"
92*0d6140beSAndroid Build Coastguard Workerfi
93*0d6140beSAndroid Build Coastguard Worker
94*0d6140beSAndroid Build Coastguard Worker# 1KB
95*0d6140beSAndroid Build Coastguard WorkerK=1024
96*0d6140beSAndroid Build Coastguard Worker
97*0d6140beSAndroid Build Coastguard Workershow_help() {
98*0d6140beSAndroid Build Coastguard Worker	printf "Usage:
99*0d6140beSAndroid Build Coastguard Worker	${0} <options>
100*0d6140beSAndroid Build Coastguard Worker
101*0d6140beSAndroid Build Coastguard WorkerGeneral options:
102*0d6140beSAndroid Build Coastguard Worker    -b, --backup-image <path>
103*0d6140beSAndroid Build Coastguard Worker        Backup image to write unconditionally at end of testing.
104*0d6140beSAndroid Build Coastguard Worker    -h, --help
105*0d6140beSAndroid Build Coastguard Worker        Show this message.
106*0d6140beSAndroid Build Coastguard Worker    -l, --layout-file <path>
107*0d6140beSAndroid Build Coastguard Worker        Layout file (required if mode is \"layout\", resides locally).
108*0d6140beSAndroid Build Coastguard Worker    -m, --mode <arg>
109*0d6140beSAndroid Build Coastguard Worker        Region access mode (clobber, descriptor, flashmap, layout).
110*0d6140beSAndroid Build Coastguard Worker    -n, --new <path>
111*0d6140beSAndroid Build Coastguard Worker        Path to new version of flashrom.
112*0d6140beSAndroid Build Coastguard Worker    -o, --old <path>
113*0d6140beSAndroid Build Coastguard Worker        Path to old (stable) version of flashrom.
114*0d6140beSAndroid Build Coastguard Worker    -p, --primary-programmer <parameters>
115*0d6140beSAndroid Build Coastguard Worker        Primary programmer options.
116*0d6140beSAndroid Build Coastguard Worker    -r, --remote-host <host>
117*0d6140beSAndroid Build Coastguard Worker        Remote host to test primary programmer on.
118*0d6140beSAndroid Build Coastguard Worker    -s, --secondary-programmer <parameters>
119*0d6140beSAndroid Build Coastguard Worker        Secondary programmer options.
120*0d6140beSAndroid Build Coastguard Worker    -t, --type <arg>
121*0d6140beSAndroid Build Coastguard Worker        Test type (single, endurance).
122*0d6140beSAndroid Build Coastguard Worker    -u, --upload-results
123*0d6140beSAndroid Build Coastguard Worker        Upload results to flashrom.org.
124*0d6140beSAndroid Build Coastguard Worker    -v, --voltage
125*0d6140beSAndroid Build Coastguard Worker        Chip voltage in millivolts (usually 1800 or 3300).
126*0d6140beSAndroid Build Coastguard Worker
127*0d6140beSAndroid Build Coastguard WorkerLong options:
128*0d6140beSAndroid Build Coastguard Worker    --custom-hooks <filename>
129*0d6140beSAndroid Build Coastguard Worker        Supply a script with custom hooks to run before and after commands.
130*0d6140beSAndroid Build Coastguard Worker    --descriptor-region <name>
131*0d6140beSAndroid Build Coastguard Worker        Specify region to use in descriptor mode (default: $DESCRIPTOR_REGION)
132*0d6140beSAndroid Build Coastguard Worker    --flashmap-region <name>
133*0d6140beSAndroid Build Coastguard Worker        Specify region to use in flashmap mode (default: $FLASHMAP_REGION)
134*0d6140beSAndroid Build Coastguard Worker    --layout-region <name>
135*0d6140beSAndroid Build Coastguard Worker        Specify region to use in layout mode (default: $LAYOUT_REGION)
136*0d6140beSAndroid Build Coastguard Worker    --local-flashrom <path>
137*0d6140beSAndroid Build Coastguard Worker        Path to local version of flashrom when using both a secondary programmer
138*0d6140beSAndroid Build Coastguard Worker        and remote host (default: $($SUDO_CMD which flashrom))
139*0d6140beSAndroid Build Coastguard Worker    --no-clean
140*0d6140beSAndroid Build Coastguard Worker        Do not remove temporary files.
141*0d6140beSAndroid Build Coastguard Worker    --skip-consistency-check
142*0d6140beSAndroid Build Coastguard Worker        Skip the consistency check (two consecutive reads) at beginning.
143*0d6140beSAndroid Build Coastguard Worker    --small-region
144*0d6140beSAndroid Build Coastguard Worker        Omit tests that require large amounts of space (>16KB).
145*0d6140beSAndroid Build Coastguard WorkerRemote connectivity options:
146*0d6140beSAndroid Build Coastguard Worker    --ssh-port <port>
147*0d6140beSAndroid Build Coastguard Worker        Use a specific SSH port.
148*0d6140beSAndroid Build Coastguard Worker
149*0d6140beSAndroid Build Coastguard WorkerSee documentation for usage examples (TODO: Migrate https://goo.gl/3jNoL7
150*0d6140beSAndroid Build Coastguard Workerto flashrom wiki).\n
151*0d6140beSAndroid Build Coastguard Worker"
152*0d6140beSAndroid Build Coastguard Worker}
153*0d6140beSAndroid Build Coastguard Worker
154*0d6140beSAndroid Build Coastguard Workergetopt -T
155*0d6140beSAndroid Build Coastguard Workerif [ $? -ne 4 ]; then
156*0d6140beSAndroid Build Coastguard Worker	printf "GNU-compatible getopt(1) required.\n"
157*0d6140beSAndroid Build Coastguard Worker	exit $EXIT_FAILURE
158*0d6140beSAndroid Build Coastguard Workerfi
159*0d6140beSAndroid Build Coastguard Worker
160*0d6140beSAndroid Build Coastguard WorkerLONGOPTS="backup-image:,help,,new:,old:,remote-host:,upload-results:"
161*0d6140beSAndroid Build Coastguard WorkerLONGOPTS="${LONGOPTS},primary-programmer:,secondary-programmer:,local-flashrom:"
162*0d6140beSAndroid Build Coastguard WorkerLONGOPTS="${LONGOPTS},custom-hooks:,mode:,skip-consistency-check,small-region"
163*0d6140beSAndroid Build Coastguard WorkerLONGOPTS="${LONGOPTS},type:,voltage:"
164*0d6140beSAndroid Build Coastguard WorkerLONGOPTS="${LONGOPTS},layout-file:,descriptor-region:,flashmap-region:,layout-region:"
165*0d6140beSAndroid Build Coastguard WorkerLONGOPTS="${LONGOPTS},no-clean"
166*0d6140beSAndroid Build Coastguard WorkerLONGOPTS="${LONGOPTS},ssh-port:"
167*0d6140beSAndroid Build Coastguard Worker
168*0d6140beSAndroid Build Coastguard WorkerARGS=$(getopt -o b:hl:m:n:o:p:r:s:t:u -l "$LONGOPTS" -n "$0" -- "$@");
169*0d6140beSAndroid Build Coastguard Workerif [ $? != 0 ] ; then printf "Terminating...\n" >&2 ; exit 1 ; fi
170*0d6140beSAndroid Build Coastguard Workereval set -- "$ARGS"
171*0d6140beSAndroid Build Coastguard Workerwhile true ; do
172*0d6140beSAndroid Build Coastguard Worker	case "$1" in
173*0d6140beSAndroid Build Coastguard Worker		# Generic options
174*0d6140beSAndroid Build Coastguard Worker		-b|--backup-image)
175*0d6140beSAndroid Build Coastguard Worker			shift
176*0d6140beSAndroid Build Coastguard Worker			BACKUP_IMAGE="$1"
177*0d6140beSAndroid Build Coastguard Worker			;;
178*0d6140beSAndroid Build Coastguard Worker		-h|--help)
179*0d6140beSAndroid Build Coastguard Worker			show_help
180*0d6140beSAndroid Build Coastguard Worker			exit $EXIT_SUCCESS
181*0d6140beSAndroid Build Coastguard Worker			;;
182*0d6140beSAndroid Build Coastguard Worker		-l|--layout-file)
183*0d6140beSAndroid Build Coastguard Worker			shift
184*0d6140beSAndroid Build Coastguard Worker			LAYOUT_FILE="$1"
185*0d6140beSAndroid Build Coastguard Worker			;;
186*0d6140beSAndroid Build Coastguard Worker		-m|--mode)
187*0d6140beSAndroid Build Coastguard Worker			shift
188*0d6140beSAndroid Build Coastguard Worker			if [ "$1" = "clobber" ]; then
189*0d6140beSAndroid Build Coastguard Worker				REGION_MODE=$REGION_MODE_CLOBBER
190*0d6140beSAndroid Build Coastguard Worker			elif [ "$1" = "descriptor" ]; then
191*0d6140beSAndroid Build Coastguard Worker				REGION_MODE=$REGION_MODE_DESCRIPTOR
192*0d6140beSAndroid Build Coastguard Worker			elif [ "$1" = "flashmap" ]; then
193*0d6140beSAndroid Build Coastguard Worker				REGION_MODE=$REGION_MODE_FLASHMAP
194*0d6140beSAndroid Build Coastguard Worker			elif [ "$1" = "layout" ]; then
195*0d6140beSAndroid Build Coastguard Worker				REGION_MODE=$REGION_MODE_LAYOUT
196*0d6140beSAndroid Build Coastguard Worker			else
197*0d6140beSAndroid Build Coastguard Worker				printf "Unknown mode: $1\n"
198*0d6140beSAndroid Build Coastguard Worker				exit $EXIT_FAILURE
199*0d6140beSAndroid Build Coastguard Worker			fi
200*0d6140beSAndroid Build Coastguard Worker			;;
201*0d6140beSAndroid Build Coastguard Worker		-n|--new)
202*0d6140beSAndroid Build Coastguard Worker			shift
203*0d6140beSAndroid Build Coastguard Worker			NEW_FLASHROM="$1"
204*0d6140beSAndroid Build Coastguard Worker			;;
205*0d6140beSAndroid Build Coastguard Worker		-o|--old)
206*0d6140beSAndroid Build Coastguard Worker			shift
207*0d6140beSAndroid Build Coastguard Worker			OLD_FLASHROM="$1"
208*0d6140beSAndroid Build Coastguard Worker			;;
209*0d6140beSAndroid Build Coastguard Worker		-p|--primary_programmer)
210*0d6140beSAndroid Build Coastguard Worker			shift
211*0d6140beSAndroid Build Coastguard Worker			PRIMARY_OPTS="-p $1"
212*0d6140beSAndroid Build Coastguard Worker			;;
213*0d6140beSAndroid Build Coastguard Worker		-s|--secondary_programmer)
214*0d6140beSAndroid Build Coastguard Worker			shift
215*0d6140beSAndroid Build Coastguard Worker			SECONDARY_OPTS="-p $1"
216*0d6140beSAndroid Build Coastguard Worker			;;
217*0d6140beSAndroid Build Coastguard Worker		-t|--type)
218*0d6140beSAndroid Build Coastguard Worker			shift
219*0d6140beSAndroid Build Coastguard Worker			if [ "$1" = "single" ]; then
220*0d6140beSAndroid Build Coastguard Worker				TEST_TYPE=$TEST_TYPE_SINGLE
221*0d6140beSAndroid Build Coastguard Worker			elif [ "$1" = "endurance" ]; then
222*0d6140beSAndroid Build Coastguard Worker				TEST_TYPE=$TEST_TYPE_ENDURANCE
223*0d6140beSAndroid Build Coastguard Worker			else
224*0d6140beSAndroid Build Coastguard Worker				printf "Unknown type: $1\n"
225*0d6140beSAndroid Build Coastguard Worker				exit $EXIT_FAILURE
226*0d6140beSAndroid Build Coastguard Worker			fi
227*0d6140beSAndroid Build Coastguard Worker			;;
228*0d6140beSAndroid Build Coastguard Worker		-r|--remote-host)
229*0d6140beSAndroid Build Coastguard Worker			DO_REMOTE=1
230*0d6140beSAndroid Build Coastguard Worker			shift
231*0d6140beSAndroid Build Coastguard Worker			REMOTE_HOST="$1"
232*0d6140beSAndroid Build Coastguard Worker			;;
233*0d6140beSAndroid Build Coastguard Worker		-u|--upload-results)
234*0d6140beSAndroid Build Coastguard Worker			UPLOAD_RESULTS=1
235*0d6140beSAndroid Build Coastguard Worker			;;
236*0d6140beSAndroid Build Coastguard Worker		-v|--voltage)
237*0d6140beSAndroid Build Coastguard Worker			shift
238*0d6140beSAndroid Build Coastguard Worker			VOLTAGE="$1"
239*0d6140beSAndroid Build Coastguard Worker			;;
240*0d6140beSAndroid Build Coastguard Worker
241*0d6140beSAndroid Build Coastguard Worker		# Longopts only
242*0d6140beSAndroid Build Coastguard Worker		--custom-hooks)
243*0d6140beSAndroid Build Coastguard Worker			shift
244*0d6140beSAndroid Build Coastguard Worker			CUSTOM_HOOKS_FILENAME="$1"
245*0d6140beSAndroid Build Coastguard Worker			;;
246*0d6140beSAndroid Build Coastguard Worker		--descriptor-region)
247*0d6140beSAndroid Build Coastguard Worker			shift
248*0d6140beSAndroid Build Coastguard Worker			DESCRIPTOR_REGION="$1"
249*0d6140beSAndroid Build Coastguard Worker			;;
250*0d6140beSAndroid Build Coastguard Worker		--flashmap-region)
251*0d6140beSAndroid Build Coastguard Worker			shift
252*0d6140beSAndroid Build Coastguard Worker			FLASHMAP_REGION="$1"
253*0d6140beSAndroid Build Coastguard Worker			;;
254*0d6140beSAndroid Build Coastguard Worker		--layout-region)
255*0d6140beSAndroid Build Coastguard Worker			shift
256*0d6140beSAndroid Build Coastguard Worker			LAYOUT_REGION="$1"
257*0d6140beSAndroid Build Coastguard Worker			;;
258*0d6140beSAndroid Build Coastguard Worker		--local-flashrom)
259*0d6140beSAndroid Build Coastguard Worker			shift
260*0d6140beSAndroid Build Coastguard Worker			LOCAL_FLASHROM="$1"
261*0d6140beSAndroid Build Coastguard Worker			;;
262*0d6140beSAndroid Build Coastguard Worker		--no-clean)
263*0d6140beSAndroid Build Coastguard Worker			NO_CLEAN=1
264*0d6140beSAndroid Build Coastguard Worker			;;
265*0d6140beSAndroid Build Coastguard Worker		--skip-consistency-check)
266*0d6140beSAndroid Build Coastguard Worker			SKIP_CONSISTENCY_CHECK=1
267*0d6140beSAndroid Build Coastguard Worker			;;
268*0d6140beSAndroid Build Coastguard Worker		--small-region)
269*0d6140beSAndroid Build Coastguard Worker			SMALL_REGION=1
270*0d6140beSAndroid Build Coastguard Worker			;;
271*0d6140beSAndroid Build Coastguard Worker
272*0d6140beSAndroid Build Coastguard Worker		# Remote testing options
273*0d6140beSAndroid Build Coastguard Worker		--ssh-port)
274*0d6140beSAndroid Build Coastguard Worker			shift
275*0d6140beSAndroid Build Coastguard Worker			REMOTE_PORT_OPTION="-p $1"
276*0d6140beSAndroid Build Coastguard Worker			;;
277*0d6140beSAndroid Build Coastguard Worker
278*0d6140beSAndroid Build Coastguard Worker		# error handling
279*0d6140beSAndroid Build Coastguard Worker		--)
280*0d6140beSAndroid Build Coastguard Worker			shift
281*0d6140beSAndroid Build Coastguard Worker			if [ -n "$*" ]; then
282*0d6140beSAndroid Build Coastguard Worker				printf "Non-option parameters detected: '$*'\n"
283*0d6140beSAndroid Build Coastguard Worker				exit $EXIT_FAILURE
284*0d6140beSAndroid Build Coastguard Worker			fi
285*0d6140beSAndroid Build Coastguard Worker			break
286*0d6140beSAndroid Build Coastguard Worker			;;
287*0d6140beSAndroid Build Coastguard Worker		*)
288*0d6140beSAndroid Build Coastguard Worker			printf "error processing options at '$1'\n"
289*0d6140beSAndroid Build Coastguard Worker			exit $EXIT_FAILURE
290*0d6140beSAndroid Build Coastguard Worker	esac
291*0d6140beSAndroid Build Coastguard Worker	shift
292*0d6140beSAndroid Build Coastguard Workerdone
293*0d6140beSAndroid Build Coastguard Worker
294*0d6140beSAndroid Build Coastguard Worker# TODO: Implement this.
295*0d6140beSAndroid Build Coastguard Workerif [ $UPLOAD_RESULTS -eq 1 ]; then
296*0d6140beSAndroid Build Coastguard Worker	printf "TODO: Implement ability to upload results.\n"
297*0d6140beSAndroid Build Coastguard Worker	exit $EXIT_FAILURE
298*0d6140beSAndroid Build Coastguard Workerfi
299*0d6140beSAndroid Build Coastguard Worker
300*0d6140beSAndroid Build Coastguard Worker#
301*0d6140beSAndroid Build Coastguard Worker# Source helper scripts
302*0d6140beSAndroid Build Coastguard Worker#
303*0d6140beSAndroid Build Coastguard Workerexport REMOTE_HOST REMOTE_PORT_OPTION
304*0d6140beSAndroid Build Coastguard Workerexport LOCAL REMOTE FATAL NONFATAL EXIT_SUCCESS EXIT_FAILURE
305*0d6140beSAndroid Build Coastguard Workerexport CUSTOM_HOOKS_FILENAME SUDO_CMD VOLTAGE
306*0d6140beSAndroid Build Coastguard Worker. "$(pwd)/util/testing/cmd.sh"
307*0d6140beSAndroid Build Coastguard Worker
308*0d6140beSAndroid Build Coastguard Worker# We will set up a logs directory within the tmpdirs to store
309*0d6140beSAndroid Build Coastguard Worker# all output logs.
310*0d6140beSAndroid Build Coastguard WorkerLOGS="logs"
311*0d6140beSAndroid Build Coastguard Worker
312*0d6140beSAndroid Build Coastguard Worker# Setup temporary working directories:
313*0d6140beSAndroid Build Coastguard Worker# LOCAL_TMPDIR:  Working directory on local host.
314*0d6140beSAndroid Build Coastguard Worker# REMOTE_TMPDIR: Working directory on remote host.
315*0d6140beSAndroid Build Coastguard Worker# TMPDIR:        The temporary directory in which we do most of the work. This is
316*0d6140beSAndroid Build Coastguard Worker#                convenient for commands that depend on $DO_REMOTE.
317*0d6140beSAndroid Build Coastguard WorkerLOCAL_TMPDIR=$(mktemp -d --tmpdir flashrom_test.XXXXXXXX)
318*0d6140beSAndroid Build Coastguard Workerif [ $? -ne 0 ] ; then
319*0d6140beSAndroid Build Coastguard Worker	printf "Could not create temporary directory\n"
320*0d6140beSAndroid Build Coastguard Worker	exit $EXIT_FAILURE
321*0d6140beSAndroid Build Coastguard Workerfi
322*0d6140beSAndroid Build Coastguard Workermkdir "${LOCAL_TMPDIR}/${LOGS}"
323*0d6140beSAndroid Build Coastguard Worker
324*0d6140beSAndroid Build Coastguard Workerif [ $DO_REMOTE -eq 1 ]; then
325*0d6140beSAndroid Build Coastguard Worker	REMOTE_TMPDIR=$(ssh root@${REMOTE_HOST} mktemp -d --tmpdir flashrom_test.XXXXXXXX)
326*0d6140beSAndroid Build Coastguard Worker	if [ $? -ne 0 ] ; then
327*0d6140beSAndroid Build Coastguard Worker		printf "Could not create temporary directory\n"
328*0d6140beSAndroid Build Coastguard Worker		exit $EXIT_FAILURE
329*0d6140beSAndroid Build Coastguard Worker	fi
330*0d6140beSAndroid Build Coastguard Worker	scmd $REMOTE "mkdir ${REMOTE_TMPDIR}/${LOGS}"
331*0d6140beSAndroid Build Coastguard Workerfi
332*0d6140beSAndroid Build Coastguard Worker
333*0d6140beSAndroid Build Coastguard Workerif [ $DO_REMOTE -eq 0 ]; then
334*0d6140beSAndroid Build Coastguard Worker	TMPDIR="$LOCAL_TMPDIR"
335*0d6140beSAndroid Build Coastguard Workerelse
336*0d6140beSAndroid Build Coastguard Worker	TMPDIR="$REMOTE_TMPDIR"
337*0d6140beSAndroid Build Coastguard Workerfi
338*0d6140beSAndroid Build Coastguard Worker
339*0d6140beSAndroid Build Coastguard Worker#
340*0d6140beSAndroid Build Coastguard Worker# Test command-line validity.
341*0d6140beSAndroid Build Coastguard Worker#
342*0d6140beSAndroid Build Coastguard Workerif [ $TEST_TYPE -eq $TEST_TYPE_UNKNOWN ]; then
343*0d6140beSAndroid Build Coastguard Worker	printf "Must specify a test type (-t/--type).\n"
344*0d6140beSAndroid Build Coastguard Worker	exit $EXIT_FAILURE
345*0d6140beSAndroid Build Coastguard Workerelif [ $TEST_TYPE -eq $TEST_TYPE_SINGLE ]; then
346*0d6140beSAndroid Build Coastguard Worker	if [ $REGION_MODE -eq $REGION_MODE_UNKNOWN ]; then
347*0d6140beSAndroid Build Coastguard Worker		printf "Must specify a region access mode (-m/--mode).\n"
348*0d6140beSAndroid Build Coastguard Worker		exit $EXIT_FAILURE
349*0d6140beSAndroid Build Coastguard Worker	elif [ $REGION_MODE -eq $REGION_MODE_LAYOUT ]; then
350*0d6140beSAndroid Build Coastguard Worker		if [ -z "$LAYOUT_FILE" ]; then
351*0d6140beSAndroid Build Coastguard Worker			printf "Must specify a layout file when using layout mode.\n"
352*0d6140beSAndroid Build Coastguard Worker			exit $EXIT_FAILURE
353*0d6140beSAndroid Build Coastguard Worker		fi
354*0d6140beSAndroid Build Coastguard Worker
355*0d6140beSAndroid Build Coastguard Worker		scmd $DO_REMOTE "stat $LAYOUT_FILE"
356*0d6140beSAndroid Build Coastguard Worker		if [ $? -ne 0 ]; then
357*0d6140beSAndroid Build Coastguard Worker			if [ $DO_REMOTE -eq 1 ]; then
358*0d6140beSAndroid Build Coastguard Worker				tmp=" on remote host $REMOTE_HOST."
359*0d6140beSAndroid Build Coastguard Worker			else
360*0d6140beSAndroid Build Coastguard Worker				tmp=" on local host."
361*0d6140beSAndroid Build Coastguard Worker			fi
362*0d6140beSAndroid Build Coastguard Worker			printf "Layout file $LAYOUT_FILE not found${tmp}\n"
363*0d6140beSAndroid Build Coastguard Worker			exit $EXIT_FAILURE
364*0d6140beSAndroid Build Coastguard Worker		fi
365*0d6140beSAndroid Build Coastguard Worker
366*0d6140beSAndroid Build Coastguard Worker		if [ $DO_REMOTE -eq 1 ]; then
367*0d6140beSAndroid Build Coastguard Worker			scp root@"${REMOTE_HOST}:$LAYOUT_FILE" "${LOCAL_TMPDIR}/" 2>&1 >/dev/null
368*0d6140beSAndroid Build Coastguard Worker		else
369*0d6140beSAndroid Build Coastguard Worker			cp "$LAYOUT_FILE" "${LOCAL_TMPDIR}/"
370*0d6140beSAndroid Build Coastguard Worker		fi
371*0d6140beSAndroid Build Coastguard Worker	fi
372*0d6140beSAndroid Build Coastguard Workerfi
373*0d6140beSAndroid Build Coastguard Worker
374*0d6140beSAndroid Build Coastguard Workerif [ -n "$VOLTAGE" ]; then
375*0d6140beSAndroid Build Coastguard Worker	echo "$VOLTAGE" | grep -q '[^0-9]'
376*0d6140beSAndroid Build Coastguard Worker	if [ $? -ne 1 ]; then
377*0d6140beSAndroid Build Coastguard Worker		printf "Voltage must be an integer with units of millivolts."
378*0d6140beSAndroid Build Coastguard Worker		exit $EXIT_FAILURE
379*0d6140beSAndroid Build Coastguard Worker	fi
380*0d6140beSAndroid Build Coastguard Workerfi
381*0d6140beSAndroid Build Coastguard Worker
382*0d6140beSAndroid Build Coastguard Workerif [ $DO_REMOTE -eq 1 ]; then
383*0d6140beSAndroid Build Coastguard Worker	# Test connection to remote host
384*0d6140beSAndroid Build Coastguard Worker	test_cmd $DO_REMOTE "ls /" $NONFATAL
385*0d6140beSAndroid Build Coastguard Worker	if [ $? -ne 0 ]; then
386*0d6140beSAndroid Build Coastguard Worker		printf "Could not connect to remote host ${REMOTE_HOST}\n"
387*0d6140beSAndroid Build Coastguard Worker		exit $EXIT_FAILURE
388*0d6140beSAndroid Build Coastguard Worker	fi
389*0d6140beSAndroid Build Coastguard Workerfi
390*0d6140beSAndroid Build Coastguard Worker
391*0d6140beSAndroid Build Coastguard Worker# Remote host and secondary programmer are in use, so either the user must
392*0d6140beSAndroid Build Coastguard Worker# specify a local version of flashrom to control the secondary programmer
393*0d6140beSAndroid Build Coastguard Worker# or it must be found in the default path.
394*0d6140beSAndroid Build Coastguard Workerif [ $DO_REMOTE -eq 1 ] && [ -n "$SECONDARY_OPTS" ]; then
395*0d6140beSAndroid Build Coastguard Worker	if [ -z "$LOCAL_FLASHROM" ]; then
396*0d6140beSAndroid Build Coastguard Worker		LOCAL_FLASHROM="$($SUDO_CMD which flashrom)"
397*0d6140beSAndroid Build Coastguard Worker	fi
398*0d6140beSAndroid Build Coastguard Worker
399*0d6140beSAndroid Build Coastguard Worker	if [ ! -e "$LOCAL_FLASHROM" ]; then
400*0d6140beSAndroid Build Coastguard Worker		printf "$LOCAL_FLASHROM does not exist\n"
401*0d6140beSAndroid Build Coastguard Worker		exit $EXIT_FAILURE
402*0d6140beSAndroid Build Coastguard Worker	fi
403*0d6140beSAndroid Build Coastguard Workerfi
404*0d6140beSAndroid Build Coastguard Worker
405*0d6140beSAndroid Build Coastguard Worker#
406*0d6140beSAndroid Build Coastguard Worker# Dependencies
407*0d6140beSAndroid Build Coastguard Worker#
408*0d6140beSAndroid Build Coastguard Worker
409*0d6140beSAndroid Build Coastguard Worker# cmp is used to compare files
410*0d6140beSAndroid Build Coastguard Workertest_cmd $DO_REMOTE "cmp" $FATAL
411*0d6140beSAndroid Build Coastguard Worker
412*0d6140beSAndroid Build Coastguard Workerif [ ! -e "/dev/urandom" ]; then
413*0d6140beSAndroid Build Coastguard Worker	printf "This script uses /dev/urandom\n"
414*0d6140beSAndroid Build Coastguard Worker	exit $EXIT_FAILURE
415*0d6140beSAndroid Build Coastguard Workerfi
416*0d6140beSAndroid Build Coastguard Worker
417*0d6140beSAndroid Build Coastguard Workerif [ ! -e "/dev/zero" ]; then
418*0d6140beSAndroid Build Coastguard Worker	printf "This script uses /dev/zero\n"
419*0d6140beSAndroid Build Coastguard Worker	exit $EXIT_FAILURE
420*0d6140beSAndroid Build Coastguard Workerfi
421*0d6140beSAndroid Build Coastguard Worker
422*0d6140beSAndroid Build Coastguard Worker#
423*0d6140beSAndroid Build Coastguard Worker# Setup.
424*0d6140beSAndroid Build Coastguard Worker#
425*0d6140beSAndroid Build Coastguard Worker
426*0d6140beSAndroid Build Coastguard Worker# Naive path check
427*0d6140beSAndroid Build Coastguard Workerif [ ! -e "$TEST_SCRIPT_PATH" ] ; then
428*0d6140beSAndroid Build Coastguard Worker	printf "Script must be run from root of flashrom directory\n"
429*0d6140beSAndroid Build Coastguard Worker	exit $EXIT_FAILURE
430*0d6140beSAndroid Build Coastguard Workerfi
431*0d6140beSAndroid Build Coastguard Worker
432*0d6140beSAndroid Build Coastguard Workerif [ -z "$OLD_FLASHROM" ]; then
433*0d6140beSAndroid Build Coastguard Worker	if [ $DO_REMOTE -eq 1 ]; then
434*0d6140beSAndroid Build Coastguard Worker		OLD_FLASHROM="$(ssh root@${REMOTE_HOST} which flashrom)"
435*0d6140beSAndroid Build Coastguard Worker	else
436*0d6140beSAndroid Build Coastguard Worker		OLD_FLASHROM="$($SUDO_CMD which flashrom)"
437*0d6140beSAndroid Build Coastguard Worker	fi
438*0d6140beSAndroid Build Coastguard Workerfi
439*0d6140beSAndroid Build Coastguard Workertest_cmd $DO_REMOTE "$OLD_FLASHROM --help" $NONFATAL
440*0d6140beSAndroid Build Coastguard Workerif [ $? -ne 0 ]; then
441*0d6140beSAndroid Build Coastguard Worker	printf "Old flashrom binary is not usable.\n"
442*0d6140beSAndroid Build Coastguard Worker	exit $EXIT_FAILURE
443*0d6140beSAndroid Build Coastguard Workerfi
444*0d6140beSAndroid Build Coastguard Worker
445*0d6140beSAndroid Build Coastguard Worker# print $1 and store it in the script log file
446*0d6140beSAndroid Build Coastguard Workerprint_and_log()
447*0d6140beSAndroid Build Coastguard Worker{
448*0d6140beSAndroid Build Coastguard Worker	printf "$1" | tee -a "${LOCAL_TMPDIR}/${LOGS}/${SCRIPT_LOGFILE}"
449*0d6140beSAndroid Build Coastguard Worker}
450*0d6140beSAndroid Build Coastguard Worker
451*0d6140beSAndroid Build Coastguard Worker# Copy files from local tmpdir to remote host tmpdir
452*0d6140beSAndroid Build Coastguard Workercopy_to_remote()
453*0d6140beSAndroid Build Coastguard Worker{
454*0d6140beSAndroid Build Coastguard Worker	for F in $@; do
455*0d6140beSAndroid Build Coastguard Worker		scp "${LOCAL_TMPDIR}/${F}" root@"${REMOTE_HOST}:${REMOTE_TMPDIR}" 2>&1 >/dev/null
456*0d6140beSAndroid Build Coastguard Worker	done
457*0d6140beSAndroid Build Coastguard Worker}
458*0d6140beSAndroid Build Coastguard Worker
459*0d6140beSAndroid Build Coastguard Worker# Copy files from remote host tmpdir to local tmpdir
460*0d6140beSAndroid Build Coastguard Workercopy_from_remote()
461*0d6140beSAndroid Build Coastguard Worker{
462*0d6140beSAndroid Build Coastguard Worker	for F in $@; do
463*0d6140beSAndroid Build Coastguard Worker		scp root@"${REMOTE_HOST}:${REMOTE_TMPDIR}/${F}" "${LOCAL_TMPDIR}/" 2>&1 >/dev/null
464*0d6140beSAndroid Build Coastguard Worker	done
465*0d6140beSAndroid Build Coastguard Worker}
466*0d6140beSAndroid Build Coastguard Worker
467*0d6140beSAndroid Build Coastguard Worker# A wrapper for scmd calls to flashrom when we want to log the output
468*0d6140beSAndroid Build Coastguard Worker# $1: 0 ($LOCAL) to run command locally,
469*0d6140beSAndroid Build Coastguard Worker#     1 ($REMOTE) to run remotely if remote host defined
470*0d6140beSAndroid Build Coastguard Worker# $2: arguments to be passed into scmd
471*0d6140beSAndroid Build Coastguard Worker# $3: context of the flashrom call (to be used in the logfile)
472*0d6140beSAndroid Build Coastguard Workerflashrom_log_scmd()
473*0d6140beSAndroid Build Coastguard Worker{
474*0d6140beSAndroid Build Coastguard Worker	local logfile="flashrom-${3}.txt"
475*0d6140beSAndroid Build Coastguard Worker	local rc
476*0d6140beSAndroid Build Coastguard Worker
477*0d6140beSAndroid Build Coastguard Worker	if [ $1 -eq $REMOTE ]; then
478*0d6140beSAndroid Build Coastguard Worker		tmpdir=$REMOTE_TMPDIR
479*0d6140beSAndroid Build Coastguard Worker	else
480*0d6140beSAndroid Build Coastguard Worker		tmpdir=$LOCAL_TMPDIR
481*0d6140beSAndroid Build Coastguard Worker	fi
482*0d6140beSAndroid Build Coastguard Worker
483*0d6140beSAndroid Build Coastguard Worker	scmd $1 "$2 -o ${tmpdir}/${LOGS}/${logfile}"; rc=$?
484*0d6140beSAndroid Build Coastguard Worker	# if the call was successful, we don't want to save the log (only save failure logs)
485*0d6140beSAndroid Build Coastguard Worker	if [ $rc -eq $EXIT_SUCCESS ]; then
486*0d6140beSAndroid Build Coastguard Worker		scmd $1 "rm -f ${tmpdir}/${LOGS}/${logfile}"
487*0d6140beSAndroid Build Coastguard Worker	else
488*0d6140beSAndroid Build Coastguard Worker		# if the log was stored remotely, we want to copy it over to local tmpdir
489*0d6140beSAndroid Build Coastguard Worker		if [ $1 -eq $REMOTE ]; then
490*0d6140beSAndroid Build Coastguard Worker			scp root@"${REMOTE_HOST}:${REMOTE_TMPDIR}/${LOGS}/${logfile}" "${LOCAL_TMPDIR}/${LOGS}" 2>&1 >/dev/null
491*0d6140beSAndroid Build Coastguard Worker		fi
492*0d6140beSAndroid Build Coastguard Worker	fi
493*0d6140beSAndroid Build Coastguard Worker
494*0d6140beSAndroid Build Coastguard Worker	return $rc
495*0d6140beSAndroid Build Coastguard Worker}
496*0d6140beSAndroid Build Coastguard Worker
497*0d6140beSAndroid Build Coastguard Worker# Read current image as backup in case one hasn't already been specified.
498*0d6140beSAndroid Build Coastguard Workerif [ -z "$BACKUP_IMAGE" ]; then
499*0d6140beSAndroid Build Coastguard Worker	backup_file="backup.bin"
500*0d6140beSAndroid Build Coastguard Worker	if [ $DO_REMOTE -eq 1 ]; then
501*0d6140beSAndroid Build Coastguard Worker		BACKUP_IMAGE="${REMOTE_TMPDIR}/${backup_file}"
502*0d6140beSAndroid Build Coastguard Worker	else
503*0d6140beSAndroid Build Coastguard Worker		BACKUP_IMAGE="${LOCAL_TMPDIR}/${backup_file}"
504*0d6140beSAndroid Build Coastguard Worker	fi
505*0d6140beSAndroid Build Coastguard Worker
506*0d6140beSAndroid Build Coastguard Worker	print_and_log "Reading backup image..."
507*0d6140beSAndroid Build Coastguard Worker	flashrom_log_scmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS -r $BACKUP_IMAGE" "read_backup"
508*0d6140beSAndroid Build Coastguard Worker
509*0d6140beSAndroid Build Coastguard Worker	if [ $? -ne 0 ]; then
510*0d6140beSAndroid Build Coastguard Worker		print_and_log "Failed to read backup image, aborting.\n"
511*0d6140beSAndroid Build Coastguard Worker		exit $EXIT_FAILURE
512*0d6140beSAndroid Build Coastguard Worker	fi
513*0d6140beSAndroid Build Coastguard Worker
514*0d6140beSAndroid Build Coastguard Worker	if [ $DO_REMOTE -eq 1 ]; then
515*0d6140beSAndroid Build Coastguard Worker		copy_from_remote "$backup_file"
516*0d6140beSAndroid Build Coastguard Worker	fi
517*0d6140beSAndroid Build Coastguard Workerelse
518*0d6140beSAndroid Build Coastguard Worker	if [ $DO_REMOTE -eq 1 ]; then
519*0d6140beSAndroid Build Coastguard Worker		scmd $DO_REMOTE "cp $BACKUP_IMAGE $REMOTE_TMPDIR"
520*0d6140beSAndroid Build Coastguard Worker		copy_from_remote "$(basename $BACKUP_IMAGE)"
521*0d6140beSAndroid Build Coastguard Worker	fi
522*0d6140beSAndroid Build Coastguard Workerfi
523*0d6140beSAndroid Build Coastguard Worker
524*0d6140beSAndroid Build Coastguard Worker# The copy of flashrom to test. If unset, we'll assume the user wants to test
525*0d6140beSAndroid Build Coastguard Worker# a newly built flashrom binary in the current directory.
526*0d6140beSAndroid Build Coastguard Workerif [ -z "$NEW_FLASHROM" ] ; then
527*0d6140beSAndroid Build Coastguard Worker	if [ -x "flashrom" ]; then
528*0d6140beSAndroid Build Coastguard Worker		NEW_FLASHROM="flashrom"
529*0d6140beSAndroid Build Coastguard Worker	else
530*0d6140beSAndroid Build Coastguard Worker		print_and_log "Must supply new flashrom version to test\n"
531*0d6140beSAndroid Build Coastguard Worker		exit $EXIT_FAILURE
532*0d6140beSAndroid Build Coastguard Worker	fi
533*0d6140beSAndroid Build Coastguard Workerfi
534*0d6140beSAndroid Build Coastguard Worker
535*0d6140beSAndroid Build Coastguard Workerprint_and_log "Stable flashrom binary: ${OLD_FLASHROM}\n"
536*0d6140beSAndroid Build Coastguard Workerprint_and_log "New flashrom binary to test: ${NEW_FLASHROM}\n"
537*0d6140beSAndroid Build Coastguard Workerprint_and_log "Local temporary files will be stored in ${LOCAL_TMPDIR}\n"
538*0d6140beSAndroid Build Coastguard Workerif [ $DO_REMOTE -eq 1 ]; then
539*0d6140beSAndroid Build Coastguard Worker	print_and_log "Remote temporary files will be stored in ${REMOTE_HOST}:${REMOTE_TMPDIR}\n"
540*0d6140beSAndroid Build Coastguard Worker	print_and_log "Backup image: ${REMOTE_HOST}:${BACKUP_IMAGE}\n"
541*0d6140beSAndroid Build Coastguard Worker	print_and_log "Backup image also stored at: ${LOCAL_TMPDIR}/$(basename ${BACKUP_IMAGE})\n"
542*0d6140beSAndroid Build Coastguard Workerelse
543*0d6140beSAndroid Build Coastguard Worker	print_and_log "Backup image: ${BACKUP_IMAGE}\n"
544*0d6140beSAndroid Build Coastguard Workerfi
545*0d6140beSAndroid Build Coastguard Worker
546*0d6140beSAndroid Build Coastguard Worker#
547*0d6140beSAndroid Build Coastguard Worker# Now the fun begins.
548*0d6140beSAndroid Build Coastguard Worker#
549*0d6140beSAndroid Build Coastguard Workercmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS --flash-size" "${LOCAL_TMPDIR}/old_chip_size.txt.orig"
550*0d6140beSAndroid Build Coastguard Workercmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS --flash-size" "${LOCAL_TMPDIR}/new_chip_size.txt.orig"
551*0d6140beSAndroid Build Coastguard Worker# get rid of banner and other superfluous output from flashrom
552*0d6140beSAndroid Build Coastguard Workertail -n 1 "${LOCAL_TMPDIR}/old_chip_size.txt.orig" > "${LOCAL_TMPDIR}/old_chip_size.txt"
553*0d6140beSAndroid Build Coastguard Workertail -n 1 "${LOCAL_TMPDIR}/new_chip_size.txt.orig" > "${LOCAL_TMPDIR}/new_chip_size.txt"
554*0d6140beSAndroid Build Coastguard Workertmp=$(cat ${LOCAL_TMPDIR}/old_chip_size.txt)
555*0d6140beSAndroid Build Coastguard WorkerCHIP_SIZE=$(cat ${LOCAL_TMPDIR}/new_chip_size.txt)
556*0d6140beSAndroid Build Coastguard WorkerCHIP_SIZE_KB=$(($CHIP_SIZE / $K))
557*0d6140beSAndroid Build Coastguard WorkerCHIP_SIZE_HALF=$(($CHIP_SIZE / 2))
558*0d6140beSAndroid Build Coastguard Workerif [ $CHIP_SIZE -ne $tmp ]; then
559*0d6140beSAndroid Build Coastguard Worker	print_and_log "New flashrom and old flashrom disagree on chip size. Aborting.\n"
560*0d6140beSAndroid Build Coastguard Worker	exit $EXIT_FAILURE
561*0d6140beSAndroid Build Coastguard Workerelse
562*0d6140beSAndroid Build Coastguard Worker	print_and_log "Chip size: $CHIP_SIZE_KB KiB\n"
563*0d6140beSAndroid Build Coastguard Workerfi
564*0d6140beSAndroid Build Coastguard Worker
565*0d6140beSAndroid Build Coastguard Worker# Upload results
566*0d6140beSAndroid Build Coastguard Worker#do_upload()
567*0d6140beSAndroid Build Coastguard Worker#{
568*0d6140beSAndroid Build Coastguard Worker#	# TODO: implement this
569*0d6140beSAndroid Build Coastguard Worker#}
570*0d6140beSAndroid Build Coastguard Worker
571*0d6140beSAndroid Build Coastguard Worker# Remove temporary files
572*0d6140beSAndroid Build Coastguard Workerdo_cleanup()
573*0d6140beSAndroid Build Coastguard Worker{
574*0d6140beSAndroid Build Coastguard Worker	if [ $NO_CLEAN -eq 1 ]; then
575*0d6140beSAndroid Build Coastguard Worker		print_and_log "Skipping cleanup.\n"
576*0d6140beSAndroid Build Coastguard Worker		return $EXIT_SUCCESS
577*0d6140beSAndroid Build Coastguard Worker	fi
578*0d6140beSAndroid Build Coastguard Worker
579*0d6140beSAndroid Build Coastguard Worker	rm -rf "$LOCAL_TMPDIR"
580*0d6140beSAndroid Build Coastguard Worker	if [ -n "$REMOTE_HOST" ]; then
581*0d6140beSAndroid Build Coastguard Worker		ssh root@${REMOTE_HOST} rm -rf "$REMOTE_TMPDIR"
582*0d6140beSAndroid Build Coastguard Worker	fi
583*0d6140beSAndroid Build Coastguard Worker
584*0d6140beSAndroid Build Coastguard Worker	return $EXIT_SUCCESS
585*0d6140beSAndroid Build Coastguard Worker}
586*0d6140beSAndroid Build Coastguard Worker
587*0d6140beSAndroid Build Coastguard Worker# $1: Message to display to user.
588*0d6140beSAndroid Build Coastguard Workertest_fail()
589*0d6140beSAndroid Build Coastguard Worker{
590*0d6140beSAndroid Build Coastguard Worker	print_and_log "$1\n"
591*0d6140beSAndroid Build Coastguard Worker	printf "Skipping cleanup (logs saved).\n"
592*0d6140beSAndroid Build Coastguard Worker	exit $EXIT_FAILURE
593*0d6140beSAndroid Build Coastguard Worker}
594*0d6140beSAndroid Build Coastguard Worker
595*0d6140beSAndroid Build Coastguard Workerwrite_backup_image()
596*0d6140beSAndroid Build Coastguard Worker{
597*0d6140beSAndroid Build Coastguard Worker	print_and_log "Writing backup image.\n"
598*0d6140beSAndroid Build Coastguard Worker	flashrom_log_scmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS -w $BACKUP_IMAGE" "write_backup"
599*0d6140beSAndroid Build Coastguard Worker	if [ $? -ne 0 ]; then
600*0d6140beSAndroid Build Coastguard Worker		test_fail "Failed to write backup image.\n"
601*0d6140beSAndroid Build Coastguard Worker	fi
602*0d6140beSAndroid Build Coastguard Worker}
603*0d6140beSAndroid Build Coastguard Worker
604*0d6140beSAndroid Build Coastguard Worker# Read a region twice and compare results
605*0d6140beSAndroid Build Coastguard Worker# $1: address of region (in bytes)
606*0d6140beSAndroid Build Coastguard Worker# $2: length of region (in bytes)
607*0d6140beSAndroid Build Coastguard Workerdouble_read_test()
608*0d6140beSAndroid Build Coastguard Worker{
609*0d6140beSAndroid Build Coastguard Worker	local cmp1="${TMPDIR}/read_test1.bin"
610*0d6140beSAndroid Build Coastguard Worker	local cmp2="${TMPDIR}/read_test2.bin"
611*0d6140beSAndroid Build Coastguard Worker	local layout="double_read_test_layout.txt"
612*0d6140beSAndroid Build Coastguard Worker	local len=$(($2 / $K))
613*0d6140beSAndroid Build Coastguard Worker
614*0d6140beSAndroid Build Coastguard Worker	print_and_log "Doing double read test, size: $len KiB\n"
615*0d6140beSAndroid Build Coastguard Worker	# FIXME: Figure out how to do printf remotely...
616*0d6140beSAndroid Build Coastguard Worker	printf "%06x:%06x region\n" $1 $(($1 + $2 - 1)) > "${LOCAL_TMPDIR}/${layout}"
617*0d6140beSAndroid Build Coastguard Worker	if [ $DO_REMOTE -eq 1 ]; then copy_to_remote "$layout" ; fi
618*0d6140beSAndroid Build Coastguard Worker
619*0d6140beSAndroid Build Coastguard Worker	flashrom_log_scmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS -l ${TMPDIR}/${layout} -i region -r ${cmp1}" "double_read_1"
620*0d6140beSAndroid Build Coastguard Worker	# FIXME: second (or maybe third?) read should be done using secondary programmer, if applicable.
621*0d6140beSAndroid Build Coastguard Worker	flashrom_log_scmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS -l ${TMPDIR}/${layout} -i region -r ${cmp2}" "double_read_2"
622*0d6140beSAndroid Build Coastguard Worker	scmd $DO_REMOTE "cmp $cmp1 $cmp2"
623*0d6140beSAndroid Build Coastguard Worker	if [ $? -ne 0 ]; then
624*0d6140beSAndroid Build Coastguard Worker		test_fail "Double-read test failed, aborting."
625*0d6140beSAndroid Build Coastguard Worker	fi
626*0d6140beSAndroid Build Coastguard Worker}
627*0d6140beSAndroid Build Coastguard Worker
628*0d6140beSAndroid Build Coastguard WorkerPARTIAL_WRITE_TEST_REGION_SIZE=0
629*0d6140beSAndroid Build Coastguard WorkerPARTIAL_WRITE_TEST_ALIGN_SIZE_KB=0
630*0d6140beSAndroid Build Coastguard Worker# FIXME: Hack due to lack of region-sized file handling.
631*0d6140beSAndroid Build Coastguard WorkerPARTIAL_WRITE_TEST_REGION_BASE_OFFSET=-1
632*0d6140beSAndroid Build Coastguard Worker
633*0d6140beSAndroid Build Coastguard Worker# helper function to reduce repetitiveness of partial_write_test
634*0d6140beSAndroid Build Coastguard Workerpartial_write_test_helper()
635*0d6140beSAndroid Build Coastguard Worker{
636*0d6140beSAndroid Build Coastguard Worker	local test_name="$1"
637*0d6140beSAndroid Build Coastguard Worker	local pattern_offset_kb=$2
638*0d6140beSAndroid Build Coastguard Worker	local pattern_size_kb=$3
639*0d6140beSAndroid Build Coastguard Worker	local hex="$4"
640*0d6140beSAndroid Build Coastguard Worker	local oct=""
641*0d6140beSAndroid Build Coastguard Worker	local base_offset_kb=$(($PARTIAL_WRITE_TEST_REGION_BASE_OFFSET / $K))
642*0d6140beSAndroid Build Coastguard Worker
643*0d6140beSAndroid Build Coastguard Worker	oct="\\$(printf "%03o" $hex)"
644*0d6140beSAndroid Build Coastguard Worker	cp "${LOCAL_TMPDIR}/random_4k_test.bin" "${LOCAL_TMPDIR}/${test_name}.bin"
645*0d6140beSAndroid Build Coastguard Worker	dd if=/dev/zero bs=1k count=${pattern_size_kb} 2>/dev/null | tr "\000" "$oct" > "${LOCAL_TMPDIR}/${hex}_${pattern_size_kb}k.bin"
646*0d6140beSAndroid Build Coastguard Worker
647*0d6140beSAndroid Build Coastguard Worker	while [ $(($(($pattern_offset_kb + $pattern_size_kb)) * $K)) -lt $PARTIAL_WRITE_TEST_REGION_SIZE ]; do
648*0d6140beSAndroid Build Coastguard Worker		dd if="${LOCAL_TMPDIR}/${hex}_${pattern_size_kb}k.bin" of="${LOCAL_TMPDIR}/${test_name}.bin" bs=1k count=$pattern_size_kb seek=$(($base_offset_kb + $pattern_offset_kb)) conv=notrunc 2>/dev/null
649*0d6140beSAndroid Build Coastguard Worker		pattern_offset_kb=$(($pattern_offset_kb + $PARTIAL_WRITE_TEST_ALIGN_SIZE_KB))
650*0d6140beSAndroid Build Coastguard Worker	done
651*0d6140beSAndroid Build Coastguard Worker}
652*0d6140beSAndroid Build Coastguard Worker
653*0d6140beSAndroid Build Coastguard Worker# Regional partial write test. Given a region name, this will write patterns
654*0d6140beSAndroid Build Coastguard Worker# of bytes designed to test corner cases.
655*0d6140beSAndroid Build Coastguard Worker#
656*0d6140beSAndroid Build Coastguard Worker# We assume that eraseable block size can be either 4KB or 64KB and
657*0d6140beSAndroid Build Coastguard Worker# must test for both. For simplicity, we'll assume the region size is
658*0d6140beSAndroid Build Coastguard Worker# at least 256KB.
659*0d6140beSAndroid Build Coastguard Worker#
660*0d6140beSAndroid Build Coastguard Worker# $1: Region name
661*0d6140beSAndroid Build Coastguard Workerpartial_write_test()
662*0d6140beSAndroid Build Coastguard Worker{
663*0d6140beSAndroid Build Coastguard Worker	local opts="--noverify-all"
664*0d6140beSAndroid Build Coastguard Worker	local secondary_opts=""		# for secondary programmer
665*0d6140beSAndroid Build Coastguard Worker	local region_name="$1"
666*0d6140beSAndroid Build Coastguard Worker	local filename=""
667*0d6140beSAndroid Build Coastguard Worker	local test_num=0
668*0d6140beSAndroid Build Coastguard Worker	local prev_test_num=0
669*0d6140beSAndroid Build Coastguard Worker
670*0d6140beSAndroid Build Coastguard Worker	# FIXME: Hack due to lack of region-sized file handling.
671*0d6140beSAndroid Build Coastguard Worker	if [ $((PARTIAL_WRITE_TEST_REGION_SIZE)) -eq 0 ]; then
672*0d6140beSAndroid Build Coastguard Worker		print_and_log "Size of $region_name unknown\n"
673*0d6140beSAndroid Build Coastguard Worker		return $EXIT_FAILURE
674*0d6140beSAndroid Build Coastguard Worker	fi
675*0d6140beSAndroid Build Coastguard Worker	if [ $((PARTIAL_WRITE_TEST_REGION_BASE_OFFSET)) -lt 0 ]; then
676*0d6140beSAndroid Build Coastguard Worker		print_and_log "Offset of $region_name is unknown\n"
677*0d6140beSAndroid Build Coastguard Worker		return $EXIT_FAILURE
678*0d6140beSAndroid Build Coastguard Worker	fi
679*0d6140beSAndroid Build Coastguard Worker
680*0d6140beSAndroid Build Coastguard Worker	if [ $TEST_TYPE -eq $TEST_TYPE_SINGLE ]; then
681*0d6140beSAndroid Build Coastguard Worker		if [ $REGION_MODE -eq $REGION_MODE_LAYOUT ]; then
682*0d6140beSAndroid Build Coastguard Worker			opts="$opts -l $LAYOUT_FILE"
683*0d6140beSAndroid Build Coastguard Worker			secondary_opts="$opts"
684*0d6140beSAndroid Build Coastguard Worker		elif [ $REGION_MODE -eq $REGION_MODE_CLOBBER ]; then
685*0d6140beSAndroid Build Coastguard Worker			printf "000000:%06x RW\n" $(($CHIP_SIZE - 1)) > "${LOCAL_TMPDIR}/clobber_mode_layout.txt"
686*0d6140beSAndroid Build Coastguard Worker			if [ $DO_REMOTE -eq 1 ]; then
687*0d6140beSAndroid Build Coastguard Worker				copy_to_remote "clobber_mode_layout.txt"
688*0d6140beSAndroid Build Coastguard Worker			fi
689*0d6140beSAndroid Build Coastguard Worker			secondary_opts="$opts -l ${LOCAL_TMPDIR}/clobber_mode_layout.txt"
690*0d6140beSAndroid Build Coastguard Worker			opts="$opts -l ${TMPDIR}/clobber_mode_layout.txt"
691*0d6140beSAndroid Build Coastguard Worker		fi
692*0d6140beSAndroid Build Coastguard Worker	fi
693*0d6140beSAndroid Build Coastguard Worker
694*0d6140beSAndroid Build Coastguard Worker	if [ $SMALL_REGION -eq 1 ]; then
695*0d6140beSAndroid Build Coastguard Worker		PARTIAL_WRITE_TEST_ALIGN_SIZE_KB=16
696*0d6140beSAndroid Build Coastguard Worker	else
697*0d6140beSAndroid Build Coastguard Worker		PARTIAL_WRITE_TEST_ALIGN_SIZE_KB=256
698*0d6140beSAndroid Build Coastguard Worker	fi
699*0d6140beSAndroid Build Coastguard Worker
700*0d6140beSAndroid Build Coastguard Worker	# FIXME: Add sanity checks.
701*0d6140beSAndroid Build Coastguard Worker
702*0d6140beSAndroid Build Coastguard Worker	print_and_log "Doing region-based partial write test on region \"$region_name\"\n"
703*0d6140beSAndroid Build Coastguard Worker	flashrom_log_scmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS $opts -i ${region_name} -r ${TMPDIR}/${region_name}.bin" "read_region_${region_name}"
704*0d6140beSAndroid Build Coastguard Worker	if [ $DO_REMOTE -eq 1 ]; then
705*0d6140beSAndroid Build Coastguard Worker		copy_from_remote "${region_name}.bin"
706*0d6140beSAndroid Build Coastguard Worker	fi
707*0d6140beSAndroid Build Coastguard Worker
708*0d6140beSAndroid Build Coastguard Worker	if [ $(($PARTIAL_WRITE_TEST_REGION_SIZE % $(($PARTIAL_WRITE_TEST_ALIGN_SIZE_KB)))) -ne 0 ]; then
709*0d6140beSAndroid Build Coastguard Worker		print_and_log "Region $region_name is not aligned to $PARTIAL_WRITE_TEST_ALIGN_SIZE_KB\n"
710*0d6140beSAndroid Build Coastguard Worker		return $EXIT_FAILURE
711*0d6140beSAndroid Build Coastguard Worker	fi
712*0d6140beSAndroid Build Coastguard Worker
713*0d6140beSAndroid Build Coastguard Worker	# Test procedure:
714*0d6140beSAndroid Build Coastguard Worker	# Clobber region with random content first. Then do writes using the
715*0d6140beSAndroid Build Coastguard Worker	# following sequences for each 128KB:
716*0d6140beSAndroid Build Coastguard Worker	# 0-2K		: 0x00 (\000)	Partial 4KB sector, lower half
717*0d6140beSAndroid Build Coastguard Worker	# 2K-6K		: 0x11 (\021)	Crossover 4KB sector boundary
718*0d6140beSAndroid Build Coastguard Worker	# 6K-8K		: 0x22 (\042)	Partial 4KB sector, upper half
719*0d6140beSAndroid Build Coastguard Worker	# 8K-16K	: 0x33 (\063)	Full 4KB sectors
720*0d6140beSAndroid Build Coastguard Worker	#
721*0d6140beSAndroid Build Coastguard Worker	# Repeat the above sequence for 64KB-aligned sizes
722*0d6140beSAndroid Build Coastguard Worker	# 0-32K		: 0x44 (\104)	Partial 64KB block, lower half
723*0d6140beSAndroid Build Coastguard Worker	# 32K-96K	: 0x55 (\125)	Crossover 64KB block boundary
724*0d6140beSAndroid Build Coastguard Worker	# 96K-128K	: 0x66 (\146)	Partial 64KB block, upper half
725*0d6140beSAndroid Build Coastguard Worker	# 128K-256K	: 0x77 (\167)	Full 64KB blocks
726*0d6140beSAndroid Build Coastguard Worker
727*0d6140beSAndroid Build Coastguard Worker	test_num=0
728*0d6140beSAndroid Build Coastguard Worker	dd if=/dev/zero of="${LOCAL_TMPDIR}/random_4k_test.bin" bs=1k count=$CHIP_SIZE_KB 2>/dev/null
729*0d6140beSAndroid Build Coastguard Worker	dd if=/dev/urandom of="${LOCAL_TMPDIR}/random_4k_test.bin" bs=4k count=$(($PARTIAL_WRITE_TEST_REGION_SIZE / $((4 * $K)))) seek=$(($((PARTIAL_WRITE_TEST_REGION_BASE_OFFSET)) / $((4 * $K)))) conv=notrunc 2>/dev/null
730*0d6140beSAndroid Build Coastguard Worker
731*0d6140beSAndroid Build Coastguard Worker	# 0-2K		: 0x00 (\000)	Partial 4KB sector, lower half
732*0d6140beSAndroid Build Coastguard Worker	partial_write_test_helper "4k_test_${test_num}" 0 2 "0x00"
733*0d6140beSAndroid Build Coastguard Worker	prev_test_num=$test_num
734*0d6140beSAndroid Build Coastguard Worker	test_num=$(($test_num + 1))
735*0d6140beSAndroid Build Coastguard Worker
736*0d6140beSAndroid Build Coastguard Worker	# 2K-6K		: 0x11 (\021)	Crossover 4KB sector boundary
737*0d6140beSAndroid Build Coastguard Worker	partial_write_test_helper "4k_test_${test_num}" 2 4 "0x11"
738*0d6140beSAndroid Build Coastguard Worker	test_num=$(($test_num + 1))
739*0d6140beSAndroid Build Coastguard Worker
740*0d6140beSAndroid Build Coastguard Worker	# 6K-8K		: 0x22 (\042)	Partial 4KB sector, upper half
741*0d6140beSAndroid Build Coastguard Worker	partial_write_test_helper "4k_test_${test_num}" 6 2 "0x22"
742*0d6140beSAndroid Build Coastguard Worker	test_num=$(($test_num + 1))
743*0d6140beSAndroid Build Coastguard Worker
744*0d6140beSAndroid Build Coastguard Worker	# 8K-16K	: 0x33 (\063)	Full 4KB sectors
745*0d6140beSAndroid Build Coastguard Worker	partial_write_test_helper "4k_test_${test_num}" 8 8 "0x33"
746*0d6140beSAndroid Build Coastguard Worker
747*0d6140beSAndroid Build Coastguard Worker	for F in ${LOCAL_TMPDIR}/random_4k_test.bin ${LOCAL_TMPDIR}/4k_test_*.bin ; do
748*0d6140beSAndroid Build Coastguard Worker		filename=$(basename $F)
749*0d6140beSAndroid Build Coastguard Worker		if [ $DO_REMOTE -eq 1 ]; then
750*0d6140beSAndroid Build Coastguard Worker			copy_to_remote $filename
751*0d6140beSAndroid Build Coastguard Worker		fi
752*0d6140beSAndroid Build Coastguard Worker
753*0d6140beSAndroid Build Coastguard Worker		flashrom_log_scmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS $opts -i ${region_name} -w ${TMPDIR}/${filename}" "write_${filename}"
754*0d6140beSAndroid Build Coastguard Worker		if [ $? -ne 0 ]; then
755*0d6140beSAndroid Build Coastguard Worker			test_fail "Failed to write $filename to $region_name"
756*0d6140beSAndroid Build Coastguard Worker		fi
757*0d6140beSAndroid Build Coastguard Worker
758*0d6140beSAndroid Build Coastguard Worker		flashrom_log_scmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS $opts -i ${region_name} -v ${TMPDIR}/${filename}" "verify_${filename}"
759*0d6140beSAndroid Build Coastguard Worker		if [ $? -ne 0 ]; then
760*0d6140beSAndroid Build Coastguard Worker			test_fail "Failed to verify write of $filename to $region_name"
761*0d6140beSAndroid Build Coastguard Worker		fi
762*0d6140beSAndroid Build Coastguard Worker
763*0d6140beSAndroid Build Coastguard Worker		if [ -n "$SECONDARY_OPTS" ]; then
764*0d6140beSAndroid Build Coastguard Worker			flashrom_log_scmd $LOCAL "$LOCAL_FLASHROM $SECONDARY_OPTS $secondary_opts -i ${region_name} -v ${LOCAL_TMPDIR}/${filename}" "verify_secondary_${filename}"
765*0d6140beSAndroid Build Coastguard Worker			if [ $? -ne 0 ]; then
766*0d6140beSAndroid Build Coastguard Worker				test_fail "Failed to verify write of $filename to $region_name using secondary programmer"
767*0d6140beSAndroid Build Coastguard Worker			fi
768*0d6140beSAndroid Build Coastguard Worker		fi
769*0d6140beSAndroid Build Coastguard Worker
770*0d6140beSAndroid Build Coastguard Worker		print_and_log "\tWrote $filename to $region_name region successfully.\n"
771*0d6140beSAndroid Build Coastguard Worker	done
772*0d6140beSAndroid Build Coastguard Worker
773*0d6140beSAndroid Build Coastguard Worker	if [ $SMALL_REGION -eq 1 ]; then
774*0d6140beSAndroid Build Coastguard Worker		return $EXIT_SUCCESS
775*0d6140beSAndroid Build Coastguard Worker	fi
776*0d6140beSAndroid Build Coastguard Worker
777*0d6140beSAndroid Build Coastguard Worker	#
778*0d6140beSAndroid Build Coastguard Worker	# Second half: Tests for 64KB chunks
779*0d6140beSAndroid Build Coastguard Worker	#
780*0d6140beSAndroid Build Coastguard Worker	test_num=0
781*0d6140beSAndroid Build Coastguard Worker#	dd if=/dev/urandom of="${LOCAL_TMPDIR}/random_64k_test.bin" bs=128k count=$(($PARTIAL_WRITE_TEST_REGION_SIZE / $((128*$K)))) 2>/dev/null
782*0d6140beSAndroid Build Coastguard Worker	dd if=/dev/zero of="${LOCAL_TMPDIR}/random_64k_test.bin" bs=1k count=$CHIP_SIZE_KB 2>/dev/null
783*0d6140beSAndroid Build Coastguard Worker	dd if=/dev/urandom of="${LOCAL_TMPDIR}/random_64k_test.bin" bs=128k count=$(($PARTIAL_WRITE_TEST_REGION_SIZE / $((128 * $K)))) seek=$(($((PARTIAL_WRITE_TEST_REGION_BASE_OFFSET)) / $((128 * $K)))) conv=notrunc 2>/dev/null
784*0d6140beSAndroid Build Coastguard Worker
785*0d6140beSAndroid Build Coastguard Worker	# 0-32K		: 0x44 (\104)	Partial 64KB block, lower half
786*0d6140beSAndroid Build Coastguard Worker	partial_write_test_helper "64k_test_${test_num}"  0 32 "0x44"
787*0d6140beSAndroid Build Coastguard Worker	prev_test_num=$test_num
788*0d6140beSAndroid Build Coastguard Worker	test_num=$(($test_num + 1))
789*0d6140beSAndroid Build Coastguard Worker
790*0d6140beSAndroid Build Coastguard Worker	# 32K-96K	: 0x55 (\125)	Crossover 64KB block boundary
791*0d6140beSAndroid Build Coastguard Worker	partial_write_test_helper "64k_test_${test_num}" 32 64 "0x55"
792*0d6140beSAndroid Build Coastguard Worker	test_num=$(($test_num + 1))
793*0d6140beSAndroid Build Coastguard Worker
794*0d6140beSAndroid Build Coastguard Worker	# 96K-128K	: 0x66 (\146)	Partial 64KB block, upper half
795*0d6140beSAndroid Build Coastguard Worker	partial_write_test_helper "64k_test_${test_num}"  96 32 "0x66"
796*0d6140beSAndroid Build Coastguard Worker	test_num=$(($test_num + 1))
797*0d6140beSAndroid Build Coastguard Worker
798*0d6140beSAndroid Build Coastguard Worker	# 128K-256K	: 0x77 (\167)	Full 64KB blocks
799*0d6140beSAndroid Build Coastguard Worker	partial_write_test_helper "64k_test_${test_num}"  128 128 "0x77"
800*0d6140beSAndroid Build Coastguard Worker
801*0d6140beSAndroid Build Coastguard Worker	for F in ${LOCAL_TMPDIR}/random_64k_test.bin ${LOCAL_TMPDIR}/64k_test_*.bin ; do
802*0d6140beSAndroid Build Coastguard Worker		filename=$(basename $F)
803*0d6140beSAndroid Build Coastguard Worker		if [ $DO_REMOTE -eq 1 ]; then
804*0d6140beSAndroid Build Coastguard Worker			copy_to_remote $filename
805*0d6140beSAndroid Build Coastguard Worker		fi
806*0d6140beSAndroid Build Coastguard Worker
807*0d6140beSAndroid Build Coastguard Worker		flashrom_log_scmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS $opts -i ${region_name} -w ${TMPDIR}/${filename}" "write_${filename}"
808*0d6140beSAndroid Build Coastguard Worker		if [ $? -ne 0 ]; then
809*0d6140beSAndroid Build Coastguard Worker			test_fail "Failed to write $filename to $region_name"
810*0d6140beSAndroid Build Coastguard Worker		fi
811*0d6140beSAndroid Build Coastguard Worker
812*0d6140beSAndroid Build Coastguard Worker		flashrom_log_scmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS $opts -i ${region_name} -v ${TMPDIR}/${filename}" "verify_${filename}"
813*0d6140beSAndroid Build Coastguard Worker		if [ $? -ne 0 ]; then
814*0d6140beSAndroid Build Coastguard Worker			test_fail "Failed to verify write of $filename to $region_name"
815*0d6140beSAndroid Build Coastguard Worker		fi
816*0d6140beSAndroid Build Coastguard Worker
817*0d6140beSAndroid Build Coastguard Worker		if [ -n "$SECONDARY_OPTS" ]; then
818*0d6140beSAndroid Build Coastguard Worker			flashrom_log_scmd $LOCAL "$LOCAL_FLASHROM $SECONDARY_OPTS $secondary_opts -i ${region_name} -v ${LOCAL_TMPDIR}/${filename}" "verify_secondary_${filename}"
819*0d6140beSAndroid Build Coastguard Worker			if [ $? -ne 0 ]; then
820*0d6140beSAndroid Build Coastguard Worker				test_fail "Failed to verify write of $filename to $region_name using secondary programmer"
821*0d6140beSAndroid Build Coastguard Worker			fi
822*0d6140beSAndroid Build Coastguard Worker		fi
823*0d6140beSAndroid Build Coastguard Worker
824*0d6140beSAndroid Build Coastguard Worker		print_and_log "\tWrote $filename to $region_name region successfully.\n"
825*0d6140beSAndroid Build Coastguard Worker	done
826*0d6140beSAndroid Build Coastguard Worker
827*0d6140beSAndroid Build Coastguard Worker	return $EXIT_SUCCESS
828*0d6140beSAndroid Build Coastguard Worker}
829*0d6140beSAndroid Build Coastguard Worker
830*0d6140beSAndroid Build Coastguard Worker# Before anything else, check to see if Flashrom can successfully probe
831*0d6140beSAndroid Build Coastguard Worker# for and find the flash chips. If not, we will abort.
832*0d6140beSAndroid Build Coastguard Workerflashrom_log_scmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS" "verify_probe"
833*0d6140beSAndroid Build Coastguard Workerif [ $? -ne 0 ]; then
834*0d6140beSAndroid Build Coastguard Worker	test_fail "Failed to find flash chips while probing, aborting."
835*0d6140beSAndroid Build Coastguard Workerfi
836*0d6140beSAndroid Build Coastguard Worker
837*0d6140beSAndroid Build Coastguard Worker# Read ROM twice to test for consistency.
838*0d6140beSAndroid Build Coastguard Workerif [ $SKIP_CONSISTENCY_CHECK -eq 0 ]; then
839*0d6140beSAndroid Build Coastguard Worker	double_read_test 0 $CHIP_SIZE
840*0d6140beSAndroid Build Coastguard Workerfi
841*0d6140beSAndroid Build Coastguard Worker
842*0d6140beSAndroid Build Coastguard Workerif [ $TEST_TYPE -eq $TEST_TYPE_SINGLE ]; then
843*0d6140beSAndroid Build Coastguard Worker	if [ $REGION_MODE -eq $REGION_MODE_CLOBBER ]; then
844*0d6140beSAndroid Build Coastguard Worker		random_file="${TMPDIR}/random_${CHIP_SIZE_KB}K.bin"
845*0d6140beSAndroid Build Coastguard Worker		cmp_file="${TMPDIR}/cmp.bin"
846*0d6140beSAndroid Build Coastguard Worker
847*0d6140beSAndroid Build Coastguard Worker		scmd $DO_REMOTE "dd if=/dev/urandom of=${random_file} bs=1k count=${CHIP_SIZE_KB}"
848*0d6140beSAndroid Build Coastguard Worker		flashrom_log_scmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS -w $random_file" "clobber_write"
849*0d6140beSAndroid Build Coastguard Worker		flashrom_log_scmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS -r $cmp_file" "clobber_verify"
850*0d6140beSAndroid Build Coastguard Worker		scmd $DO_REMOTE "cmp $random_file $cmp_file"
851*0d6140beSAndroid Build Coastguard Worker		if [ $? -ne 0 ]; then
852*0d6140beSAndroid Build Coastguard Worker			write_backup_image
853*0d6140beSAndroid Build Coastguard Worker			test_fail "Failed to clobber entire ROM."
854*0d6140beSAndroid Build Coastguard Worker		fi
855*0d6140beSAndroid Build Coastguard Worker	elif [ $REGION_MODE -eq $REGION_MODE_DESCRIPTOR ]; then
856*0d6140beSAndroid Build Coastguard Worker		# FIXME: Need region-sized file handling or some way to get region info
857*0d6140beSAndroid Build Coastguard Worker		print_and_log "Currently broken due to lack of region-sized file handling."
858*0d6140beSAndroid Build Coastguard Worker		exit $EXIT_FAILURE
859*0d6140beSAndroid Build Coastguard Worker	elif [ $REGION_MODE -eq $REGION_MODE_FLASHMAP ]; then
860*0d6140beSAndroid Build Coastguard Worker		# FIXME: Need region-sized file handling or some way to get region info
861*0d6140beSAndroid Build Coastguard Worker		print_and_log "Currently broken due to lack of region-sized file handling."
862*0d6140beSAndroid Build Coastguard Worker		exit $EXIT_FAILURE
863*0d6140beSAndroid Build Coastguard Worker	elif [ $REGION_MODE -eq $REGION_MODE_LAYOUT ]; then
864*0d6140beSAndroid Build Coastguard Worker		rw_layout=""
865*0d6140beSAndroid Build Coastguard Worker		addr=""
866*0d6140beSAndroid Build Coastguard Worker		end=""
867*0d6140beSAndroid Build Coastguard Worker		size=""
868*0d6140beSAndroid Build Coastguard Worker		size_kb=""
869*0d6140beSAndroid Build Coastguard Worker
870*0d6140beSAndroid Build Coastguard Worker		# Look for a region name with any amount of leading whitespace
871*0d6140beSAndroid Build Coastguard Worker		# and no trailing whitespace or characters.
872*0d6140beSAndroid Build Coastguard Worker		rw_layout=$(grep "\s${LAYOUT_REGION}$" "${LOCAL_TMPDIR}/$(basename $LAYOUT_FILE)" | head -n 1)
873*0d6140beSAndroid Build Coastguard Worker		if [ -z "$rw_layout" ]; then
874*0d6140beSAndroid Build Coastguard Worker			print_and_log "No region matching \"${LAYOUT_REGION}\" found layout file \"${LAYOUT_FILE}\"\n"
875*0d6140beSAndroid Build Coastguard Worker			test_fail ""
876*0d6140beSAndroid Build Coastguard Worker		fi
877*0d6140beSAndroid Build Coastguard Worker
878*0d6140beSAndroid Build Coastguard Worker		addr="0x$(echo "$rw_layout" | cut -d ' ' -f -1 | awk -F ':' '{ print $1 }')"
879*0d6140beSAndroid Build Coastguard Worker		end="0x$(echo "$rw_layout" | cut -d ' ' -f -1 | awk -F ':' '{ print $2 }')"
880*0d6140beSAndroid Build Coastguard Worker		size="$(($end - $addr + 1))"
881*0d6140beSAndroid Build Coastguard Worker		size_kb="$(($size / $K))"
882*0d6140beSAndroid Build Coastguard Worker
883*0d6140beSAndroid Build Coastguard Worker		# FIXME: Hack to make this work without region-sized file handling.
884*0d6140beSAndroid Build Coastguard Worker		PARTIAL_WRITE_TEST_REGION_BASE_OFFSET=$addr
885*0d6140beSAndroid Build Coastguard Worker		PARTIAL_WRITE_TEST_REGION_SIZE=$size
886*0d6140beSAndroid Build Coastguard Worker
887*0d6140beSAndroid Build Coastguard Worker		print_and_log "\"$LAYOUT_REGION\" region address: ${addr}, size: $size_kb KiB\n"
888*0d6140beSAndroid Build Coastguard Worker		partial_write_test "$LAYOUT_REGION"
889*0d6140beSAndroid Build Coastguard Worker		if [ $? -ne 0 ]; then
890*0d6140beSAndroid Build Coastguard Worker			print_and_log "Layout mode test failed\n"
891*0d6140beSAndroid Build Coastguard Worker			RC=$EXIT_FAILURE
892*0d6140beSAndroid Build Coastguard Worker		fi
893*0d6140beSAndroid Build Coastguard Worker	fi
894*0d6140beSAndroid Build Coastguard Workerelif [ $TEST_TYPE -eq $TEST_TYPE_ENDURANCE ]; then
895*0d6140beSAndroid Build Coastguard Worker	iteration=1
896*0d6140beSAndroid Build Coastguard Worker	terminate=0
897*0d6140beSAndroid Build Coastguard Worker	random_file="${TMPDIR}/random_${CHIP_SIZE_KB}K.bin"
898*0d6140beSAndroid Build Coastguard Worker	cmp_file="${TMPDIR}/cmp.bin"
899*0d6140beSAndroid Build Coastguard Worker	# TODO: We can measure how long the tests take on average, throughput, etc.
900*0d6140beSAndroid Build Coastguard Worker	# i.e. { time $NEW_FLASHROM $PRIMARY_OPTS -w $random_file ; } 2>&1 | grep user | cut -f2
901*0d6140beSAndroid Build Coastguard Worker
902*0d6140beSAndroid Build Coastguard Worker	# For this test we want to run clobber mode until failure
903*0d6140beSAndroid Build Coastguard Worker	while [ $terminate -eq 0 ]
904*0d6140beSAndroid Build Coastguard Worker	do
905*0d6140beSAndroid Build Coastguard Worker		print_and_log "Running iteration #${iteration}\n"
906*0d6140beSAndroid Build Coastguard Worker
907*0d6140beSAndroid Build Coastguard Worker		scmd $DO_REMOTE "dd if=/dev/urandom of=${random_file} bs=1k count=${CHIP_SIZE_KB}"
908*0d6140beSAndroid Build Coastguard Worker		flashrom_log_scmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS -w $random_file" "endurance_write_${iteration}"
909*0d6140beSAndroid Build Coastguard Worker		flashrom_log_scmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS -r $cmp_file" "endurance_verify_${iteration}"
910*0d6140beSAndroid Build Coastguard Worker		scmd $DO_REMOTE "cmp $random_file $cmp_file"
911*0d6140beSAndroid Build Coastguard Worker		if [ $? -ne 0 ]; then
912*0d6140beSAndroid Build Coastguard Worker			terminate=1
913*0d6140beSAndroid Build Coastguard Worker		fi
914*0d6140beSAndroid Build Coastguard Worker		scmd $DO_REMOTE "rm -f $cmp_file $random_file"
915*0d6140beSAndroid Build Coastguard Worker
916*0d6140beSAndroid Build Coastguard Worker		iteration=$(($iteration + 1))
917*0d6140beSAndroid Build Coastguard Worker	done
918*0d6140beSAndroid Build Coastguard Worker
919*0d6140beSAndroid Build Coastguard Worker	# TODO: Determine what to return for the endurance test exit status
920*0d6140beSAndroid Build Coastguard Worker	# i.e. what constitutes a test pass and what constitutes a test fail?
921*0d6140beSAndroid Build Coastguard Worker	print_and_log "Failed on iteration $iteration\n"
922*0d6140beSAndroid Build Coastguard Worker	# TODO - Print performance metrics?
923*0d6140beSAndroid Build Coastguard Workerfi
924*0d6140beSAndroid Build Coastguard Worker
925*0d6140beSAndroid Build Coastguard Worker# restore and cleanup
926*0d6140beSAndroid Build Coastguard Workerwrite_backup_image
927*0d6140beSAndroid Build Coastguard Worker
928*0d6140beSAndroid Build Coastguard Workerif [ $RC -eq 0 ]; then
929*0d6140beSAndroid Build Coastguard Worker	print_and_log "Test status: PASS\n"
930*0d6140beSAndroid Build Coastguard Workerelse
931*0d6140beSAndroid Build Coastguard Worker	print_and_log "Test status: FAIL\n"
932*0d6140beSAndroid Build Coastguard Workerfi
933*0d6140beSAndroid Build Coastguard Workerdo_cleanup
934*0d6140beSAndroid Build Coastguard Worker
935*0d6140beSAndroid Build Coastguard Workerexit $RC
936