[igt-dev] [PATCH i-g-t 2/7] lib/igt_psr: modified psr_sink_support for pr compatability

Kunal Joshi kunal1.joshi at intel.com
Fri Nov 10 07:16:19 UTC 2023


New debugfs directory for all DP connectors will be added
with below patch series https://patchwork.freedesktop.org/series/94470/

For DP Connectors
	/sys/kernel/debug/dri/0/DP-x/i915_psr_status

For eDP Connectors
	/sys/kernel/debug/dri/0/i915_edp_psr_status
			or
	/sys/kernel/debug/dri/0/eDP-x/i915_psr_status

v2: reuse psr_sink_support (Jouni)
v3: backward compatbility (Jouni)
v4: missed backward compatibilty for PSR2

Cc: Jouni Högander <jouni.hogander at intel.com>
Cc: Animesh Manna <animesh.manna at intel.com>
Cc: Arun R Murthy <arun.r.murthy at intel.com>
Signed-off-by: Kunal Joshi <kunal1.joshi at intel.com>
---
 lib/igt_psr.c                          | 58 ++++++++++++++++++--------
 lib/igt_psr.h                          |  3 +-
 tests/intel/kms_dirtyfb.c              |  2 +-
 tests/intel/kms_fbcon_fbt.c            |  4 +-
 tests/intel/kms_frontbuffer_tracking.c |  2 +-
 tests/intel/kms_pm_dc.c                |  9 ++--
 tests/intel/kms_psr.c                  |  2 +-
 tests/intel/kms_psr2_sf.c              |  3 +-
 tests/intel/kms_psr2_su.c              |  3 +-
 tests/intel/kms_psr_stress_test.c      |  2 +-
 tests/kms_feature_discovery.c          |  4 +-
 11 files changed, 61 insertions(+), 31 deletions(-)

diff --git a/lib/igt_psr.c b/lib/igt_psr.c
index 13f7c567d..41c765c9b 100644
--- a/lib/igt_psr.c
+++ b/lib/igt_psr.c
@@ -192,31 +192,55 @@ bool psr_disable(int device, int debugfs_fd)
 	return psr_set(device, debugfs_fd, -1);
 }
 
-bool psr_sink_support(int device, int debugfs_fd, enum psr_mode mode)
+bool psr_sink_support(int device, int debugfs_fd, enum psr_mode mode, igt_output_t *output)
 {
+	char *line;
+	char debugfs_file[128] = {0};
 	char buf[PSR_STATUS_MAX_LEN];
 	int ret;
 
-	ret = igt_debugfs_simple_read(debugfs_fd, "i915_edp_psr_status", buf,
+	if (output)
+		sprintf(debugfs_file, "%s/i915_psr_status", output->name);
+	else
+		sprintf(debugfs_file, "%s", "i915_edp_psr_status");
+
+	ret = igt_debugfs_simple_read(debugfs_fd, debugfs_file, buf,
 				      sizeof(buf));
 	if (ret < 1)
 		return false;
 
-	if (mode == PSR_MODE_1)
-		return strstr(buf, "Sink_Support: yes\n") ||
-		       strstr(buf, "Sink support: yes");
-	else
-		/*
-		 * i915 requires PSR version 0x03 that is PSR2 + SU with
-		 * Y-coordinate to support PSR2
-		 *
-		 * or
-		 *
-		 * PSR version 0x4 that is PSR2 + SU w/ Y-coordinate and SU
-		 * Region Early Transport to support PSR2 (eDP 1.5)
-		 */
-		return strstr(buf, "Sink support: yes [0x03]") ||
-		       strstr(buf, "Sink support: yes [0x04]");
+	line = strstr(buf, "Sink support: ");
+	if (!line)
+		return false;
+
+	switch (mode) {
+		case PSR_MODE_1:
+			return strstr(line, "PSR = yes") ||
+			       strstr(buf, "Sink_Support: yes\n") ||
+			       strstr(buf, "Sink support: yes");
+		case PSR_MODE_2:
+		case PSR_MODE_2_SEL_FETCH:
+			/*
+			 * i915 requires PSR version 0x03 that is PSR2 + SU with
+			 * Y-coordinate to support PSR2
+			 * or
+			 *
+			 * PSR version 0x4 that is PSR2 + SU w/ Y-coordinate and SU
+			 * Region Early Transport to support PSR2 (eDP 1.5)
+			 */
+			return strstr(buf, "Sink support: yes [0x03]") ||
+			       strstr(buf, "Sink support: yes [0x04]") ||
+			       (strstr(line, "PSR = yes") &&
+			       (strstr(line, "[0x03]") || strstr(line, "[0x04]")));
+		case PR_MODE:
+			return strstr(line, "Panel Replay = yes");
+		case PR_MODE_SEL_FETCH:
+			return strstr(line, "Panel Replay = yes") &&
+			       strstr(buf, "PSR2 selective fetch: enabled");
+		default:
+			igt_assert_f(false, "Invalid psr mode\n");
+			return false;
+	}
 }
 
 #define PSR2_SU_BLOCK_STR_LOOKUP "PSR2 SU blocks:\n0\t"
diff --git a/lib/igt_psr.h b/lib/igt_psr.h
index 243154897..e213b05e9 100644
--- a/lib/igt_psr.h
+++ b/lib/igt_psr.h
@@ -27,6 +27,7 @@
 #include "igt_debugfs.h"
 #include "igt_core.h"
 #include "igt_aux.h"
+#include "igt_kms.h"
 
 #define PSR_STATUS_MAX_LEN 512
 
@@ -46,7 +47,7 @@ bool psr_wait_update(int debugfs_fd, enum psr_mode mode);
 bool psr_long_wait_update(int debugfs_fd, enum psr_mode mode);
 bool psr_enable(int device, int debugfs_fd, enum psr_mode);
 bool psr_disable(int device, int debugfs_fd);
-bool psr_sink_support(int device, int debugfs_fd, enum psr_mode mode);
+bool psr_sink_support(int device, int debugfs_fd, enum psr_mode mode, igt_output_t *output);
 bool psr2_wait_su(int debugfs_fd, uint16_t *num_su_blocks);
 void psr_print_debugfs(int debugfs_fd);
 enum psr_mode psr_get_mode(int debugfs_fd);
diff --git a/tests/intel/kms_dirtyfb.c b/tests/intel/kms_dirtyfb.c
index cc9529178..f7ff1ac0b 100644
--- a/tests/intel/kms_dirtyfb.c
+++ b/tests/intel/kms_dirtyfb.c
@@ -92,7 +92,7 @@ static bool check_support(data_t *data)
 		    DRM_MODE_CONNECTOR_eDP)
 			return false;
 		return psr_sink_support(data->drm_fd, data->debugfs_fd,
-					PSR_MODE_1);
+					PSR_MODE_1, NULL);
 	case FEATURE_DRRS:
 		return intel_is_drrs_supported(data->drm_fd, data->pipe) &&
 			intel_output_has_drrs(data->drm_fd, data->output);
