普通文本  |  100行  |  3.74 KB

# 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))