| # Copyright (c) 2014 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 os.path |
| import time |
| |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.common_lib.cros import chrome |
| from autotest_lib.client.bin import test, utils |
| |
| |
| class power_PSROccupancyTest(test.test): |
| """ |
| Tests that PSR is entered on a static content. |
| |
| The purpose of this test is to verify that display enters the PSR state when |
| the content being displayed is static. It also verifies that the display |
| stays in PSR state for as long as the display is static. It first enables |
| PSR if not enabled and makes the displayed content static. It then waits for |
| some time, after which it checks whether the display was in PSR state for |
| close to (<wait time> - <vblankoffdelay>). |
| """ |
| version = 1 |
| |
| |
| def _is_psr_enabled(self): |
| enable_psr_file_path = '/sys/module/i915/parameters/enable_psr' |
| if not os.path.exists(enable_psr_file_path): |
| raise error.TestFail('sysfs entry for "enable_psr" is missing.') |
| return int(utils.read_file(enable_psr_file_path)) == 1 |
| |
| |
| def _get_perf_count(self): |
| debugfs_file_path = '/sys/kernel/debug/dri/0/i915_edp_psr_status' |
| if not os.path.exists(debugfs_file_path): |
| raise error.TestFail('debugfs entry for PSR status is missing.') |
| psr_status = utils.read_file(debugfs_file_path).splitlines() |
| if len(psr_status) != 4: |
| raise error.TestFail( |
| 'Incorrect number of lines in %s.' % debugfs_file_path) |
| perf_count_chunks = psr_status[3].split() |
| if len(perf_count_chunks) != 2: |
| raise error.TestFail('Unknown format in %s.' % debugfs_file_path) |
| return int(perf_count_chunks[1]) |
| |
| |
| def _get_vblank_timeout(self): |
| return int(utils.read_file('/sys/module/drm/parameters/vblankoffdelay')) |
| |
| |
| def run_once(self): |
| if utils.get_board() != 'samus': |
| raise error.TestNAError( |
| 'Trying to run PSR tests on non-samus board.') |
| psr_enabled = self._is_psr_enabled() |
| if not psr_enabled and utils.call_xrandr('--output eDP1 --set psr on'): |
| error.TestFail('Unable to enable PSR via xrandr.') |
| # Start chrome in full screen mode so that there is no blinking cursor |
| # or ticking clock on the screen. |
| with chrome.Chrome(logged_in=False, extra_browser_args=['--kiosk']): |
| # Sample the PSR performance count from debugfs and wait for 20s. |
| # At the end of 20s, re-sample the PSR performance count. The time |
| # spent in PSR should be close to (20s - <vblankoffdelay>). |
| sleep_time_milliseconds = 20 * 1000 |
| min_occupancy = 0.9 * (sleep_time_milliseconds - |
| self._get_vblank_timeout()) |
| perf_count_old = self._get_perf_count() |
| time.sleep(sleep_time_milliseconds / 1000) |
| perf_count_new = self._get_perf_count() |
| occupancy_time = perf_count_new - perf_count_old |
| if occupancy_time < min_occupancy: |
| raise error.TestFail( |
| 'PSR occupancy time %dms less than expected.' % |
| occupancy_time) |
| # Disable PSR if it was not enabled to begin with. |
| if (not psr_enabled and |
| utils.call_xrandr('--output eDP1 --set psr off')): |
| raise error.TestWarn('Unable to disable PSR via xrandr.') |