summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/igt_chamelium.c78
-rw-r--r--lib/igt_chamelium.h7
-rw-r--r--tests/chamelium.c13
3 files changed, 23 insertions, 75 deletions
diff --git a/lib/igt_chamelium.c b/lib/igt_chamelium.c
index 4a2af796..225f98c3 100644
--- a/lib/igt_chamelium.c
+++ b/lib/igt_chamelium.c
@@ -447,76 +447,26 @@ void chamelium_fire_mixed_hpd_pulses(struct chamelium *chamelium,
xmlrpc_DECREF(pulse_widths);
}
-static void async_rpc_handler(const char *server_url, const char *method_name,
- xmlrpc_value *param_array, void *user_data,
- xmlrpc_env *fault, xmlrpc_value *result)
-{
- /* We don't care about the responses */
-}
-
/**
- * chamelium_async_hpd_pulse_start:
+ * chamelium_schedule_hpd_toggle:
* @chamelium: The Chamelium instance to use
* @port: The port to fire the HPD pulses on
- * @high: Whether to fire a high pulse (e.g. simulate a connect), or a low
- * pulse (e.g. simulate a disconnect)
- * @delay_secs: How long to wait before sending the HPD pulse.
- *
- * Instructs the chamelium to send an hpd pulse after @delay_secs seconds have
- * passed, without waiting for the chamelium to finish. This is useful for
- * testing things such as hpd after a suspend/resume cycle, since we can't tell
- * the chamelium to send a hotplug at the same time that our system is
- * suspended.
- *
- * It is required that the user eventually call
- * #chamelium_async_hpd_pulse_finish, to clean up the leftover XML-RPC
- * responses from the chamelium.
- */
-void chamelium_async_hpd_pulse_start(struct chamelium *chamelium,
- struct chamelium_port *port,
- bool high, int delay_secs)
-{
- xmlrpc_value *pulse_widths = xmlrpc_array_new(&chamelium->env), *width;
-
- /* TODO: Actually implement something in the chameleon server to allow
- * for delayed actions such as hotplugs. This would work a bit better
- * and allow us to test suspend/resume on ports without hpd like VGA
- */
-
- igt_debug("Sending HPD pulse (%s) on %s with %d second delay\n",
- high ? "high->low" : "low->high", port->name, delay_secs);
-
- /* If we're starting at high, make the first pulse width 0 so we keep
- * the port connected */
- if (high) {
- width = xmlrpc_int_new(&chamelium->env, 0);
- xmlrpc_array_append_item(&chamelium->env, pulse_widths, width);
- xmlrpc_DECREF(width);
- }
-
- width = xmlrpc_int_new(&chamelium->env, delay_secs * 1000);
- xmlrpc_array_append_item(&chamelium->env, pulse_widths, width);
- xmlrpc_DECREF(width);
-
- xmlrpc_client_start_rpcf(&chamelium->env, chamelium->client,
- chamelium->url,
- "FireMixedHpdPulses", async_rpc_handler, NULL,
- "(iA)", port->id, pulse_widths);
- xmlrpc_DECREF(pulse_widths);
-}
-
-/**
- * chamelium_async_hpd_pulse_finish:
- * @chamelium: The Chamelium instance to use
+ * @delay_ms: Delay in milli-second before the toggle takes place
+ * @rising_edge: Whether the toggle should be a rising edge or a falling edge
*
- * Waits for any asynchronous RPC started by #chamelium_async_hpd_pulse_start
- * to complete, and then cleans up any leftover responses from the chamelium.
- * If all of the RPC calls have already completed, this function returns
- * immediately.
+ * Instructs the chamelium to schedule an hpd toggle (either a rising edge or
+ * a falling edge, depending on @rising_edg) after @delay_ms have passed.
+ * This is useful for testing things such as hpd after a suspend/resume cycle.
*/
-void chamelium_async_hpd_pulse_finish(struct chamelium *chamelium)
+void chamelium_schedule_hpd_toggle(struct chamelium *chamelium,
+ struct chamelium_port *port, int delay_ms,
+ bool rising_edge)
{
- xmlrpc_client_event_loop_finish(chamelium->client);
+ igt_debug("Scheduling HPD toggle on %s in %d ms\n", port->name,
+ delay_ms);
+
+ xmlrpc_DECREF(chamelium_rpc(chamelium, NULL, "ScheduleHpdToggle",
+ "(iii)", port->id, delay_ms, rising_edge));
}
/**
diff --git a/lib/igt_chamelium.h b/lib/igt_chamelium.h
index 15f60246..81322ad2 100644
--- a/lib/igt_chamelium.h
+++ b/lib/igt_chamelium.h
@@ -61,10 +61,9 @@ void chamelium_fire_mixed_hpd_pulses(struct chamelium *chamelium,
void chamelium_fire_hpd_pulses(struct chamelium *chamelium,
struct chamelium_port *port,
int width_msec, int count);
-void chamelium_async_hpd_pulse_start(struct chamelium *chamelium,
- struct chamelium_port *port,
- bool high, int delay_secs);
-void chamelium_async_hpd_pulse_finish(struct chamelium *chamelium);
+void chamelium_schedule_hpd_toggle(struct chamelium *chamelium,
+ struct chamelium_port *port, int delay_ms,
+ bool rising_edge);
int chamelium_new_edid(struct chamelium *chamelium, const unsigned char *edid);
void chamelium_port_set_edid(struct chamelium *chamelium,
struct chamelium_port *port, int edid_id);
diff --git a/tests/chamelium.c b/tests/chamelium.c
index f1addb0f..04e7e379 100644
--- a/tests/chamelium.c
+++ b/tests/chamelium.c
@@ -226,25 +226,24 @@ try_suspend_resume_hpd(data_t *data, struct chamelium_port *port,
igt_flush_hotplugs(mon);
if (port) {
- chamelium_async_hpd_pulse_start(data->chamelium, port,
- connected,
- SUSPEND_RESUME_DELAY / 2);
+ chamelium_schedule_hpd_toggle(data->chamelium, port,
+ SUSPEND_RESUME_DELAY * 1000 / 2,
+ !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;
- chamelium_async_hpd_pulse_start(data->chamelium, port,
- connected,
- SUSPEND_RESUME_DELAY / 2);
+ chamelium_schedule_hpd_toggle(data->chamelium, port,
+ SUSPEND_RESUME_DELAY * 1000 / 2,
+ !connected);
}
port = NULL;
}
igt_system_suspend_autoresume(state, test);
- chamelium_async_hpd_pulse_finish(data->chamelium);
igt_assert(igt_hotplug_detected(mon, HOTPLUG_TIMEOUT));
if (port) {