vboot: Support servo micro and C2D2 for {get,set}_gbb_flags.sh --servo.

Detect servo micro and C2D2 servo types and toggle cpu_fw_spi before and
after flash access is required.

BUG=b:220992685
TEST={get,set}_gbb_flags.sh --servo with C2D2 and servo micro
BRANCH=None

Cq-Depend: chromium:3470605
Change-Id: I9f8a9bcabe731001ed18150ca1db9820db20e0d3
Signed-off-by: Sam McNally <sammc@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/3469747
Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
diff --git a/scripts/image_signing/gbb_flags_common.sh b/scripts/image_signing/gbb_flags_common.sh
index ed51f15..ae50c10 100755
--- a/scripts/image_signing/gbb_flags_common.sh
+++ b/scripts/image_signing/gbb_flags_common.sh
@@ -62,10 +62,23 @@
   flashrom -p "${programmer}"  -i GBB --noverify-all -w "${file}"
 }
 
-get_programmer_for_servo() {
+CPU_FW_SPI="${FLAGS_FALSE}"
+
+enable_cpu_fw_spi() {
+  dut-control cpu_fw_spi:on >/dev/null
+  CPU_FW_SPI="${FLAGS_TRUE}"
+}
+
+maybe_disable_cpu_fw_spi() {
+  if [ "${CPU_FW_SPI}" = "${FLAGS_TRUE}" ]; then
+    dut-control cpu_fw_spi:off >/dev/null
+  fi
+}
+trap "maybe_disable_cpu_fw_spi" EXIT
+
+update_programmer_for_servo() {
   local servo_type
   local serial
-  local programmer
   servo_type=$(dut-control -o servo_type 2>/dev/null) || \
     die "Failed to get servo information. Is servod running?"
   case "${servo_type}" in
@@ -84,10 +97,8 @@
   esac
   case "${servo_type}" in
     *servo_micro*|*c2d2*)
-      # TODO(sammc): Support servo micro, servo v2 and C2D2. This requires
-      # toggling cpu_fw_spi via dut-control before and after running flashrom.
-      # C2D2 additionally requires a working cpu_fw_spi implementation.
-      die "Unsupported servo type ${servo_type}"
+      programmer="raiden_debug_spi:serial=${serial}"
+      enable_cpu_fw_spi
       ;;
     *ccd_cr50*|*ccd_gsc*)
       programmer="raiden_debug_spi:target=AP,serial=${serial}"
@@ -96,5 +107,4 @@
       die "Unsupported servo type ${servo_type}"
       ;;
   esac
-  echo "${programmer}"
 }
diff --git a/scripts/image_signing/get_gbb_flags.sh b/scripts/image_signing/get_gbb_flags.sh
index 1191e9f..84acaa0 100755
--- a/scripts/image_signing/get_gbb_flags.sh
+++ b/scripts/image_signing/get_gbb_flags.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 #
 # Copyright 2017 The Chromium OS Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
@@ -30,7 +30,7 @@
   if [ -z "${FLAGS_file}" ]; then
     image_file="$(make_temp_file)"
     if [ "${FLAGS_servo}" = "${FLAGS_TRUE}" ]; then
-      programmer=$(get_programmer_for_servo)
+      update_programmer_for_servo
     fi
     flashrom_read "${image_file}" "${programmer}"
   fi
diff --git a/scripts/image_signing/set_gbb_flags.sh b/scripts/image_signing/set_gbb_flags.sh
index 3057da5..57fd4c0 100755
--- a/scripts/image_signing/set_gbb_flags.sh
+++ b/scripts/image_signing/set_gbb_flags.sh
@@ -55,7 +55,7 @@
   if [ -z "${FLAGS_file}" ]; then
     image_file="$(make_temp_file)"
     if [ "${FLAGS_servo}" = "${FLAGS_TRUE}" ]; then
-      programmer=$(get_programmer_for_servo)
+      update_programmer_for_servo
     fi
 
     flashrom_read "${image_file}" "${programmer}"