[Intel-gfx] [PATCH i-g-t] lib/igt_chamelium: Remove any special handling for the connector FSM

Paul Kocialkowski paul.kocialkowski at linux.intel.com
Fri Aug 4 14:10:53 UTC 2017


No specific treatment should be required for handling the connector FSM,
since the chamelium-side daemon will automatically send an HPD event to
reset the source.

The event is sufficient to make the receiver on the chamelium consider
the input as stable after it. On the other hand, toggling DPMS was found
to sometimes confuse the receiver so that it does not consider the input
as stable at any point. Doing nothing special instead works in all cases.

This issue can be witnessed with i915 when drm debugging is enabled and
leads to DP frame-related tests failing on the test farm.

Signed-off-by: Paul Kocialkowski <paul.kocialkowski at linux.intel.com>
---
 lib/igt_chamelium.c | 113 ++++++++++++----------------------------------------
 1 file changed, 25 insertions(+), 88 deletions(-)

diff --git a/lib/igt_chamelium.c b/lib/igt_chamelium.c
index dcd8855f..4cea5fdb 100644
--- a/lib/igt_chamelium.c
+++ b/lib/igt_chamelium.c
@@ -209,57 +209,13 @@ void chamelium_destroy_frame_dump(struct chamelium_frame_dump *dump)
 	free(dump);
 }
 