diff --git a/tests/intel/kms_fbcon_fbt.c b/tests/intel/kms_fbcon_fbt.c
index 8d6bb3cb6..a7f24e669 100644
--- a/tests/intel/kms_fbcon_fbt.c
+++ b/tests/intel/kms_fbcon_fbt.c
@@ -269,7 +269,7 @@ static bool psr_is_disabled(int debugfs_fd)
 
 static bool psr_supported_on_chipset(int device, int debugfs_fd)
 {
-	return psr_sink_support(device, debugfs_fd, PSR_MODE_1);
+	return psr_sink_support(device, debugfs_fd, PSR_MODE_1, NULL);
 }
 
 static bool psr_wait_until_update(struct drm_info *drm)
@@ -280,7 +280,7 @@ static bool psr_wait_until_update(struct drm_info *drm)
 static void disable_features(int device, int debugfs_fd)
 {
 	igt_set_module_param_int(device, "enable_fbc", 0);
-	if (psr_sink_support(device, debugfs_fd, PSR_MODE_1))
+	if (psr_sink_support(device, debugfs_fd, PSR_MODE_1, NULL))
 		psr_disable(device, debugfs_fd);
 }
 
diff --git a/tests/intel/kms_frontbuffer_tracking.c b/tests/intel/kms_frontbuffer_tracking.c
index be340a997..3cfa22bbf 100644
--- a/tests/intel/kms_frontbuffer_tracking.c
+++ b/tests/intel/kms_frontbuffer_tracking.c
@@ -1383,7 +1383,7 @@ static void setup_psr(void)
 		return;
 	}
 
