[igt-dev] [PATCH i-g-t v7 3/5] DEBUG: invoke powertop and pmc ltr_ignore when pc8 tests fails.

Anshuman Gupta anshuman.gupta at intel.com
Tue Jun 4 17:55:59 UTC 2019


When pc8_residency test fails, try pc8 residency subtest after
setting powertop --auto-tune and further try sub-test with
pmc ltr_ignore attributes.

Signed-off-by: Anshuman Gupta <anshuman.gupta at intel.com>
---
 tests/i915/i915_pm_rpm.c | 130 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 129 insertions(+), 1 deletion(-)

diff --git a/tests/i915/i915_pm_rpm.c b/tests/i915/i915_pm_rpm.c
index 6ebbb30a..0c9a7890 100644
--- a/tests/i915/i915_pm_rpm.c
+++ b/tests/i915/i915_pm_rpm.c
@@ -99,6 +99,37 @@ int drm_fd, msr_fd, pc8_status_fd;
 int debugfs;
 bool has_runtime_pm, has_pc8, pc8_needs_screen_off;
 struct mode_set_data ms_data;
+int pmc_debugfs, max_ltr;
+bool pmc_loaded;
+
+#define ICL_MAX_LTR 20
+#define CNL_MAX_LTR 19
+#define SKL_MAX_LTR 17
+#define SIZE_PCH_IP_ARR 21
+
+const char *pch_ip[SIZE_PCH_IP_ARR] = {
+	"SOUTHPORT_A",
+	"SOUTHPORT_B",
+	"SATA",
+	"GIGABIT_ETHERNET",
+	"XHCI",
+	"Reserved",
+	"ME",
+	"EVA",
+	"SOUTHPORT_C",
+	"HD_AUDIO",
+	"CNV",
+	"LPSS",
+	"SOUTHPORT_D",
+	"SOUTHPORT_E",
+	"CAMERA",
+	"ESPI",
+	"SCC",
+	"ISH",
+	"UFSX2",
+	"EMMC",
+	"WIGIG"
+};
 
 /* Stuff used when creating FBs and mode setting. */
 struct mode_set_data {
@@ -776,6 +807,69 @@ static void setup_pc8(void)
 	has_pc8 = true;
 }
 
+static void pmc_ignore_ltr(int ip)
+{
+	char tmp[10];
+	int len, fd;
+
+	if (!pmc_loaded)
+		return;
+
+	len = snprintf(tmp, sizeof(tmp), "%d", ip);
+	fd = openat(pmc_debugfs, "ltr_ignore", O_WRONLY);
+	if (fd >= 0) {
+		igt_assert_eq(write(fd, tmp, len), len);
+		close(fd);
+	}
+}
+
+static bool setup_powertop(void)
+{
+	FILE *fp;
+	char tmp[512];
+
+	fp = popen("powertop --auto-tune", "r");
+	if (fp == NULL) {
+		igt_info("Failed to run powertop\n");
+		perror("popen");
+		return false;
+	}
+
+	while (fgets(tmp, sizeof(tmp), fp) != NULL)
+		igt_info("%s\n", tmp);
+
+	pclose(fp);
+	return true;
+}
+
+static bool setup_pmc(void)
+{
+	const char *debugfs_root;
+	char path[200];
+
+	/* Make sure our intel_pmc_core module is loaded. */
+	pmc_loaded = modprobe("intel_pmc_core") == 0;
+
+	if (!pmc_loaded) {
+		igt_info("intel_pmc_core module not loaded\n");
+		return;
+	}
+
+	if (IS_ICELAKE(ms_data.devid))
+		max_ltr = ICL_MAX_LTR;
+	else if (IS_CANNONLAKE(ms_data.devid))
+		max_ltr = CNL_MAX_LTR;
+	else if (AT_LEAST_GEN(ms_data.devid, 9) && !IS_BROXTON(ms_data.devid) &&
+		 !IS_GEMINILAKE(ms_data.devid))
+		max_ltr = SKL_MAX_LTR;
+
+	debugfs_root = igt_debugfs_mount();
+	igt_assert(debugfs_root);
+	snprintf(path, sizeof(path), "%s/pmc_core", debugfs_root);
+	pmc_debugfs = open(path, O_RDONLY);
+	igt_require(pmc_debugfs != -1);
+}
+
 static bool dmc_loaded(void)
 {
 	char buf[15];
@@ -803,6 +897,14 @@ static void dump_file(int dir, const char *filename)
 	free(contents);
 }
 
+static void pmc_dump_file(int fd, const char *file)
+{
+	if (!pmc_loaded)
+		return;
+
+	dump_file(fd, file);
+}
+
 static bool setup_environment(void)
 {
 	if (has_runtime_pm)
@@ -820,6 +922,7 @@ static bool setup_environment(void)
 	pm_data = igt_pm_enable_sata_link_power_management();
 
 	has_runtime_pm = igt_setup_runtime_pm();
+	setup_pmc();
 	setup_pc8();
 
 	igt_info("Runtime PM support: %d\n", has_runtime_pm);
@@ -865,11 +968,36 @@ static void basic_subtest(void)
 
 static void pc8_residency_subtest(void)
 {
+	bool passed;
+	int i;
 	igt_require(has_pc8);
 
 	/* Make sure PC8+ residencies move! */
 	disable_all_screens(&ms_data);
-	igt_assert_f(pc8_plus_residency_changed(30),
+	passed = pc8_plus_residency_changed(30);
+
+	/* Try With powertop --auto-tune */
+	if (!passed) {
+		igt_info("pc8+ residencies byyefore powertop --auto-tune\n");
+		pmc_dump_file(pmc_debugfs, "package_cstate_show");
+		igt_require(setup_powertop());
+		passed = pc8_plus_residency_changed(IGT_TIME_OUT_SEC_10);
+
+		if (!passed) {
+			igt_info("pc8+ residencies after powertop --auto-tune\n");
+			pmc_dump_file(pmc_debugfs, "package_cstate_show");
+		} else {
+			igt_info("pc8+ residencies subtest passed "
+				 "after running powertop --auto-tune\n");
+		}
+	}
+	/* dump ltr_show and pch_ip_power_gating_status */
+	igt_info("pch i/p latency tolerance reporting\n");
+	pmc_dump_file(pmc_debugfs, "ltr_show");
+	igt_info("pch i/p power gating status\n");
+	pmc_dump_file(pmc_debugfs, "pch_ip_power_gating_status");
+
+	igt_assert_f(passed,
 		     "Machine is not reaching PC8+ states, please check its "
 		     "configuration.\n");
 
-- 
2.21.0



More information about the igt-dev mailing list