* [PATCH i-g-t 1/2] lib/igt_debugfs: Add functions/tests for controlling/testing HPD storm logic
@ 2017-02-23 3:18 Lyude
2017-02-23 3:18 ` [PATCH i-g-t 2/2] tests/chamelium: Don't sleep so much in basic hpd tests Lyude
0 siblings, 1 reply; 5+ messages in thread
From: Lyude @ 2017-02-23 3:18 UTC (permalink / raw)
To: intel-gfx; +Cc: Lyude
Recently we added i915_hpd_storm_ctl into i915's debugfs directory,
which allows us to control the thresholds i915 uses for detecting
hotplug interrupt storms from userspace, along with the ability to
entirely disable them. This adds some helper functions into IGT to
enable making use of this feature, along with adding some chamelium
tests for it.
Signed-off-by: Lyude <lyude@redhat.com>
---
lib/igt_debugfs.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
lib/igt_debugfs.h | 5 +++
tests/chamelium.c | 61 ++++++++++++++++++++++++++++++
3 files changed, 177 insertions(+)
diff --git a/lib/igt_debugfs.c b/lib/igt_debugfs.c
index 982573d..e64d001 100644
--- a/lib/igt_debugfs.c
+++ b/lib/igt_debugfs.c
@@ -463,6 +463,117 @@ void igt_require_pipe_crc(void)
fclose(ctl);
}
+/**
+ * igt_hpd_storm_set_threshold:
+ * @threshold: How many hotplugs per second required to trigger an HPD storm,
+ * or 0 to disable storm detection.
+ *
+ * Convienence helper to configure the HPD storm detection threshold for i915
+ * through debugfs. Useful for hotplugging tests where HPD storm detection
+ * might get in the way and slow things down.
+ *
+ * If the system does not support HPD storm detection, this function does
+ * nothing.
+ *
+ * See: https://01.org/linuxgraphics/gfx-docs/drm/gpu/i915.html#hotplug
+ */
+void igt_hpd_storm_set_threshold(unsigned int threshold)
+{
+ int fd = igt_debugfs_open("i915_hpd_storm_ctl", O_WRONLY);
+ char buf[16];
+
+ if (fd < 0)
+ return;
+
+ igt_debug("Setting HPD storm threshold to %d\n", threshold);
+ snprintf(buf, sizeof(buf), "%d", threshold);
+ igt_assert_eq(write(fd, buf, strlen(buf)), strlen(buf));
+
+ close(fd);
+ igt_install_exit_handler((igt_exit_handler_t)igt_hpd_storm_reset);
+}
+
+/**
+ * igt_hpd_storm_reset:
+ *
+ * Convienence helper to reset HPD storm detection to it's default settings.
+ * If hotplug detection was disabled on any ports due to an HPD storm, it will
+ * be immediately re-enabled. Always called on exit if the HPD storm detection
+ * threshold was modified during any tests.
+ *
+ * If the system does not support HPD storm detection, this function does
+ * nothing.
+ *
+ * See: https://01.org/linuxgraphics/gfx-docs/drm/gpu/i915.html#hotplug
+ */
+void igt_hpd_storm_reset(void)
+{
+ int fd = igt_debugfs_open("i915_hpd_storm_ctl", O_WRONLY);
+ const char *buf = "reset";
+
+ if (fd < 0)
+ return;
+
+ igt_debug("Resetting HPD storm threshold\n");
+ igt_assert_eq(write(fd, buf, strlen(buf)), strlen(buf));
+
+ close(fd);
+}
+
+/**
+ * igt_hpd_storm_detected:
+ *
+ * Checks whether or not i915 has detected an HPD interrupt storm on any of the
+ * system's ports.
+ *
+ * This function always returns false on systems that do not support HPD storm
+ * detection.
+ *
+ * See: https://01.org/linuxgraphics/gfx-docs/drm/gpu/i915.html#hotplug
+ *
+ * Returns: Whether or not an HPD storm has been detected.
+ */
+bool igt_hpd_storm_detected(void)
+{
+ int fd = igt_debugfs_open("i915_hpd_storm_ctl", O_RDONLY);
+ char *start_loc;
+ char buf[32] = {0}, detected_str[4];
+ bool ret;
+
+ if (fd < 0)
+ return false;
+
+ igt_assert_lt(0, read(fd, buf, sizeof(buf)));
+ igt_assert(start_loc = strstr(buf, "Detected: "));
+ igt_assert_eq(sscanf(start_loc, "Detected: %s\n", detected_str), 1);
+
+ if (strcmp(detected_str, "yes") == 0)
+ ret = true;
+ else if (strcmp(detected_str, "no") == 0)
+ ret = false;
+ else
+ igt_fail_on_f(true, "Unknown hpd storm detection status '%s'\n",
+ detected_str);
+
+ close(fd);
+ return ret;
+}
+
+/**
+ * igt_require_hpd_storm_ctl:
+ *
+ * Skips the current test if the system does not have HPD storm detection.
+ *
+ * See: https://01.org/linuxgraphics/gfx-docs/drm/gpu/i915.html#hotplug
+ */
+void igt_require_hpd_storm_ctl(void)
+{
+ int fd = igt_debugfs_open("i915_hpd_storm_ctl", O_RDONLY);
+
+ igt_require_f(fd > 0, "No i915_hpd_storm_ctl found in debugfs\n");
+ close(fd);
+}
+
static igt_pipe_crc_t *
pipe_crc_new(enum pipe pipe, enum intel_pipe_crc_source source, int flags)
{
diff --git a/lib/igt_debugfs.h b/lib/igt_debugfs.h
index 86c25dd..5587ad4 100644
--- a/lib/igt_debugfs.h
+++ b/lib/igt_debugfs.h
@@ -129,6 +129,11 @@ int igt_pipe_crc_get_crcs(igt_pipe_crc_t *pipe_crc, int n_crcs,
igt_crc_t **out_crcs);
void igt_pipe_crc_collect_crc(igt_pipe_crc_t *pipe_crc, igt_crc_t *out_crc);
+void igt_hpd_storm_set_threshold(unsigned int threshold);
+void igt_hpd_storm_reset(void);
+bool igt_hpd_storm_detected(void);
+void igt_require_hpd_storm_ctl(void);
+
/*
* Drop caches
*/
diff --git a/tests/chamelium.c b/tests/chamelium.c
index f340279..849e1ac 100644
--- a/tests/chamelium.c
+++ b/tests/chamelium.c
@@ -44,6 +44,9 @@ typedef struct {
#define HOTPLUG_TIMEOUT 20 /* seconds */
#define SUSPEND_RESUME_DELAY 20 /* seconds */
+#define HPD_STORM_PULSE_INTERVAL_DP 100 /* ms */
+#define HPD_STORM_PULSE_INTERVAL_HDMI 200 /* ms */
+
/* Pre-calculated CRCs for the pattern fb, for all the modes in the default
* chamelium edid
*/
@@ -528,6 +531,48 @@ test_hpd_without_ddc(data_t *data, struct chamelium_port *port)
igt_cleanup_hotplug(mon);
}
+static void
+test_hpd_storm_detect(data_t *data, struct chamelium_port *port, int width)
+{
+ struct udev_monitor *mon;
+ int count = 0;
+
+ igt_require_hpd_storm_ctl();
+ reset_state(data, port);
+
+ igt_hpd_storm_set_threshold(1);
+ chamelium_fire_hpd_pulses(data->chamelium, port, width, 10);
+ igt_assert(igt_hpd_storm_detected());
+
+ mon = igt_watch_hotplug();
+ chamelium_fire_hpd_pulses(data->chamelium, port, width, 10);
+
+ /*
+ * Polling should have been enabled by the HPD storm at this point,
+ * so we should only get at most 1 hotplug event
+ */
+ igt_until_timeout(5)
+ count += igt_hotplug_detected(mon, 1);
+ igt_assert_lt(count, 2);
+
+ igt_cleanup_hotplug(mon);
+ igt_hpd_storm_reset();
+}
+
+static void
+test_hpd_storm_disable(data_t *data, struct chamelium_port *port, int width)
+{
+ igt_require_hpd_storm_ctl();
+ reset_state(data, port);
+
+ igt_hpd_storm_set_threshold(0);
+ chamelium_fire_hpd_pulses(data->chamelium, port,
+ width, 10);
+ igt_assert(!igt_hpd_storm_detected());
+
+ igt_hpd_storm_reset();
+}
+
#define for_each_port(p, port) \
for (p = 0, port = data.ports[p]; \
p < data.port_count; \
@@ -593,6 +638,14 @@ igt_main
SUSPEND_STATE_DISK,
SUSPEND_TEST_DEVICES);
+ connector_subtest("dp-hpd-storm", DisplayPort)
+ test_hpd_storm_detect(&data, port,
+ HPD_STORM_PULSE_INTERVAL_DP);
+
+ connector_subtest("dp-hpd-storm-disable", DisplayPort)
+ test_hpd_storm_disable(&data, port,
+ HPD_STORM_PULSE_INTERVAL_DP);
+
connector_subtest("dp-edid-change-during-suspend", DisplayPort)
test_suspend_resume_edid_change(&data, port,
SUSPEND_STATE_MEM,
@@ -641,6 +694,14 @@ igt_main
SUSPEND_STATE_DISK,
SUSPEND_TEST_DEVICES);
+ connector_subtest("hdmi-hpd-storm", HDMIA)
+ test_hpd_storm_detect(&data, port,
+ HPD_STORM_PULSE_INTERVAL_HDMI);
+
+ connector_subtest("hdmi-hpd-storm-disable", HDMIA)
+ test_hpd_storm_disable(&data, port,
+ HPD_STORM_PULSE_INTERVAL_HDMI);
+
connector_subtest("hdmi-edid-change-during-suspend", HDMIA)
test_suspend_resume_edid_change(&data, port,
SUSPEND_STATE_MEM,
--
2.9.3
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH i-g-t 2/2] tests/chamelium: Don't sleep so much in basic hpd tests
2017-02-23 3:18 [PATCH i-g-t 1/2] lib/igt_debugfs: Add functions/tests for controlling/testing HPD storm logic Lyude
@ 2017-02-23 3:18 ` Lyude
2017-02-23 7:26 ` Chris Wilson
0 siblings, 1 reply; 5+ messages in thread
From: Lyude @ 2017-02-23 3:18 UTC (permalink / raw)
To: intel-gfx; +Cc: Lyude
Now that we can just disable HPD storm detection, there's no need to
sleep between each hotplug cycle.
Signed-off-by: Lyude <lyude@redhat.com>
---
tests/chamelium.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/tests/chamelium.c b/tests/chamelium.c
index 849e1ac..810c955 100644
--- a/tests/chamelium.c
+++ b/tests/chamelium.c
@@ -154,6 +154,7 @@ test_basic_hotplug(data_t *data, struct chamelium_port *port)
int i;
reset_state(data, port);
+ igt_hpd_storm_set_threshold(0);
for (i = 0; i < 15; i++) {
igt_flush_hotplugs(mon);
@@ -171,12 +172,10 @@ test_basic_hotplug(data_t *data, struct chamelium_port *port)
igt_assert(igt_hotplug_detected(mon, HOTPLUG_TIMEOUT));
igt_assert_eq(reprobe_connector(data, port),
DRM_MODE_DISCONNECTED);
-
- /* Sleep so we don't accidentally cause an hpd storm */
- usleep(500 * 1000);
}
igt_cleanup_hotplug(mon);
+ igt_hpd_storm_reset();
}
static void
--
2.9.3
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH i-g-t 2/2] tests/chamelium: Don't sleep so much in basic hpd tests
2017-02-23 3:18 ` [PATCH i-g-t 2/2] tests/chamelium: Don't sleep so much in basic hpd tests Lyude
@ 2017-02-23 7:26 ` Chris Wilson
2017-02-23 20:31 ` Lyude Paul
0 siblings, 1 reply; 5+ messages in thread
From: Chris Wilson @ 2017-02-23 7:26 UTC (permalink / raw)
To: Lyude; +Cc: intel-gfx
On Wed, Feb 22, 2017 at 10:18:33PM -0500, Lyude wrote:
> Now that we can just disable HPD storm detection, there's no need to
> sleep between each hotplug cycle.
>
> Signed-off-by: Lyude <lyude@redhat.com>
> ---
> tests/chamelium.c | 5 ++---
> 1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/tests/chamelium.c b/tests/chamelium.c
> index 849e1ac..810c955 100644
> --- a/tests/chamelium.c
> +++ b/tests/chamelium.c
> @@ -154,6 +154,7 @@ test_basic_hotplug(data_t *data, struct chamelium_port *port)
> int i;
>
> reset_state(data, port);
> + igt_hpd_storm_set_threshold(0);
You will want to check that you have the debugfs interface first and
skip the test otherwise. Or was there a fallback? Or is it already
checkd?
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH i-g-t 2/2] tests/chamelium: Don't sleep so much in basic hpd tests
2017-02-23 7:26 ` Chris Wilson
@ 2017-02-23 20:31 ` Lyude Paul
2017-02-23 22:53 ` Chris Wilson
0 siblings, 1 reply; 5+ messages in thread
From: Lyude Paul @ 2017-02-23 20:31 UTC (permalink / raw)
To: Chris Wilson; +Cc: intel-gfx
On Thu, 2017-02-23 at 07:26 +0000, Chris Wilson wrote:
> On Wed, Feb 22, 2017 at 10:18:33PM -0500, Lyude wrote:
> > Now that we can just disable HPD storm detection, there's no need
> > to
> > sleep between each hotplug cycle.
> >
> > Signed-off-by: Lyude <lyude@redhat.com>
> > ---
> > tests/chamelium.c | 5 ++---
> > 1 file changed, 2 insertions(+), 3 deletions(-)
> >
> > diff --git a/tests/chamelium.c b/tests/chamelium.c
> > index 849e1ac..810c955 100644
> > --- a/tests/chamelium.c
> > +++ b/tests/chamelium.c
> > @@ -154,6 +154,7 @@ test_basic_hotplug(data_t *data, struct
> > chamelium_port *port)
> > int i;
> >
> > reset_state(data, port);
> > + igt_hpd_storm_set_threshold(0);
>
> You will want to check that you have the debugfs interface first and
> skip the test otherwise. Or was there a fallback? Or is it already
> checkd?
>
> -Chris
If the debugfs interface isn't there, the function just doesn't do
anything and returns immediately
>
--
Cheers,
Lyude
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH i-g-t 2/2] tests/chamelium: Don't sleep so much in basic hpd tests
2017-02-23 20:31 ` Lyude Paul
@ 2017-02-23 22:53 ` Chris Wilson
0 siblings, 0 replies; 5+ messages in thread
From: Chris Wilson @ 2017-02-23 22:53 UTC (permalink / raw)
To: Lyude Paul; +Cc: intel-gfx
On Thu, Feb 23, 2017 at 03:31:09PM -0500, Lyude Paul wrote:
> On Thu, 2017-02-23 at 07:26 +0000, Chris Wilson wrote:
> > On Wed, Feb 22, 2017 at 10:18:33PM -0500, Lyude wrote:
> > > Now that we can just disable HPD storm detection, there's no need
> > > to
> > > sleep between each hotplug cycle.
> > >
> > > Signed-off-by: Lyude <lyude@redhat.com>
> > > ---
> > > tests/chamelium.c | 5 ++---
> > > 1 file changed, 2 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/tests/chamelium.c b/tests/chamelium.c
> > > index 849e1ac..810c955 100644
> > > --- a/tests/chamelium.c
> > > +++ b/tests/chamelium.c
> > > @@ -154,6 +154,7 @@ test_basic_hotplug(data_t *data, struct
> > > chamelium_port *port)
> > > int i;
> > >
> > > reset_state(data, port);
> > > + igt_hpd_storm_set_threshold(0);
> >
> > You will want to check that you have the debugfs interface first and
> > skip the test otherwise. Or was there a fallback? Or is it already
> > checkd?
> >
> > -Chris
> If the debugfs interface isn't there, the function just doesn't do
> anything and returns immediately
Ok, it just sounded like you depended upon the new feature and dropped
the old method.
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-02-23 22:53 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-23 3:18 [PATCH i-g-t 1/2] lib/igt_debugfs: Add functions/tests for controlling/testing HPD storm logic Lyude
2017-02-23 3:18 ` [PATCH i-g-t 2/2] tests/chamelium: Don't sleep so much in basic hpd tests Lyude
2017-02-23 7:26 ` Chris Wilson
2017-02-23 20:31 ` Lyude Paul
2017-02-23 22:53 ` Chris Wilson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox