Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 1 | # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| 2 | # Use of this source code is governed by a BSD-style license that can be |
| 3 | # found in the LICENSE file. |
| 4 | |
| 5 | |
| 6 | import logging, os |
| 7 | |
| 8 | from autotest_lib.client.common_lib import error, utils |
Tom Wai-Hong Tam | 6ec46e3 | 2012-10-05 16:39:21 +0800 | [diff] [blame^] | 9 | from autotest_lib.server.cros import vboot_constants as vboot |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 10 | from autotest_lib.server.cros.faftsequence import FAFTSequence |
| 11 | |
| 12 | |
| 13 | class firmware_UpdateECBin(FAFTSequence): |
| 14 | """ |
| 15 | This test verified the EC software sync. The EC binary is embedded in |
| 16 | the BIOS image. On AP startup, AP verifies the EC by comparing the |
| 17 | hash of the current EC with the hash of the embedded EC image. So |
| 18 | updating EC is simple and we just need to change the EC binary on |
| 19 | the BIOS image. |
| 20 | |
Tom Wai-Hong Tam | 55f51a0 | 2012-09-06 15:39:20 +0800 | [diff] [blame] | 21 | This test requires a new EC image for update. The new EC image should |
| 22 | be different with the existing EC image on the current BIOS. In normal |
| 23 | cases, we use the ec_autest_image.bin from firmware_from_source.tar.bz2. |
| 24 | The ec_autest_image.bin is the same binary as ec.bin but shift'ed and its |
| 25 | version string has the "_shift" suffix. |
| 26 | |
| 27 | The new EC image should be specified by the new_ec argument, like: |
| 28 | run_remote_tests.sh --args "new_ec=ec_autest_image.bin" ... |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 29 | |
| 30 | The test covers RONORMAL->TWOSTOP, TWOSTOP->TWOSTOP, and |
| 31 | TWOSTOP->RONORMAL updates. |
| 32 | """ |
| 33 | version = 1 |
| 34 | |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 35 | |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 36 | def initialize(self, host, cmdline_args, use_pyauto=False, use_faft=True): |
| 37 | # Parse arguments from command line |
| 38 | dict_args = utils.args_to_dict(cmdline_args) |
Tom Wai-Hong Tam | bcbea79 | 2012-09-12 10:29:19 +0800 | [diff] [blame] | 39 | if 'new_ec' not in dict_args or not os.path.isfile(dict_args['new_ec']): |
Tom Wai-Hong Tam | 55f51a0 | 2012-09-06 15:39:20 +0800 | [diff] [blame] | 40 | raise error.TestError( |
Tom Wai-Hong Tam | bcbea79 | 2012-09-12 10:29:19 +0800 | [diff] [blame] | 41 | 'Should specify a valid new_ec image for update, like: ' |
| 42 | 'run_remote_tests.sh --args "new_ec=/path/to/' |
| 43 | 'ec_autest_image.bin". The ec_autest_image.bin file is ' |
| 44 | 'included in the firmware_from_source.tar.bz2.') |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 45 | self.arg_new_ec = dict_args['new_ec'] |
| 46 | logging.info('The EC image to-be-updated is: %s' % self.arg_new_ec) |
| 47 | super(firmware_UpdateECBin, self).initialize(host, cmdline_args, |
| 48 | use_pyauto, use_faft) |
| 49 | |
| 50 | |
| 51 | def setup(self, host, dev_mode=False): |
| 52 | super(firmware_UpdateECBin, self).setup() |
Chun-ting Chang | fa47407 | 2012-09-07 16:11:36 +0800 | [diff] [blame] | 53 | self.backup_firmware() |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 54 | self.setup_dev_mode(dev_mode) |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 55 | |
| 56 | temp_path = self.faft_client.get_temp_path() |
| 57 | self.faft_client.setup_firmwareupdate_temp_dir() |
Tom Wai-Hong Tam | b63bc74 | 2012-08-30 20:41:30 +0800 | [diff] [blame] | 58 | |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 59 | self.new_ec_path = os.path.join(temp_path, 'new_ec.bin') |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 60 | host.send_file(self.arg_new_ec, self.new_ec_path) |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 61 | |
| 62 | |
| 63 | def cleanup(self): |
Chun-ting Chang | fa47407 | 2012-09-07 16:11:36 +0800 | [diff] [blame] | 64 | self.restore_firmware() |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 65 | super(firmware_UpdateECBin, self).cleanup() |
| 66 | |
| 67 | |
Tom Wai-Hong Tam | b63bc74 | 2012-08-30 20:41:30 +0800 | [diff] [blame] | 68 | def do_ronormal_update(self): |
| 69 | self.faft_client.setup_EC_image(self.new_ec_path) |
| 70 | self.new_ec_sha = self.faft_client.get_EC_image_sha() |
| 71 | self.faft_client.update_EC_from_image('a', 0) |
| 72 | |
| 73 | |
| 74 | def do_twostop_update(self): |
| 75 | # We update the original BIOS image back. This BIOS image contains |
| 76 | # the original EC binary. But set RW boot. So it is a TWOSTOP -> |
| 77 | # TWOSTOP update. |
| 78 | self.faft_client.write_firmware(self.old_bios_path) |
| 79 | self.faft_client.set_firmware_flags('a', 0) |
| 80 | |
| 81 | |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 82 | def run_once(self, host=None): |
Tom Wai-Hong Tam | 1f16f12 | 2012-09-03 11:20:46 +0800 | [diff] [blame] | 83 | if not self.check_ec_capability(): |
| 84 | return |
| 85 | |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 86 | flags = self.faft_client.get_firmware_flags('a') |
Tom Wai-Hong Tam | 6ec46e3 | 2012-10-05 16:39:21 +0800 | [diff] [blame^] | 87 | if flags & vboot.PREAMBLE_USE_RO_NORMAL == 0: |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 88 | logging.info('The firmware USE_RO_NORMAL flag is disabled.') |
| 89 | return |
| 90 | |
| 91 | self.register_faft_sequence(( |
| 92 | { # Step 1, expected EC RO boot, update EC and disable RO flag |
Tom Wai-Hong Tam | 3e82e36 | 2012-09-05 10:17:55 +0800 | [diff] [blame] | 93 | 'state_checker': (self.ro_normal_checker, 'A'), |
Tom Wai-Hong Tam | b63bc74 | 2012-08-30 20:41:30 +0800 | [diff] [blame] | 94 | 'userspace_action': self.do_ronormal_update, |
Tom Wai-Hong Tam | a9c7de4 | 2012-08-31 09:40:04 +0800 | [diff] [blame] | 95 | 'reboot_action': self.sync_and_warm_reboot, |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 96 | }, |
Tom Wai-Hong Tam | b63bc74 | 2012-08-30 20:41:30 +0800 | [diff] [blame] | 97 | { # Step 2, expected new EC and RW boot, restore the original BIOS |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 98 | 'state_checker': ( |
Tom Wai-Hong Tam | 3e82e36 | 2012-09-05 10:17:55 +0800 | [diff] [blame] | 99 | lambda: self.ro_normal_checker('A', twostop=True) and |
| 100 | (self.faft_client.get_EC_firmware_sha() == |
| 101 | self.new_ec_sha)), |
Tom Wai-Hong Tam | b63bc74 | 2012-08-30 20:41:30 +0800 | [diff] [blame] | 102 | 'userspace_action': self.do_twostop_update, |
Tom Wai-Hong Tam | a9c7de4 | 2012-08-31 09:40:04 +0800 | [diff] [blame] | 103 | # We use warm reboot here to test the following EC behavior: |
| 104 | # If EC is already into RW before powering on the AP, the AP |
| 105 | # will need to get the EC into RO first. It does this by |
| 106 | # telling the EC to wait for the AP to shut down, reboot |
| 107 | # into RO, then power on the AP automatically. |
| 108 | 'reboot_action': self.sync_and_warm_reboot, |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 109 | }, |
Tom Wai-Hong Tam | b63bc74 | 2012-08-30 20:41:30 +0800 | [diff] [blame] | 110 | { # Step 3, expected different EC and RW boot, enable RO flag |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 111 | 'state_checker': ( |
Tom Wai-Hong Tam | 3e82e36 | 2012-09-05 10:17:55 +0800 | [diff] [blame] | 112 | lambda: self.ro_normal_checker('A', twostop=True) and |
| 113 | (self.faft_client.get_EC_firmware_sha() != |
| 114 | self.new_ec_sha)), |
Tom Wai-Hong Tam | b63bc74 | 2012-08-30 20:41:30 +0800 | [diff] [blame] | 115 | 'userspace_action': (self.faft_client.set_firmware_flags, |
Tom Wai-Hong Tam | fc700b5 | 2012-09-13 21:33:52 +0800 | [diff] [blame] | 116 | ('a', flags)), |
Tom Wai-Hong Tam | a9c7de4 | 2012-08-31 09:40:04 +0800 | [diff] [blame] | 117 | 'reboot_action': self.sync_and_warm_reboot, |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 118 | }, |
| 119 | { # Step 4, expected EC RO boot, done |
Tom Wai-Hong Tam | 3e82e36 | 2012-09-05 10:17:55 +0800 | [diff] [blame] | 120 | 'state_checker': (self.ro_normal_checker, 'A'), |
Tom Wai-Hong Tam | 9b917b8 | 2012-08-24 16:21:10 +0800 | [diff] [blame] | 121 | }, |
| 122 | )) |
| 123 | self.run_faft_sequence() |