firmware_RecoveryCacheBootKeys: Use power_state:rec_force_mrc
Previously, firmware_RecoverCacheBootKeys would call apshutdown,
hostevent set 0x20004000, powerbtn in order to force cache training.
However, this causes a race condition that was fixed for
power_state:rec in b:64738026. Now utilizing the rec_force_mrc option
in the power_state driver in order to avoid the apshutdown/cold_reset
race condition.
BUG=b:73293232, b:79540438
BRANCH=None
TEST=Run firmware_RecoveryCacheBootKeys on fizz and Soraka to ensure
works for both cros_ec_softrec_power and cros_ec_hardrec_power
drivers.
CQ-DEPEND=CL:1062147
Change-Id: I5faa9136d1e08b5c63e907e1d44e3a629129b23f
Signed-off-by: Shelley Chen <shchen@google.com>
Reviewed-on: https://chromium-review.googlesource.com/1062150
Commit-Ready: Shelley Chen <shchen@chromium.org>
Tested-by: Shelley Chen <shchen@chromium.org>
Reviewed-by: Kevin Shelton <kmshelton@chromium.org>
Reviewed-by: Furquan Shaikh <furquan@chromium.org>
Reviewed-by: Wai-Hong Tam <waihong@google.com>
diff --git a/server/cros/faft/utils/mode_switcher.py b/server/cros/faft/utils/mode_switcher.py
index 618fe79..bdd75db 100644
--- a/server/cros/faft/utils/mode_switcher.py
+++ b/server/cros/faft/utils/mode_switcher.py
@@ -471,6 +471,11 @@
if wait_for_dut_up:
self.wait_for_client()
+ elif to_mode == 'rec_force_mrc':
+ self._enable_rec_mode_force_mrc_and_reboot(usb_state='dut')
+ if wait_for_dut_up:
+ self.wait_for_client()
+
elif to_mode == 'dev':
self._enable_dev_mode_and_reboot()
if wait_for_dut_up:
@@ -591,6 +596,21 @@
psc.power_on(psc.REC_ON)
+ def _enable_rec_mode_force_mrc_and_reboot(self, usb_state=None):
+ """Switch to rec mode, enable force mrc cache retraining, and reboot.
+
+ This method emulates the behavior of the old physical recovery switch,
+ i.e. switch ON + reboot + switch OFF, and the new keyboard controlled
+ recovery mode, i.e. just press Power + Esc + Refresh.
+
+ @param usb_state: A string, one of 'dut', 'host', or 'off'.
+ """
+ psc = self.servo.get_power_state_controller()
+ psc.power_off()
+ if usb_state:
+ self.servo.switch_usbkey(usb_state)
+ psc.power_on(psc.REC_ON_FORCE_MRC)
+
def _disable_rec_mode_and_reboot(self, usb_state=None):
"""Disable the rec mode and reboot.
diff --git a/server/cros/servo/servo.py b/server/cros/servo/servo.py
index aca0582..cdb86f3 100644
--- a/server/cros/servo/servo.py
+++ b/server/cros/servo/servo.py
@@ -38,6 +38,7 @@
REC_ON = 'rec'
REC_OFF = 'on'
+ REC_ON_FORCE_MRC = 'rec_force_mrc'
# Delay in seconds needed between asserting and de-asserting
# warm reset.
diff --git a/server/site_tests/firmware_RecoveryCacheBootKeys/firmware_RecoveryCacheBootKeys.py b/server/site_tests/firmware_RecoveryCacheBootKeys/firmware_RecoveryCacheBootKeys.py
index 17ed35e..c030707 100644
--- a/server/site_tests/firmware_RecoveryCacheBootKeys/firmware_RecoveryCacheBootKeys.py
+++ b/server/site_tests/firmware_RecoveryCacheBootKeys/firmware_RecoveryCacheBootKeys.py
@@ -4,7 +4,6 @@
import logging
import re
-import time
from autotest_lib.client.common_lib import error
from autotest_lib.server.cros.faft.firmware_test import FirmwareTest
@@ -23,7 +22,6 @@
FIRMWARE_LOG_CMD = 'cbmem -1' + ' | grep ' + REBUILD_CACHE_MSG[:3]
FMAP_CMD = 'mosys eeprom map'
RECOVERY_REASON_REBUILD_CMD = 'crossystem recovery_request=0xC4'
- APSHUTDOWN_DELAY = 5
def initialize(self, host, cmdline_args, dev_mode=False):
super(firmware_RecoveryCacheBootKeys, self).initialize(host,
@@ -36,9 +34,12 @@
def cleanup(self):
super(firmware_RecoveryCacheBootKeys, self).cleanup()
- def boot_to_recovery(self):
+ def boot_to_recovery(self, rebuild_mrc_cache=False):
"""Boot device into recovery mode."""
- self.switcher.reboot_to_mode(to_mode='rec')
+ if rebuild_mrc_cache:
+ self.switcher.reboot_to_mode(to_mode='rec_force_mrc')
+ else:
+ self.switcher.reboot_to_mode(to_mode='rec')
self.check_state((self.checkers.crossystem_checker,
{'mainfw_type': 'recovery'}))
@@ -126,13 +127,7 @@
raise error.TestFail('[3-Key] - Recovery Cache was not used.')
logging.info('Checking 4-key recovery rebuilt cache boot.')
- self.ec.send_command_get_output(
- 'apshutdown',
- ["\[[0-9\.]+ chipset_force_shutdown\(\)"])
- self.ec.send_command_get_output('hostevent set 0x20004000',
- ["Events:\s+0x0*20004000"])
- time.sleep(self.APSHUTDOWN_DELAY)
- self.ec.send_command('powerbtn')
+ self.boot_to_recovery(rebuild_mrc_cache=True)
self.switcher.wait_for_client()
if not self.check_cache_rebuilt():