-	if (!psr_sink_support(drm.fd, drm.debugfs, PSR_MODE_1)) {
+	if (!psr_sink_support(drm.fd, drm.debugfs, PSR_MODE_1, NULL)) {
 		igt_info("Can't test PSR: not supported by sink.\n");
 		return;
 	}
diff --git a/tests/intel/kms_pm_dc.c b/tests/intel/kms_pm_dc.c
index 1e9ca5d6c..e5daacb84 100644
--- a/tests/intel/kms_pm_dc.c
+++ b/tests/intel/kms_pm_dc.c
@@ -673,14 +673,16 @@ igt_main
 	igt_describe("In this test we make sure that system enters DC3CO "
 		     "when PSR2 is active and system is in SLEEP state");
 	igt_subtest("dc3co-vpb-simulation") {
-		igt_require(psr_sink_support(data.drm_fd, data.debugfs_fd, PSR_MODE_2));
+		igt_require(psr_sink_support(data.drm_fd, data.debugfs_fd,
+					     PSR_MODE_2, NULL));
 		test_dc3co_vpb_simulation(&data);
 	}
 
 	igt_describe("This test validates display engine entry to DC5 state "
 		     "while PSR is active");
 	igt_subtest("dc5-psr") {
-		igt_require(psr_sink_support(data.drm_fd, data.debugfs_fd, PSR_MODE_1));
+		igt_require(psr_sink_support(data.drm_fd, data.debugfs_fd,
+					     PSR_MODE_1, NULL));
 		data.op_psr_mode = PSR_MODE_1;
 		psr_enable(data.drm_fd, data.debugfs_fd, data.op_psr_mode);
 		test_dc_state_psr(&data, CHECK_DC5);
@@ -689,7 +691,8 @@ igt_main
 	igt_describe("This test validates display engine entry to DC6 state "
 		     "while PSR is active");
 	igt_subtest("dc6-psr") {
-		igt_require(psr_sink_support(data.drm_fd, data.debugfs_fd, PSR_MODE_1));
+		igt_require(psr_sink_support(data.drm_fd, data.debugfs_fd,
+					     PSR_MODE_1, NULL));
 		data.op_psr_mode = PSR_MODE_1;
 		psr_enable(data.drm_fd, data.debugfs_fd, data.op_psr_mode);
 		igt_require_f(igt_pm_pc8_plus_residencies_enabled(data.msr_fd),
diff --git a/tests/intel/kms_psr.c b/tests/intel/kms_psr.c
index ffecc5222..260095aec 100644
--- a/tests/intel/kms_psr.c
+++ b/tests/intel/kms_psr.c
@@ -433,7 +433,7 @@ static void fill_render(data_t *data, const struct igt_fb *fb,
 static bool sink_support(data_t *data, enum psr_mode mode)
 {
 	return data->with_psr_disabled ||
-	       psr_sink_support(data->drm_fd, data->debugfs_fd, mode);
+	       psr_sink_support(data->drm_fd, data->debugfs_fd, mode, NULL);
 }
 
 static bool psr_wait_entry_if_enabled(data_t *data)
diff --git a/tests/intel/kms_psr2_sf.c b/tests/intel/kms_psr2_sf.c
index d7a746211..2d05f1110 100644
--- a/tests/intel/kms_psr2_sf.c
+++ b/tests/intel/kms_psr2_sf.c
@@ -980,7 +980,8 @@ igt_main
 		kmstest_set_vt_graphics_mode();
 
 		igt_require_f(psr_sink_support(data.drm_fd,
-					       data.debugfs_fd, PSR_MODE_2),
+					       data.debugfs_fd, PSR_MODE_2,
+					       NULL),
 			      "Sink does not support PSR2\n");
 
 		display_init(&data);
diff --git a/tests/intel/kms_psr2_su.c b/tests/intel/kms_psr2_su.c
index 834fec1ec..2f89de435 100644
--- a/tests/intel/kms_psr2_su.c
+++ b/tests/intel/kms_psr2_su.c
@@ -327,7 +327,8 @@ igt_main
 		kmstest_set_vt_graphics_mode();
 
 		igt_require_f(psr_sink_support(data.drm_fd,
-					       data.debugfs_fd, PSR_MODE_2),
+					       data.debugfs_fd,
+					       PSR_MODE_2, NULL),
 			      "Sink does not support PSR2\n");
 
 		igt_require_f(intel_display_ver(intel_get_drm_devid(data.drm_fd)) < 13,
diff --git a/tests/intel/kms_psr_stress_test.c b/tests/intel/kms_psr_stress_test.c
index b6759eece..beded3b94 100644
--- a/tests/intel/kms_psr_stress_test.c
+++ b/tests/intel/kms_psr_stress_test.c
@@ -357,7 +357,7 @@ igt_main
 		kmstest_set_vt_graphics_mode();
 
 		igt_require_f(psr_sink_support(data.drm_fd, data.debugfs_fd,
-					       PSR_MODE_1),
+					       PSR_MODE_1, NULL),
 			      "Sink does not support PSR\n");
 
 		setup_output(&data);
diff --git a/tests/kms_feature_discovery.c b/tests/kms_feature_discovery.c
index 3a1f6d21d..428f97ffe 100644
--- a/tests/kms_feature_discovery.c
+++ b/tests/kms_feature_discovery.c
@@ -159,12 +159,12 @@ igt_main {
 
 		igt_describe("Make sure that we have eDP panel with PSR1 support.");
 		igt_subtest("psr1") {
-			igt_require(psr_sink_support(fd, debugfs_fd, PSR_MODE_1));
+			igt_require(psr_sink_support(fd, debugfs_fd, PSR_MODE_1, NULL));
 		}
 
 		igt_describe("Make sure that we have eDP panel with PSR2 support.");
 		igt_subtest("psr2") {
-			igt_require(psr_sink_support(fd, debugfs_fd, PSR_MODE_2));
+			igt_require(psr_sink_support(fd, debugfs_fd, PSR_MODE_2, NULL));
 		}
 
 		igt_describe("Make sure that we have DP-MST configuration.");
-- 
2.25.1



More information about the igt-dev mailing list