-struct fsm_monitor_args {
-	struct chamelium *chamelium;
-	struct chamelium_port *port;
-	struct udev_monitor *mon;
-};
-
-/*
- * Whenever resolutions or other factors change with the display output, the
- * Chamelium's display receivers need to be fully reset in order to perform any
- * frame-capturing related tasks. This requires cutting off the display then
- * turning it back on, and is indicated by the Chamelium sending hotplug events
- */
-static void *chamelium_fsm_mon(void *data)
-{
-	struct fsm_monitor_args *args = data;
-	drmModeConnector *connector;
-	int drm_fd = args->chamelium->drm_fd;
-
-	/*
-	 * Wait for the chamelium to try unplugging the connector, otherwise
-	 * the thread calling chamelium_rpc will kill us
-	 */
-	igt_hotplug_detected(args->mon, 60);
-
-	/*
-	 * Just in case the RPC call being executed returns before we complete
-	 * the FSM modesetting sequence, so we don't leave the display in a bad
-	 * state.
-	 */
-	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
-
-	igt_debug("Chamelium needs FSM, handling\n");
-	connector = chamelium_port_get_connector(args->chamelium, args->port,
-						 false);
-	kmstest_set_connector_dpms(drm_fd, connector, DRM_MODE_DPMS_OFF);
-	kmstest_set_connector_dpms(drm_fd, connector, DRM_MODE_DPMS_ON);
-
-	drmModeFreeConnector(connector);
-	return NULL;
-}
-
 static xmlrpc_value *chamelium_rpc(struct chamelium *chamelium,
-				   struct chamelium_port *fsm_port,
 				   const char *method_name,
 				   const char *format_str,
 				   ...)
 {
 	xmlrpc_value *res;
 	va_list va_args;
-	struct fsm_monitor_args monitor_args;
-	pthread_t fsm_thread_id;
 
 	/* Cleanup the last error, if any */
 	if (chamelium->env.fault_occurred) {
@@ -267,31 +223,12 @@ static xmlrpc_value *chamelium_rpc(struct chamelium *chamelium,
 		xmlrpc_env_init(&chamelium->env);
 	}
 
-	/* Unfortunately xmlrpc_client's event loop helpers are rather useless
-	 * for implementing any sort of event loop, since they provide no way
-	 * to poll for events other then the RPC response. This means in order
-	 * to handle the chamelium attempting FSM, we have to fork into another
-	 * thread and have that handle hotplugging displays
-	 */
-	if (fsm_port) {
-		monitor_args.chamelium = chamelium;
-		monitor_args.port = fsm_port;
-		monitor_args.mon = igt_watch_hotplug();
-		pthread_create(&fsm_thread_id, NULL, chamelium_fsm_mon,
-			       &monitor_args);
-	}
-
 	va_start(va_args, format_str);
 	xmlrpc_client_call2f_va(&chamelium->env, chamelium->client,
 				chamelium->url, method_name, format_str, &res,
 				va_args);
 	va_end(va_args);
 
-	if (fsm_port) {
-		pthread_cancel(fsm_thread_id);
-		igt_cleanup_hotplug(monitor_args.mon);
-	}
-
 	igt_assert_f(!chamelium->env.fault_occurred,
 		     "Chamelium RPC call failed: %s\n",
 		     chamelium->env.fault_string);
@@ -310,7 +247,7 @@ static xmlrpc_value *chamelium_rpc(struct chamelium *chamelium,
 void chamelium_plug(struct chamelium *chamelium, struct chamelium_port *port)
 {
 	igt_debug("Plugging %s\n", port->name);
-	xmlrpc_DECREF(chamelium_rpc(chamelium, NULL, "Plug", "(i)", port->id));
+	xmlrpc_DECREF(chamelium_rpc(chamelium, "Plug", "(i)", port->id));
 }
 
 /**
@@ -324,7 +261,7 @@ void chamelium_plug(struct chamelium *chamelium, struct chamelium_port *port)
 void chamelium_unplug(struct chamelium *chamelium, struct chamelium_port *port)
 {
 	igt_debug("Unplugging port %s\n", port->name);
-	xmlrpc_DECREF(chamelium_rpc(chamelium, NULL, "Unplug", "(i)",
+	xmlrpc_DECREF(chamelium_rpc(chamelium, "Unplug", "(i)",
 				    port->id));
 }
 
@@ -344,7 +281,7 @@ bool chamelium_is_plugged(struct chamelium *chamelium,
 	xmlrpc_value *res;
 	xmlrpc_bool is_plugged;
 
-	res = chamelium_rpc(chamelium, NULL, "IsPlugged", "(i)", port->id);
+	res = chamelium_rpc(chamelium, "IsPlugged", "(i)", port->id);
 
 	xmlrpc_read_bool(&chamelium->env, res, &is_plugged);
 	xmlrpc_DECREF(res);
@@ -373,7 +310,7 @@ bool chamelium_port_wait_video_input_stable(struct chamelium *chamelium,
 
 	igt_debug("Waiting for video input to stabalize on %s\n", port->name);
 
-	res = chamelium_rpc(chamelium, port, "WaitVideoInputStable", "(ii)",
+	res = chamelium_rpc(chamelium, "WaitVideoInputStable", "(ii)",
 			    port->id, timeout_secs);
 
 	xmlrpc_read_bool(&chamelium->env, res, &is_on);
@@ -413,7 +350,7 @@ void chamelium_fire_hpd_pulses(struct chamelium *chamelium,
 	for (i = 0; i < count; i++)
 		xmlrpc_array_append_item(&chamelium->env, pulse_widths, width);
 
-	xmlrpc_DECREF(chamelium_rpc(chamelium, NULL, "FireMixedHpdPulses",
+	xmlrpc_DECREF(chamelium_rpc(chamelium, "FireMixedHpdPulses",
 				    "(iA)", port->id, pulse_widths));
 
 	xmlrpc_DECREF(width);
@@ -446,7 +383,7 @@ void chamelium_fire_mixed_hpd_pulses(struct chamelium *chamelium,
 	}
 	va_end(args);
 
-	xmlrpc_DECREF(chamelium_rpc(chamelium, NULL, "FireMixedHpdPulses",
+	xmlrpc_DECREF(chamelium_rpc(chamelium, "FireMixedHpdPulses",
 				    "(iA)", port->id, pulse_widths));
 
 	xmlrpc_DECREF(pulse_widths);
@@ -470,7 +407,7 @@ void chamelium_schedule_hpd_toggle(struct chamelium *chamelium,
 	igt_debug("Scheduling HPD toggle on %s in %d ms\n", port->name,
 		  delay_ms);
 
-	xmlrpc_DECREF(chamelium_rpc(chamelium, NULL, "ScheduleHpdToggle",
+	xmlrpc_DECREF(chamelium_rpc(chamelium, "ScheduleHpdToggle",
 				    "(iii)", port->id, delay_ms, rising_edge));
 }
 
@@ -490,7 +427,7 @@ int chamelium_new_edid(struct chamelium *chamelium, const unsigned char *edid)
 	struct chamelium_edid *allocated_edid;
 	int edid_id;
 
-	res = chamelium_rpc(chamelium, NULL, "CreateEdid", "(6)",
+	res = chamelium_rpc(chamelium, "CreateEdid", "(6)",
 			    edid, EDID_LENGTH);
 
 	xmlrpc_read_int(&chamelium->env, res, &edid_id);
@@ -512,7 +449,7 @@ int chamelium_new_edid(struct chamelium *chamelium, const unsigned char *edid)
 
 static void chamelium_destroy_edid(struct chamelium *chamelium, int edid_id)
 {
-	xmlrpc_DECREF(chamelium_rpc(chamelium, NULL, "DestroyEdid", "(i)",
+	xmlrpc_DECREF(chamelium_rpc(chamelium, "DestroyEdid", "(i)",
 				    edid_id));
 }
 
@@ -532,7 +469,7 @@ static void chamelium_destroy_edid(struct chamelium *chamelium, int edid_id)
 void chamelium_port_set_edid(struct chamelium *chamelium,
 			     struct chamelium_port *port, int edid_id)
 {
-	xmlrpc_DECREF(chamelium_rpc(chamelium, NULL, "ApplyEdid", "(ii)",
+	xmlrpc_DECREF(chamelium_rpc(chamelium, "ApplyEdid", "(ii)",
 				    port->id, edid_id));
 }
 
@@ -554,7 +491,7 @@ void chamelium_port_set_ddc_state(struct chamelium *chamelium,
 	igt_debug("%sabling DDC bus on %s\n",
 		  enabled ? "En" : "Dis", port->name);
 
-	xmlrpc_DECREF(chamelium_rpc(chamelium, NULL, "SetDdcState", "(ib)",
+	xmlrpc_DECREF(chamelium_rpc(chamelium, "SetDdcState", "(ib)",
 				    port->id, enabled));
 }
 
@@ -574,7 +511,7 @@ bool chamelium_port_get_ddc_state(struct chamelium *chamelium,
 	xmlrpc_value *res;
 	xmlrpc_bool enabled;
 
-	res = chamelium_rpc(chamelium, NULL, "IsDdcEnabled", "(i)", port->id);
+	res = chamelium_rpc(chamelium, "IsDdcEnabled", "(i)", port->id);
 	xmlrpc_read_bool(&chamelium->env, res, &enabled);
 
 	xmlrpc_DECREF(res);
@@ -599,7 +536,7 @@ void chamelium_port_get_resolution(struct chamelium *chamelium,
 {
 	xmlrpc_value *res, *res_x, *res_y;
 
-	res = chamelium_rpc(chamelium, port, "DetectResolution", "(i)",
+	res = chamelium_rpc(chamelium, "DetectResolution", "(i)",
 			    port->id);
 
 	xmlrpc_array_read_item(&chamelium->env, res, 0, &res_x);
@@ -617,7 +554,7 @@ static void chamelium_get_captured_resolution(struct chamelium *chamelium,
 {
 	xmlrpc_value *res, *res_w, *res_h;
 
-	res = chamelium_rpc(chamelium, NULL, "GetCapturedResolution", "()");
+	res = chamelium_rpc(chamelium, "GetCapturedResolution", "()");
 
 	xmlrpc_array_read_item(&chamelium->env, res, 0, &res_w);
 	xmlrpc_array_read_item(&chamelium->env, res, 1, &res_h);
@@ -680,7 +617,7 @@ struct chamelium_frame_dump *chamelium_port_dump_pixels(struct chamelium *chamel
 	xmlrpc_value *res;
 	struct chamelium_frame_dump *frame;
 
-	res = chamelium_rpc(chamelium, port, "DumpPixels",
+	res = chamelium_rpc(chamelium, "DumpPixels",
 			    (w && h) ? "(iiiii)" : "(innnn)",
 			    port->id, x, y, w, h);
 	chamelium->capturing_port = port;
@@ -742,7 +679,7 @@ igt_crc_t *chamelium_get_crc_for_area(struct chamelium *chamelium,
 	xmlrpc_value *res;
 	igt_crc_t *ret = malloc(sizeof(igt_crc_t));
 
-	res = chamelium_rpc(chamelium, port, "ComputePixelChecksum",
+	res = chamelium_rpc(chamelium, "ComputePixelChecksum",
 			    (w && h) ? "(iiiii)" : "(innnn)",
 			    port->id, x, y, w, h);
 	chamelium->capturing_port = port;
@@ -780,7 +717,7 @@ igt_crc_t *chamelium_get_crc_for_area(struct chamelium *chamelium,
 void chamelium_start_capture(struct chamelium *chamelium,
 			     struct chamelium_port *port, int x, int y, int w, int h)
 {
-	xmlrpc_DECREF(chamelium_rpc(chamelium, port, "StartCapturingVideo",
+	xmlrpc_DECREF(chamelium_rpc(chamelium, "StartCapturingVideo",
 				    (w && h) ? "(iiiii)" : "(innnn)",
 				    port->id, x, y, w, h));
 	chamelium->capturing_port = port;
@@ -798,7 +735,7 @@ void chamelium_start_capture(struct chamelium *chamelium,
  */
 void chamelium_stop_capture(struct chamelium *chamelium, int frame_count)
 {
-	xmlrpc_DECREF(chamelium_rpc(chamelium, NULL, "StopCapturingVideo",
+	xmlrpc_DECREF(chamelium_rpc(chamelium, "StopCapturingVideo",
 				    "(i)", frame_count));
 }
 
@@ -829,7 +766,7 @@ void chamelium_stop_capture(struct chamelium *chamelium, int frame_count)
 void chamelium_capture(struct chamelium *chamelium, struct chamelium_port *port,
 		       int x, int y, int w, int h, int frame_count)
 {
-	xmlrpc_DECREF(chamelium_rpc(chamelium, port, "CaptureVideo",
+	xmlrpc_DECREF(chamelium_rpc(chamelium, "CaptureVideo",
 				    (w && h) ? "(iiiiii)" : "(iinnnn)",
 				    port->id, frame_count, x, y, w, h));
 	chamelium->capturing_port = port;
@@ -851,7 +788,7 @@ igt_crc_t *chamelium_read_captured_crcs(struct chamelium *chamelium,
 	xmlrpc_value *res, *elem;
 	int i;
 
-	res = chamelium_rpc(chamelium, NULL, "GetCapturedChecksums", "(in)", 0);
+	res = chamelium_rpc(chamelium, "GetCapturedChecksums", "(in)", 0);
 
 	*frame_count = xmlrpc_array_size(&chamelium->env, res);
 	ret = calloc(sizeof(igt_crc_t), *frame_count);
@@ -887,7 +824,7 @@ struct chamelium_frame_dump *chamelium_read_captured_frame(struct chamelium *cha
 	xmlrpc_value *res;
 	struct chamelium_frame_dump *frame;
 
-	res = chamelium_rpc(chamelium, NULL, "ReadCapturedFrame", "(i)", index);
+	res = chamelium_rpc(chamelium, "ReadCapturedFrame", "(i)", index);
 	frame = frame_from_xml(chamelium, res);
 	xmlrpc_DECREF(res);
 
@@ -908,7 +845,7 @@ int chamelium_get_captured_frame_count(struct chamelium *chamelium)
 	xmlrpc_value *res;
 	int ret;
 
-	res = chamelium_rpc(chamelium, NULL, "GetCapturedFrameCount", "()");
+	res = chamelium_rpc(chamelium, "GetCapturedFrameCount", "()");
 	xmlrpc_read_int(&chamelium->env, res, &ret);
 
 	xmlrpc_DECREF(res);
@@ -1231,7 +1168,7 @@ int chamelium_get_frame_limit(struct chamelium *chamelium,
 	if (!w && !h)
 		chamelium_port_get_resolution(chamelium, port, &w, &h);
 
-	res = chamelium_rpc(chamelium, port, "GetMaxFrameLimit", "(iii)",
+	res = chamelium_rpc(chamelium, "GetMaxFrameLimit", "(iii)",
 			    port->id, w, h);
 
 	xmlrpc_read_int(&chamelium->env, res, &ret);
@@ -1383,7 +1320,7 @@ static unsigned int chamelium_get_port_type(struct chamelium *chamelium,
 	const char *port_type_str;
 	unsigned int port_type;
 
-	res = chamelium_rpc(chamelium, NULL, "GetConnectorType",
+	res = chamelium_rpc(chamelium, "GetConnectorType",
 			    "(i)", port->id);
 
 	xmlrpc_read_string(&chamelium->env, res, &port_type_str);
@@ -1524,7 +1461,7 @@ static bool chamelium_read_config(struct chamelium *chamelium, int drm_fd)
 void chamelium_reset(struct chamelium *chamelium)
 {
 	igt_debug("Resetting the chamelium\n");
-	xmlrpc_DECREF(chamelium_rpc(chamelium, NULL, "Reset", "()"));
+	xmlrpc_DECREF(chamelium_rpc(chamelium, "Reset", "()"));
 }
 
 static void chamelium_exit_handler(int sig)
-- 
2.13.3



More information about the Intel-gfx mailing list