From patchwork Mon Jun 19 09:39:05 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Kocialkowki X-Patchwork-Id: 9795609 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id C9FFF6020B for ; Mon, 19 Jun 2017 09:39:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EAC1626E98 for ; Mon, 19 Jun 2017 09:39:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DF5F927E5A; Mon, 19 Jun 2017 09:39:23 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 5941F26E98 for ; Mon, 19 Jun 2017 09:39:22 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3E7776E169; Mon, 19 Jun 2017 09:39:21 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTPS id 760196E169 for ; Mon, 19 Jun 2017 09:39:20 +0000 (UTC) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jun 2017 02:39:09 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.39,360,1493708400"; d="scan'208";a="101065506" Received: from linux.intel.com ([10.54.29.200]) by orsmga002.jf.intel.com with ESMTP; 19 Jun 2017 02:39:09 -0700 Received: from workstation.fi.intel.com (workstation.fi.intel.com [10.237.68.144]) by linux.intel.com (Postfix) with ESMTP id 237DA5804B8; Mon, 19 Jun 2017 02:39:07 -0700 (PDT) From: Paul Kocialkowski To: intel-gfx@lists.freedesktop.org Date: Mon, 19 Jun 2017 12:39:05 +0300 Message-Id: <20170619093905.4603-1-paul.kocialkowski@linux.intel.com> X-Mailer: git-send-email 2.13.1 Cc: Lyude Subject: [Intel-gfx] [PATCH i-g-t v3] tests/chamelium: Add common suspend and hibernate tests for DP and HDMI X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP This adds two new tests: common-hpd-after-suspend and common-hpd-after-hibernate that are aimed at testing HPD change during suspend/hibernate for both DP and HDMI, at the same time. The interest in bringing this test up is to reduce the time spent in testing, with the downside of less precision regarding the test's outcome. The per-connector tests are still available to get a more precise idea of which connector causes a failure, when that happens. VGA is explicitly excluded from this test as there is currently no way of doing delayed hpd pulses for it. The generic hpd suspend/resume test code is split in a dedicated function, that allow testing one or all possible ports. Signed-off-by: Paul Kocialkowski Reviewed-by: Lyude Paul --- tests/chamelium.c | 118 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 100 insertions(+), 18 deletions(-) diff --git a/tests/chamelium.c b/tests/chamelium.c index 76b14e95..3cf9f3b5 100644 --- a/tests/chamelium.c +++ b/tests/chamelium.c @@ -143,8 +143,18 @@ wait_for_connector(data_t *data, struct chamelium_port *port, static void reset_state(data_t *data, struct chamelium_port *port) { + int p; + chamelium_reset(data->chamelium); - wait_for_connector(data, port, DRM_MODE_DISCONNECTED); + + if (port) { + wait_for_connector(data, port, DRM_MODE_DISCONNECTED); + } else { + for (p = 0; p < data->port_count; p++) { + port = data->ports[p]; + wait_for_connector(data, port, DRM_MODE_DISCONNECTED); + } + } } static void @@ -206,36 +216,96 @@ test_edid_read(data_t *data, struct chamelium_port *port, } static void -test_suspend_resume_hpd(data_t *data, struct chamelium_port *port, - enum igt_suspend_state state, - enum igt_suspend_test test) +try_suspend_resume_hpd(data_t *data, struct chamelium_port *port, + enum igt_suspend_state state, enum igt_suspend_test test, + struct udev_monitor *mon, bool connected) { - struct udev_monitor *mon = igt_watch_hotplug(); - - reset_state(data, port); + int p; igt_set_autoresume_delay(SUSPEND_RESUME_DELAY); igt_flush_hotplugs(mon); - /* Make sure we notice new connectors after resuming */ - chamelium_async_hpd_pulse_start(data->chamelium, port, false, - SUSPEND_RESUME_DELAY / 2); + if (port) { + chamelium_async_hpd_pulse_start(data->chamelium, port, + connected, + SUSPEND_RESUME_DELAY / 2); + } else { + for (p = 0; p < data->port_count; p++) { + port = data->ports[p]; + if (chamelium_port_get_type(port) == DRM_MODE_CONNECTOR_VGA) + continue; + + chamelium_async_hpd_pulse_start(data->chamelium, port, + connected, + SUSPEND_RESUME_DELAY / 2); + } + + port = NULL; + } + igt_system_suspend_autoresume(state, test); chamelium_async_hpd_pulse_finish(data->chamelium); igt_assert(igt_hotplug_detected(mon, HOTPLUG_TIMEOUT)); - igt_assert_eq(reprobe_connector(data, port), DRM_MODE_CONNECTED); + if (port) { + igt_assert_eq(reprobe_connector(data, port), connected ? + DRM_MODE_DISCONNECTED : DRM_MODE_CONNECTED); + } else { + for (p = 0; p < data->port_count; p++) { + port = data->ports[p]; + if (chamelium_port_get_type(port) == DRM_MODE_CONNECTOR_VGA) + continue; + + igt_assert_eq(reprobe_connector(data, port), connected ? + DRM_MODE_DISCONNECTED : + DRM_MODE_CONNECTED); + } - igt_flush_hotplugs(mon); + port = NULL; + } +} + +static void +test_suspend_resume_hpd(data_t *data, struct chamelium_port *port, + enum igt_suspend_state state, + enum igt_suspend_test test) +{ + struct udev_monitor *mon = igt_watch_hotplug(); + + reset_state(data, port); + + /* Make sure we notice new connectors after resuming */ + try_suspend_resume_hpd(data, port, state, test, mon, false); /* Now make sure we notice disconnected connectors after resuming */ - chamelium_async_hpd_pulse_start(data->chamelium, port, true, - SUSPEND_RESUME_DELAY / 2); - igt_system_suspend_autoresume(state, test); - chamelium_async_hpd_pulse_finish(data->chamelium); + try_suspend_resume_hpd(data, port, state, test, mon, true); - igt_assert(igt_hotplug_detected(mon, HOTPLUG_TIMEOUT)); - igt_assert_eq(reprobe_connector(data, port), DRM_MODE_DISCONNECTED); + igt_cleanup_hotplug(mon); +} + +static void +test_suspend_resume_hpd_common(data_t *data, enum igt_suspend_state state, + enum igt_suspend_test test) +{ + struct udev_monitor *mon = igt_watch_hotplug(); + struct chamelium_port *port; + int p; + + for (p = 0; p < data->port_count; p++) { + port = data->ports[p]; + if (chamelium_port_get_type(port) == DRM_MODE_CONNECTOR_VGA) + continue; + + igt_debug("Testing port %s\n", chamelium_port_get_name(port)); + } + + reset_state(data, NULL); + + /* Make sure we notice new connectors after resuming */ + try_suspend_resume_hpd(data, NULL, state, test, mon, false); + + /* Now make sure we notice disconnected connectors after resuming */ + try_suspend_resume_hpd(data, NULL, state, test, mon, true); igt_cleanup_hotplug(mon); } @@ -750,6 +820,18 @@ igt_main test_hpd_without_ddc(&data, port); } + igt_subtest_group { + igt_subtest("common-hpd-after-suspend") + test_suspend_resume_hpd_common(&data, + SUSPEND_STATE_MEM, + SUSPEND_TEST_NONE); + + igt_subtest("common-hpd-after-hibernate") + test_suspend_resume_hpd_common(&data, + SUSPEND_STATE_DISK, + SUSPEND_TEST_DEVICES); + } + igt_fixture { close(data.drm_fd); }