# Copyright (c) 2018 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import logging from contextlib import contextmanager from autotest_lib.client.bin import test from autotest_lib.client.bin import utils from autotest_lib.client.common_lib import error from autotest_lib.client.cros.power import power_suspend from autotest_lib.client.cros.power import power_status from autotest_lib.client.cros.power import power_utils class power_SuspendToIdle(test.test): """class for power_SuspendToIdle test.""" version = 1 @contextmanager def _log_error_message(self): """Suppress exception and log the message.""" try: yield except Exception as e: self._error_count += 1 self._error_message.append(str(e)) def run_once(self, force_suspend_to_idle=False): """Main test method. """ if utils.get_cpu_arch() != 'x86_64': raise error.TestNAError('This test only supports x86_64 CPU.') if power_utils.get_sleep_state() != 'freeze': if not force_suspend_to_idle: raise error.TestNAError( 'System default config is not suspend to idle.') else: logging.info('System default config is suspend to ram. ' 'Force suspend to idle') self._error_count = 0 self._error_message = [] dmc_firmware_stats = None s0ix_residency_stats = None cpu_packages_stats = None rc6_residency_stats = None with self._log_error_message(): dmc_firmware_stats = power_status.DMCFirmwareStats() if not dmc_firmware_stats.check_fw_loaded(): raise error.TestFail('DMC firmware not loaded.') with self._log_error_message(): pch_powergating_stats = power_status.PCHPowergatingStats() pch_powergating_stats.read_pch_powergating_info() if not pch_powergating_stats.check_s0ix_requirement(): raise error.TestFail('PCH powergating check failed.') with self._log_error_message(): s0ix_residency_stats = power_status.S0ixResidencyStats() with self._log_error_message(): cpu_packages_stats = power_status.CPUPackageStats() with self._log_error_message(): rc6_residency_stats = power_status.RC6ResidencyStats() with self._log_error_message(): suspender = power_suspend.Suspender(self.resultsdir, suspend_state='freeze') suspender.suspend() with self._log_error_message(): if (dmc_firmware_stats and dmc_firmware_stats.is_dc6_supported() and dmc_firmware_stats.get_accumulated_dc6_entry() <= 0): raise error.TestFail('DC6 entry check failed.') with self._log_error_message(): if (s0ix_residency_stats and s0ix_residency_stats.get_accumulated_residency_secs() <= 0): raise error.TestFail('S0ix residency check failed.') with self._log_error_message(): if (cpu_packages_stats and cpu_packages_stats.refresh().get('C10', 0) <= 0): raise error.TestFail('C10 state check failed.') with self._log_error_message(): if (rc6_residency_stats and rc6_residency_stats.get_accumulated_residency_secs() <= 0): raise error.TestFail('RC6 residency check failed.') if self._error_count > 0: raise error.TestFail('Found %d errors: ' % self._error_count, ', '.join(self._error_message))