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