[igt-dev] [PATCH i-g-t v2] tests/kms_dp_dsc: Force a full modeset when we force dsc enable

Manasi Navare manasi.d.navare at intel.com
Fri Apr 5 22:55:49 UTC 2019


DSC enable gets configured during compute_config and needs
a full modeset to force DSC.
Sometimes in between the tests, if the initial output is same as the
mode being set for DSC then it will not do a full modeset.
So we disable the output before forcing a mode with DSC enable.

You need the kernel patch:
https://patchwork.freedesktop.org/series/59084/

v2:
* Restore the value of force dsc enable after the test and in igt_exit_handler
* Add igt_install_exit_handler to restore values on fail/exit

Fixes: db19bccc1c22 ("test/kms_dp_dsc: Basic KMS test to validate VESA DSC on DP/eDP")
Cc: Petri Latvala <petri.latvala at intel.com>
Cc: Anusha Srivatsa <anusha.srivatsa at intel.com>
Cc: Imre Deak <imre.deak at intel.com>
Signed-off-by: Manasi Navare <manasi.d.navare at intel.com>
---
 tests/kms_dp_dsc.c | 133 +++++++++++++++++++++++++++------------------
 1 file changed, 81 insertions(+), 52 deletions(-)

diff --git a/tests/kms_dp_dsc.c b/tests/kms_dp_dsc.c
index da93cd74..acaee890 100644
--- a/tests/kms_dp_dsc.c
+++ b/tests/kms_dp_dsc.c
@@ -63,119 +63,147 @@ typedef struct {
 	int crtc;
 	enum pipe pipe;
 	char conn_name[128];
+	bool force_dsc_en;
 } data_t;
 
+data_t data = {};
+
 static inline void manual(const char *expected)
 {
 	igt_debug_manual_check("all", expected);
 }
 
