• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2014 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
6import os.path
7import time
8
9from autotest_lib.client.common_lib import error
10from autotest_lib.client.common_lib.cros import chrome
11from autotest_lib.client.bin import test, utils
12from autotest_lib.client.cros.graphics import graphics_utils
13
14
15class power_PSROccupancyTest(test.test):
16    """
17    Tests that PSR is entered on a static content.
18
19    The purpose of this test is to verify that display enters the PSR state when
20    the content being displayed is static. It also verifies that the display
21    stays in PSR state for as long as the display is static. It first enables
22    PSR if not enabled and makes the displayed content static. It then waits for
23    some time, after which it checks whether the display was in PSR state for
24    close to (<wait time> - <vblankoffdelay>).
25    """
26    version = 1
27
28
29    def _is_psr_enabled(self):
30        enable_psr_file_path = '/sys/module/i915/parameters/enable_psr'
31        if not os.path.exists(enable_psr_file_path):
32            raise error.TestFail('sysfs entry for "enable_psr" is missing.')
33        return int(utils.read_file(enable_psr_file_path)) == 1
34
35
36    def _get_perf_count(self):
37        debugfs_file_path = '/sys/kernel/debug/dri/0/i915_edp_psr_status'
38        if not os.path.exists(debugfs_file_path):
39            raise error.TestFail('debugfs entry for PSR status is missing.')
40        psr_status = utils.read_file(debugfs_file_path).splitlines()
41        if len(psr_status) != 4:
42            raise error.TestFail(
43                    'Incorrect number of lines in %s.' % debugfs_file_path)
44        perf_count_chunks = psr_status[3].split()
45        if len(perf_count_chunks) != 2:
46            raise error.TestFail('Unknown format in %s.' % debugfs_file_path)
47        return int(perf_count_chunks[1])
48
49
50    def _get_vblank_timeout(self):
51        return int(utils.read_file('/sys/module/drm/parameters/vblankoffdelay'))
52
53
54    def run_once(self):
55        if utils.get_board() not in ['samus', 'gandof']:
56            raise error.TestNAError(
57                    'Trying to run PSR tests on unsupported board.')
58        psr_enabled = self._is_psr_enabled()
59        if (not psr_enabled and
60            graphics_utils.call_xrandr('--output eDP1 --set psr on')):
61            error.TestFail('Unable to enable PSR via xrandr.')
62        # Start chrome in full screen mode so that there is no blinking cursor
63        # or ticking clock on the screen.
64        with chrome.Chrome(logged_in=False, extra_browser_args=['--kiosk']):
65            # Sample the PSR performance count from debugfs and wait for 20s.
66            # At the end of 20s, re-sample the PSR performance count. The time
67            # spent in PSR should be close to (20s - <vblankoffdelay>).
68            sleep_time_milliseconds = 20 * 1000
69            min_occupancy = 0.9 * (sleep_time_milliseconds -
70                                   self._get_vblank_timeout())
71            perf_count_old = self._get_perf_count()
72            time.sleep(sleep_time_milliseconds / 1000)
73            perf_count_new = self._get_perf_count()
74            occupancy_time = perf_count_new - perf_count_old
75            if occupancy_time < min_occupancy:
76                raise error.TestFail(
77                        'PSR occupancy time %dms less than expected.' %
78                        occupancy_time)
79            # Disable PSR if it was not enabled to begin with.
80            if (not psr_enabled and
81                graphics_utils.call_xrandr('--output eDP1 --set psr off')):
82                raise error.TestWarn('Unable to disable PSR via xrandr.')
83