Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Stuart Summers <stuart.summers@intel.com>
Cc: igt-dev@lists.freedesktop.org, rodrigo.vivi@intel.com,
	matthew.brost@intel.com, umesh.nerlige.ramappa@intel.com,
	Michal.Wajdeczko@intel.com, matthew.d.roper@intel.com,
	daniele.ceraolospurio@intel.com, shuicheng.lin@intel.com,
	Stuart Summers <stuart.summers@intel.com>
Subject: [PATCH i-g-t 2/2] tests/intel/xe_configfs: Add coverage for GuC log configfs entries
Date: Fri, 21 Aug 2026 19:23:33 +0000	[thread overview]
Message-ID: <20260821192332.19060-6-stuart.summers@intel.com> (raw)
In-Reply-To: <20260821192332.19060-4-stuart.summers@intel.com>

Cover the new guc_log_level and guc_log_target debug configfs
attributes: default values, the full range of accepted values, values
that must be rejected, and rejection with -EBUSY while the device is
bound.

Signed-off-by: Stuart Summers <stuart.summers@intel.com>
Assisted-by: Copilot:claude-opus-5
---
 tests/intel/xe_configfs.c | 181 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 181 insertions(+)

diff --git a/tests/intel/xe_configfs.c b/tests/intel/xe_configfs.c
index c537e5d69..c036a805e 100644
--- a/tests/intel/xe_configfs.c
+++ b/tests/intel/xe_configfs.c
@@ -365,6 +365,142 @@ static void test_ctx_restore(int configfs_debug_fd, const char *type,
 	}
 }
 
+/* Values accepted by the guc_log_level attribute: -1 (unset) and 0..5 */
+#define XE_GUC_LOG_LEVEL_UNSET	-1
+#define GUC_LOG_LEVEL_MAX	5
+
+/* Values accepted by the guc_log_target attribute: memory, NPK and both */
+#define GUC_LOG_TARGET_MEM	0
+#define GUC_LOG_TARGET_MAX	2
+
+static void assert_attr_eq(int configfs_debug_fd, const char *attr, int expected)
+{
+	int value;
+
+	igt_assert_f(igt_sysfs_scanf(configfs_debug_fd, attr, "%d", &value) == 1,
+		     "Failed to read %s\n", attr);
+	igt_assert_f(value == expected, "Expecting %s=%d but found %d\n",
+		     attr, expected, value);
+}
+
+static void set_attr_and_verify(int configfs_debug_fd, const char *attr, int value)
+{
+	char buf[16];
+
+	snprintf(buf, sizeof(buf), "%d", value);
+
+	igt_debug("Writing '%s' to %s\n", buf, attr);
+	igt_assert_f(igt_sysfs_set(configfs_debug_fd, attr, buf),
+		     "Writing '%s' to %s failed\n", buf, attr);
+	assert_attr_eq(configfs_debug_fd, attr, value);
+}
+
+static void test_attr_invalid(int configfs_debug_fd, const char *attr,
+			      const char * const *values, size_t nvalues,
+			      int unchanged)
+{
+	for (size_t i = 0; i < nvalues; i++) {
+		const char *v = values[i];
+
+		igt_debug("Writing '%s' to %s\n", v, attr);
+		igt_assert_f(!igt_sysfs_set(configfs_debug_fd, attr, v),
+			     "Writing '%s' to %s should have failed\n", v, attr);
+		assert_attr_eq(configfs_debug_fd, attr, unchanged);
+	}
+}
+
+/**
+ * SUBTEST: guc-log-level
+ * Description: Validate guc_log_level attribute
+ */
+static void test_guc_log_level(int configfs_debug_fd)
+{
+	/*
+	 * The attribute can only be changed while the device is unbound, so
+	 * make sure there's no device bound.
+	 */
+	igt_audio_driver_unload(NULL);
+	igt_kmod_unbind("xe", bus_addr);
+
+	/* Default is 'unset': the guc_log_level modparam is used instead */
+	assert_attr_eq(configfs_debug_fd, "guc_log_level", XE_GUC_LOG_LEVEL_UNSET);
+
+	for (int level = XE_GUC_LOG_LEVEL_UNSET; level <= GUC_LOG_LEVEL_MAX; level++)
+		set_attr_and_verify(configfs_debug_fd, "guc_log_level", level);
+
+	/* Restore the default and make sure the driver still probes */
+	set_attr_and_verify(configfs_debug_fd, "guc_log_level", XE_GUC_LOG_LEVEL_UNSET);
+	igt_assert_eq(igt_kmod_bind("xe", bus_addr), 0);
+}
+
+/**
+ * SUBTEST: guc-log-level-invalid
+ * Description: Validate guc_log_level attribute for invalid values
+ */
+static void test_guc_log_level_invalid(int configfs_debug_fd)
+{
+	static const char * const values[] = {
+		"-2", "6", "100", "abc", "1a", "",
+	};
+
+	igt_audio_driver_unload(NULL);
+	igt_kmod_unbind("xe", bus_addr);
+
+	test_attr_invalid(configfs_debug_fd, "guc_log_level", values,
+			  ARRAY_SIZE(values), XE_GUC_LOG_LEVEL_UNSET);
+}
+
+/**
+ * SUBTEST: guc-log-target
+ * Description: Validate guc_log_target attribute
+ */
+static void test_guc_log_target(int configfs_debug_fd)
+{
+	igt_audio_driver_unload(NULL);
+	igt_kmod_unbind("xe", bus_addr);
+
+	/* Default is to log to memory only */
+	assert_attr_eq(configfs_debug_fd, "guc_log_target", GUC_LOG_TARGET_MEM);
+
+	for (int target = GUC_LOG_TARGET_MEM; target <= GUC_LOG_TARGET_MAX; target++)
+		set_attr_and_verify(configfs_debug_fd, "guc_log_target", target);
+
+	/* Restore the default and make sure the driver still probes */
+	set_attr_and_verify(configfs_debug_fd, "guc_log_target", GUC_LOG_TARGET_MEM);
+	igt_assert_eq(igt_kmod_bind("xe", bus_addr), 0);
+}
+
+/**
+ * SUBTEST: guc-log-target-invalid
+ * Description: Validate guc_log_target attribute for invalid values
+ */
+static void test_guc_log_target_invalid(int configfs_debug_fd)
+{
+	static const char * const values[] = {
+		"-1", "3", "256", "abc", "1a", "",
+	};
+
+	igt_audio_driver_unload(NULL);
+	igt_kmod_unbind("xe", bus_addr);
+
+	test_attr_invalid(configfs_debug_fd, "guc_log_target", values,
+			  ARRAY_SIZE(values), GUC_LOG_TARGET_MEM);
+}
+
+/**
+ * SUBTEST: guc-log-bound
+ * Description: Validate GuC log attributes are rejected while bound
+ */
+static void test_guc_log_bound(int configfs_debug_fd)
+{
+	igt_kmod_bind("xe", bus_addr);
+
+	igt_assert_f(!igt_sysfs_set(configfs_debug_fd, "guc_log_level", "1"),
+		     "Writing guc_log_level while bound should have failed\n");
+	igt_assert_f(!igt_sysfs_set(configfs_debug_fd, "guc_log_target", "1"),
+		     "Writing guc_log_target while bound should have failed\n");
+}
+
 static void set_bus_addr(int fd)
 {
 	pci_dev = igt_device_get_pci_device(fd);
@@ -475,6 +611,51 @@ int igt_main()
 					   configfs_debug_fd);
 	}
 
