Re: [PATCH i-g-t v4] tests/xe_debugfs: add uc debugfs validation and read tests
Daniele Ceraolo Spurio <[email protected]> Thu, 23 Jul 2026 16:28:21 -0700
| Newsgroups | org.freedesktop.lists.igt-dev |
|---|---|
| Message-ID | <[email protected]> |
On 7/22/2026 9:02 AM, root wrote: > From: Sobin Thomas <[email protected]> > > Add coverage for GT-specific uc debugfs entries by introducing a new > uc-info-read subtest that validates the presence of required files in the > GT debugfs hierarchy. The test currently verifies the existence of > the following debugfs nodes: > > - uc/gsc_info > - uc/huc_info > - uc/guc_info > - uc/guc_pc > > These additions improve validation of Xe GT debugfs interfaces and > provide basic functional coverage for the GSC information debugfs node. > > v2: Add support for guc and huc info (Daniele) > v3: Added checks for the device nodes. > v4: Consolidated the calls into single test_uc_info_read subtest > > Signed-off-by: Sobin Thomas <[email protected]> > --- > tests/intel/xe_debugfs.c | 73 +++++++++++++++++++++++++++++++++++++++- > 1 file changed, 72 insertions(+), 1 deletion(-) > > diff --git a/tests/intel/xe_debugfs.c b/tests/intel/xe_debugfs.c > index da482157e..fd651801c 100644 > --- a/tests/intel/xe_debugfs.c > +++ b/tests/intel/xe_debugfs.c > @@ -16,6 +16,18 @@ struct { > bool warn_on_not_hit; > } opt = { 0 }; > > +struct uc_info_node { > + const char *node; > + bool mandatory; > +}; > + > +static const struct uc_info_node uc_info_nodes[] = { > + { "uc/gsc_info", false }, > + { "uc/huc_info", false }, > + { "uc/guc_info", true }, > + { "uc/guc_pc", true }, > +}; > + > /** > * TEST: Xe debugfs test > * Description: Xe-specific debugfs tests. These are complementary to the > @@ -595,6 +607,58 @@ static void check_gt_reg_sr(int fd, int gt) > igt_assert_eq(problems, 0); > } > > +/** > + * SUBTEST: uc-info-read > + * Description: This is for reading the uc device nodes. > + */ > +static void test_uc_info_read(struct xe_device *xe_dev, unsigned int gt) > +{ > + int debugfs_fd = igt_debugfs_gt_dir(xe_dev->fd, gt); > + int i; > + int fail_count = 0; > + > + igt_skip_on_f(debugfs_fd < 0, "Failed to open debugfs directory\n"); > + > + for (i = 0; i < ARRAY_SIZE(uc_info_nodes); i++) { > + const char *node = uc_info_nodes[i].node; > + bool mandatory = uc_info_nodes[i].mandatory; > + char *buf; > + > + if (faccessat(debugfs_fd, node, F_OK, 0) < 0) { We do have the igt_sysfs_has_attr helper that already wraps the faccessat check. > + if (mandatory) > + fail_count++; > + igt_info("%s debugfs node not present on GT-%u\n", node, gt); > + continue; > + } > + buf = igt_sysfs_get(debugfs_fd, node); > + if (!buf) { > + if (mandatory) { > + fail_count++; > + igt_info("Failed to read mandatory %s debugfs file on GT-%u\n", > + node, gt); > + } else { > + igt_info("Failed to read %s debugfs file on GT-%u\n", node, gt); Here you have separate logs for mandatory vs optional, but above for the missing node you don't. my personal preference goes to having a single log statement, if you want to have the "mandatory" or "optional" words in it you can just pass them as a sting param based on the value of the mandatory variable. > + } > + continue; > + } > + if (buf[0] == '\0') { > + free(buf); > + if (mandatory) { > + fail_count++; > + igt_info("Mandatory %s debugfs file is empty on GT-%u\n", node, gt); > + } else { > + igt_info("Optional %s debugfs file is empty on GT-%u\n", node, gt); > + } > + continue; > + } > + igt_info("GT-%u: successfully read %s (%zu bytes)\n", gt, node, strlen(buf)); > + free(buf); Could use some empty lines between the if statements to make the code more readable. Daniele > + } > + close(debugfs_fd); > + igt_fail_on_f(fail_count > 0, "%d mandatory debugfs node(s) failed (missing/unreadable/empty) on GT-%u\n", > + fail_count, gt); > +} > + > const char *help_str = > " --warn-not-hit|--w\tWarn about devfs nodes that have no tests"; > > @@ -619,8 +683,9 @@ static int opt_handler(int option, int option_index, void *input) > int igt_main_args("", long_options, help_str, opt_handler, NULL) > { > struct xe_device *xe_dev; > + int fd = -1; > + unsigned int gt; > unsigned int t; > - int fd = -1, gt; > > igt_fixture() { > fd = drm_open_driver_master(DRIVER_XE); > @@ -648,6 +713,12 @@ int igt_main_args("", long_options, help_str, opt_handler, NULL) > igt_dynamic_f("gt%d", gt) > check_gt_reg_sr(fd, gt); > > + igt_describe("Verify that uC debugfs info nodes are present and readable."); > + igt_subtest_with_dynamic("uc-info-read") > + xe_for_each_gt(fd, gt) > + igt_dynamic_f("gt%d", gt) > + test_uc_info_read(xe_dev, gt); > + > igt_fixture() { > drm_close_driver(fd); > }