-static bool is_dp_dsc_supported(data_t *data)
+static bool is_dp_dsc_supported(void)
 {
 	char file_name[128] = {0};
 	char buf[512];
 
-	strcpy(file_name, data->conn_name);
+	strcpy(file_name, data.conn_name);
 	strcat(file_name, "/i915_dsc_fec_support");
-	igt_require(igt_debugfs_simple_read(data->debugfs_fd, file_name, buf,
+	igt_require(igt_debugfs_simple_read(data.debugfs_fd, file_name, buf,
 					    sizeof(buf)) > 0);
-	igt_debugfs_read(data->drm_fd, file_name, buf);
+	igt_debugfs_read(data.drm_fd, file_name, buf);
 
 	return strstr(buf, "DSC_Sink_Support: yes");
 }
 
-static bool is_dp_fec_supported(data_t *data)
+static bool is_dp_fec_supported(void)
 {
 	char file_name[128] = {0};
 	char buf[512];
 
-	strcpy(file_name, data->conn_name);
+	strcpy(file_name, data.conn_name);
 	strcat(file_name, "/i915_dsc_fec_support");
-	igt_debugfs_read(data->drm_fd, file_name, buf);
+	igt_debugfs_read(data.drm_fd, file_name, buf);
 
 	return strstr(buf, "FEC_Sink_Support: yes");
 }
 
-static bool is_dp_dsc_enabled(data_t *data)
+static bool is_dp_dsc_enabled(void)
 {
 	char file_name[128] = {0};
 	char buf[512];
 
-	strcpy(file_name, data->conn_name);
+	strcpy(file_name, data.conn_name);
 	strcat(file_name, "/i915_dsc_fec_support");
-	igt_debugfs_read(data->drm_fd, file_name, buf);
+	igt_debugfs_read(data.drm_fd, file_name, buf);
 
 	return strstr(buf, "DSC_Enabled: yes");
 }
 
-static void force_dp_dsc_enable(data_t *data)
+static bool is_force_dsc_enabled(void)
+{
+	char file_name[128] = {0};
+	char buf[512];
+
+	strcpy(file_name, data.conn_name);
+	strcat(file_name, "/i915_dsc_fec_support");
+	igt_debugfs_read(data.drm_fd, file_name, buf);
+
+	return strstr(buf, "Force_DSC_Enable: yes");
+}
+
+static void force_dp_dsc_enable(void)
 {
 	char file_name[128] = {0};
 	int ret;
 
-	strcpy(file_name, data->conn_name);
+	strcpy(file_name, data.conn_name);
 	strcat(file_name, "/i915_dsc_fec_support");
-	igt_debug ("Forcing DSC enable on %s\n", data->conn_name);
-	ret = igt_sysfs_write(data->debugfs_fd, file_name, "1", 1);
+	igt_debug ("Forcing DSC enable on %s\n", data.conn_name);
+	ret = igt_sysfs_write(data.debugfs_fd, file_name, "1", 1);
 	igt_assert_f(ret > 0, "debugfs_write failed");
 }
 
-static void clear_dp_dsc_enable(data_t *data)
+static void restore_dp_dsc_enable(void)
 {
 	char file_name[128] = {0};
 	int ret;
 
-	strcpy(file_name, data->conn_name);
+	strcpy(file_name, data.conn_name);
 	strcat(file_name, "/i915_dsc_fec_support");
-	igt_debug ("Clearing DSC enable on %s\n", data->conn_name);
-	ret = igt_sysfs_write(data->debugfs_fd, file_name, "0", 1);
+	igt_debug ("Restoring DSC enable on %s\n", data.conn_name);
+	ret = igt_sysfs_write(data.debugfs_fd, file_name,
+			      data.force_dsc_en ? "1" : "0", 1);
 	igt_assert_f(ret > 0, "debugfs_write failed");
 }
 
-static void test_cleanup(data_t *data) {
+static void test_cleanup(void) {
 	igt_plane_t *primary;
 
-	if (data->output) {
-		primary = igt_output_get_plane_type(data->output,
+	if (data.output) {
+		primary = igt_output_get_plane_type(data.output,
 						    DRM_PLANE_TYPE_PRIMARY);
 		igt_plane_set_fb(primary, NULL);
-		igt_display_commit(&data->display);
-		igt_remove_fb(data->drm_fd, &data->fb_test_pattern);
+		igt_display_commit(&data.display);
+		igt_remove_fb(data.drm_fd, &data.fb_test_pattern);
 	}
 }
 
+static void kms_dp_dsc_exit_handler(int sig) {
+
+	restore_dp_dsc_enable();
+}
+
 
 /*
  * Re-probe connectors and do a modeset with DSC
  *
  */
-static void update_display(data_t *data, enum dsc_test_type test_type)
+static void update_display(enum dsc_test_type test_type)
 {
 	igt_plane_t *primary;
-	data->mode = igt_output_get_mode(data->output);
-	data->connector = data->output->config.connector;
+	data.mode = igt_output_get_mode(data.output);
+	data.connector = data.output->config.connector;
 
-	if (data->connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort &&
-	    data->pipe == PIPE_A) {
+	if (data.connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort &&
+	    data.pipe == PIPE_A) {
 		igt_debug("DSC not supported on Pipe A on external DP\n");
 		return;
 	}
 
+	/* Disable the output first */
+	igt_output_set_pipe(data.output, PIPE_NONE);
+	igt_display_commit(&data.display);
+
 	if (test_type == test_basic_dsc_enable) {
 		bool enabled;
 
-		igt_debug("DSC is supported on %s\n", data->conn_name);
-		force_dp_dsc_enable(data);
+		igt_debug("DSC is supported on %s\n", data.conn_name);
+		force_dp_dsc_enable();
 
-		igt_create_pattern_fb(data->drm_fd, data->mode->hdisplay,
-				      data->mode->vdisplay,
+		igt_output_set_pipe(data.output, data.pipe);
+		igt_create_pattern_fb(data.drm_fd, data.mode->hdisplay,
+				      data.mode->vdisplay,
 				      DRM_FORMAT_XRGB8888,
 				      LOCAL_DRM_FORMAT_MOD_NONE,
-				      &data->fb_test_pattern);
-		primary = igt_output_get_plane_type(data->output,
+				      &data.fb_test_pattern);
+		primary = igt_output_get_plane_type(data.output,
 						    DRM_PLANE_TYPE_PRIMARY);
-		igt_plane_set_fb(primary, &data->fb_test_pattern);
-		igt_display_commit(&data->display);
+
+		/* Now set the output to the desired mode */
+		igt_plane_set_fb(primary, &data.fb_test_pattern);
+		igt_display_commit(&data.display);
 
 		/*
 		 * Until we have CRC check support, manually check if RGB test
@@ -183,38 +211,37 @@ static void update_display(data_t *data, enum dsc_test_type test_type)
 		 */
 		manual("RGB test pattern without corruption");
 
-		enabled = is_dp_dsc_enabled(data);
-		clear_dp_dsc_enable(data);
+		enabled = is_dp_dsc_enabled();
+		restore_dp_dsc_enable();
 
 		igt_assert_f(enabled,
-			     "Default DSC enable failed on Connector: %s Pipe: %s",
-			     data->conn_name,
-			     kmstest_pipe_name(data->pipe));
+			     "Default DSC enable failed on Connector: %s Pipe: %s\n",
+			     data.conn_name,
+			     kmstest_pipe_name(data.pipe));
 	} else {
 		igt_assert(!"Unknown test type\n");
 	}
 }
 
-static void run_test(data_t *data, igt_output_t *output,
+static void run_test(igt_output_t *output,
 		     enum dsc_test_type test_type)
 {
 	enum pipe pipe;
 
-	for_each_pipe(&data->display, pipe) {
+	for_each_pipe(&data.display, pipe) {
 
 		if (igt_pipe_connector_valid(pipe, output)) {
-			igt_output_set_pipe(output, pipe);
-			data->pipe = pipe;
-			data->output = output;
-			update_display(data, test_type);
-			test_cleanup(data);
+			data.pipe = pipe;
+			data.output = output;
+			update_display(test_type);
+			test_cleanup();
 		}
 	}
 }
 
 igt_main
 {
-	data_t data = {};
+	//data_t data = {};
 	igt_output_t *output;
 	drmModeRes *res;
 	drmModeConnector *connector;
@@ -225,6 +252,7 @@ igt_main
 		data.drm_fd = drm_open_driver_master(DRIVER_ANY);
 		data.debugfs_fd = igt_debugfs_dir(data.drm_fd);
 		kmstest_set_vt_graphics_mode();
+		igt_install_exit_handler(kms_dp_dsc_exit_handler);
 		igt_display_require(&data.display, data.drm_fd);
 		igt_require(res = drmModeGetResources(data.drm_fd));
 	}
@@ -245,19 +273,20 @@ igt_main
 				sprintf(data.conn_name, "%s-%d",
 					kmstest_connector_type_str(connector->connector_type),
 					connector->connector_type_id);
-				if(!is_dp_dsc_supported(&data)) {
+				if(!is_dp_dsc_supported()) {
 					igt_debug("DSC not supported on connector %s \n",
 						  data.conn_name);
 					continue;
 				}
 				if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort &&
-				    !is_dp_fec_supported(&data)) {
+				    !is_dp_fec_supported()) {
 					igt_debug("DSC cannot be enabled without FEC on %s\n",
 						  data.conn_name);
 					continue;
 				}
 				test_conn_cnt++;
-				run_test(&data, output, test_basic_dsc_enable);
+				data.force_dsc_en = is_force_dsc_enabled();
+				run_test(output, test_basic_dsc_enable);
 			}
 			igt_skip_on(test_conn_cnt == 0);
 		}
-- 
2.19.1



More information about the igt-dev mailing list