+	igt_describe("Validate guc_log_level");
+	igt_subtest("guc-log-level") {
+		create_debug_configfs_group(configfs_fd, &configfs_device_fd,
+					    &configfs_debug_fd);
+		test_guc_log_level(configfs_debug_fd);
+		close_debug_configfs_group(configfs_fd, configfs_device_fd,
+					   configfs_debug_fd);
+	}
+
+	igt_describe("Validate guc_log_level with invalid options");
+	igt_subtest("guc-log-level-invalid") {
+		create_debug_configfs_group(configfs_fd, &configfs_device_fd,
+					    &configfs_debug_fd);
+		test_guc_log_level_invalid(configfs_debug_fd);
+		close_debug_configfs_group(configfs_fd, configfs_device_fd,
+					   configfs_debug_fd);
+	}
+
+	igt_describe("Validate guc_log_target");
+	igt_subtest("guc-log-target") {
+		create_debug_configfs_group(configfs_fd, &configfs_device_fd,
+					    &configfs_debug_fd);
+		test_guc_log_target(configfs_debug_fd);
+		close_debug_configfs_group(configfs_fd, configfs_device_fd,
+					   configfs_debug_fd);
+	}
+
+	igt_describe("Validate guc_log_target with invalid options");
+	igt_subtest("guc-log-target-invalid") {
+		create_debug_configfs_group(configfs_fd, &configfs_device_fd,
+					    &configfs_debug_fd);
+		test_guc_log_target_invalid(configfs_debug_fd);
+		close_debug_configfs_group(configfs_fd, configfs_device_fd,
+					   configfs_debug_fd);
+	}
+
+	igt_describe("Validate GuC log attributes are rejected while bound");
+	igt_subtest("guc-log-bound") {
+		create_debug_configfs_group(configfs_fd, &configfs_device_fd,
+					    &configfs_debug_fd);
+		test_guc_log_bound(configfs_debug_fd);
+		close_debug_configfs_group(configfs_fd, configfs_device_fd,
+					   configfs_debug_fd);
+	}
+
 	igt_describe("Validate ctx_restore_post_bb with invalid options");
 	igt_subtest("ctx-restore-post-bb-invalid") {
 		igt_skip_on_f(is_vf_device, "MMIO register readback not possible on VF\n");
-- 
2.43.0


  parent reply	other threads:[~2026-08-21 20:05 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-21 19:23 [PATCH i-g-t 0/2] Test new debug based configfs changes Stuart Summers
2026-08-21 19:23 ` [PATCH i-g-t 1/2] tests/intel/xe_configfs: Use the new debug configfs group Stuart Summers
2026-08-21 19:23 ` Stuart Summers [this message]
2026-08-21 21:11 ` ✓ Xe.CI.BAT: success for Test new debug based configfs changes Patchwork
2026-08-21 21:26 ` ✓ i915.CI.BAT: " Patchwork
2026-08-21 23:19 ` ✗ Xe.CI.FULL: failure " Patchwork
2026-08-22  0:16 ` ✗ i915.CI.Full: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260821192332.19060-6-stuart.summers@intel.com \
    --to=stuart.summers@intel.com \
    --cc=Michal.Wajdeczko@intel.com \
    --cc=daniele.ceraolospurio@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=matthew.brost@intel.com \
    --cc=matthew.d.roper@intel.com \
    --cc=rodrigo.vivi@intel.com \
    --cc=shuicheng.lin@intel.com \
    --cc=umesh.nerlige.ramappa@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox