blob: a456d0314a9b07ebc7c2165c794d6cbabcd602fd [file] [log] [blame]
# 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_msecs() <= 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))