161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin#!/bin/sh
261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin#
361603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
461603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# Use of this source code is governed by a BSD-style license that can be
561603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# found in the LICENSE file.
661603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin#
761603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# This script can change GBB flags in system live firmware or a given image
861603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# file.
961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
1061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinSCRIPT_BASE="$(dirname "$0")"
1161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin. "$SCRIPT_BASE/common_minimal.sh"
1261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Linload_shflags || exit 1
1361603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
1461603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# DEFINE_string name default_value description flag
1561603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinDEFINE_string file "" "Path to firmware image. Default to system firmware." "f"
16e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te LinDEFINE_boolean check_wp $FLAGS_TRUE "Check write protection states first." ""
1761603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
1861603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# Globals
1961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# ----------------------------------------------------------------------------
2061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Linset -e
2161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
2261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# Values from vboot_reference/firmware/include/gbb_header.h
2361603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinGBBFLAGS_DESCRIPTION="
2461603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  Defined flags (some values may be not supported by all systems):
2561603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
2661603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  GBB_FLAG_DEV_SCREEN_SHORT_DELAY     0x00000001
2761603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  GBB_FLAG_LOAD_OPTION_ROMS           0x00000002
2861603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  GBB_FLAG_ENABLE_ALTERNATE_OS        0x00000004
2961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  GBB_FLAG_FORCE_DEV_SWITCH_ON        0x00000008
3061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  GBB_FLAG_FORCE_DEV_BOOT_USB         0x00000010
3161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  GBB_FLAG_DISABLE_FW_ROLLBACK_CHECK  0x00000020
3246c01a2d2bceaf6948c53ca8946ed19b900190b3Tom Wai-Hong Tam  GBB_FLAG_ENTER_TRIGGERS_TONORM      0x00000040
33a2326ee152ab5b8aee924ccf794cee38d54909bdStefan Reinauer  GBB_FLAG_FORCE_DEV_BOOT_LEGACY      0x00000080
349754cae1c1c4b267f228ee65df410e4115dc3d17Marc Jones  GBB_FLAG_FAFT_KEY_OVERIDE           0x00000100
35f2a1dc0a54ec542dd4be7b634483de317c89a2a2Randall Spangler  GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC   0x00000200
36f2a1dc0a54ec542dd4be7b634483de317c89a2a2Randall Spangler  GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY    0x00000400
37277dc5274c5c906c8d80d2ae4cc7679d234e8408Duncan Laurie  GBB_FLAG_DISABLE_PD_SOFTWARE_SYNC   0x00000800
3861603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
3961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  To get a developer-friendly device, try 0x11 (short_delay + boot_usb).
4061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  For factory-related tests (always DEV), try 0x39.
4161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin"
4261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
4361603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinFLAGS_HELP="Changes ChromeOS Firmware GBB Flags value.
4461603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
4561603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  Usage: $0 [option_flags] GBB_FLAGS_VALUE
4661603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  $GBBFLAGS_DESCRIPTION"
4761603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
48798cc91de11d5a78e379c67731dcafaf2aae01e1Hung-Te LinFLASHROM_COMMON_OPT="-p host"
4961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinFLASHROM_READ_OPT="$FLASHROM_COMMON_OPT -i GBB -r"
5061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinFLASHROM_WRITE_OPT="$FLASHROM_COMMON_OPT -i GBB --fast-verify -w"
5161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
52e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin# Check write protection
53e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin# ----------------------------------------------------------------------------
54e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lincheck_write_protection() {
554ff446b493e8a74804fd00082119681f768d366aHung-Te Lin  local hw_wp="" sw_wp=""
56e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin  if ! crossystem "wpsw_boot?0"; then
574ff446b493e8a74804fd00082119681f768d366aHung-Te Lin    hw_wp="on"
58e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin  fi
59e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin  local wp_states="$(flashrom --wp-status 2>/dev/null | grep WP)"
60e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin  local wp_disabled="$(echo "$wp_states" | grep "WP:.*is disabled.")"
61e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin  local wp_zero_len="$(echo "$wp_states" | grep "WP:.*, len=0x00000000")"
62e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin  if [ -z "$wp_disabled" -a -z "$wp_zero_len" ]; then
634ff446b493e8a74804fd00082119681f768d366aHung-Te Lin    sw_wp="on"
64e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin  fi
654ff446b493e8a74804fd00082119681f768d366aHung-Te Lin  if [ -n "$hw_wp" -a -n "$sw_wp" ]; then
664ff446b493e8a74804fd00082119681f768d366aHung-Te Lin    return $FLAGS_FALSE
674ff446b493e8a74804fd00082119681f768d366aHung-Te Lin  fi
684ff446b493e8a74804fd00082119681f768d366aHung-Te Lin  return $FLAGS_TRUE
69e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin}
70e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin
7161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# Main
7261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# ----------------------------------------------------------------------------
7361603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Linmain() {
7461603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  if [ "$#" != "1" ]; then
7561603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin    flags_help
7661603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin    exit 1
7761603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  fi
7861603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
7961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  local value="$(($1))"
8061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  local image_file="$FLAGS_file"
8161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
8261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  if [ -z "$FLAGS_file" ]; then
8361603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin    image_file="$(make_temp_file)"
8461603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin    flashrom $FLASHROM_READ_OPT "$image_file"
8561603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  fi
8661603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
8761603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  # Process file
8861603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  local old_value="$(gbb_utility -g --flags "$image_file")"
8961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  printf "Setting GBB flags from %s to 0x%x.." "$old_value" "$value" >&2
9061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  gbb_utility -s --flags="$value" "$image_file"
9161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
9261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  if [ -z "$FLAGS_file" ]; then
93e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin    if [ "$FLAGS_check_wp" = "$FLAGS_TRUE" ]; then
94e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin      if ! check_write_protection; then
95e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin        echo ""
96e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin        echo "WARNING: System GBB Flags are NOT changed!!!"
97e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin        echo "ERROR: You must disable write protection before setting flags."
98e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin        exit 1
99e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin      fi
100e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin    fi
10161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin    flashrom $FLASHROM_WRITE_OPT "$image_file"
10261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin  fi
10361603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin}
10461603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
10561603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# Parse command line
10661603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinFLAGS "$@" || exit 1
10761603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinORIGINAL_PARAMS="$@"
10861603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lineval set -- "$FLAGS_ARGV"
10961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin
11061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Linmain "$@"
111