113f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch# Copyright (c) 2015 The Chromium OS Authors. All rights reserved.
213f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch# Use of this source code is governed by a BSD-style license that can be
313f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch# found in the LICENSE file.
413f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch
513f929ddf163cc7e475ed34e130e875da11c99c4Todd Brochimport logging
613f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch
713f929ddf163cc7e475ed34e130e875da11c99c4Todd Brochfrom autotest_lib.client.bin import test
813f929ddf163cc7e475ed34e130e875da11c99c4Todd Brochfrom autotest_lib.client.common_lib import error
913f929ddf163cc7e475ed34e130e875da11c99c4Todd Brochfrom autotest_lib.client.cros import ec as cros_ec
1013f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch
1113f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch
1213f929ddf163cc7e475ed34e130e875da11c99c4Todd Brochclass usbpd_DisplayPortSink(test.test):
1313f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch    """Integration test for USB-PD DisplayPort sink."""
1413f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch
1513f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch    version = 1
1613f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch    DP_SVID = '0xff01'
1713f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch
1813f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch    def _is_displayport(self, port):
1913f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch        return port.is_amode_supported(self.DP_SVID)
2013f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch
2113f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch    def _set_displayport(self, port, opos, enter):
2213f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch        return port.set_amode(self.DP_SVID, opos, enter)
2313f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch
2413f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch    def run_once(self, enter_reps=1):
2513f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch        usbpd = cros_ec.EC_USBPD()
2613f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch        logging.info("device has %d USB-PD ports", len(usbpd.ports))
2713f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch
2813f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch        for i,port in enumerate(usbpd.ports):
2913f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch            if not port.is_dfp():
3013f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch                continue
3113f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch
3213f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch            logging.info("Port %d is dfp", i)
3313f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch
3413f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch            if not self._is_displayport(port):
3513f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch                continue
3613f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch
3713f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch            logging.info("Port %d supports dp", i)
3813f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch
3913f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch            for _ in xrange(enter_reps):
4013f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch                if not self._set_displayport(port, 1, False):
4113f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch                    raise error.TestError("Failed to exit DP mode")
4213f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch
4313f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch                if not self._set_displayport(port, 1, True):
4413f929ddf163cc7e475ed34e130e875da11c99c4Todd Broch                    raise error.TestError("Failed to enter DP mode")
45