[PATCH i-g-t] tests/intel/xe_pm: Test to validate vram-sr through Mods during host s2idle
Anirban, Sk
sk.anirban at intel.com
Mon Jun 23 18:58:21 UTC 2025
Hi Soham,
On 02-06-2025 16:33, Soham Purkait wrote:
> Add test to validate vram-sr through Mods during host s2idle. It checks
> whether vram self refresh capability is supported through debugfs node and
> then introduce host s2idle to check ModS residency to confirm vram self
> refresh capability upon success.
>
> Signed-off-by: Soham Purkait <soham.purkait at intel.com>
> ---
> tests/intel/xe_pm.c | 99 ++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 98 insertions(+), 1 deletion(-)
>
> diff --git a/tests/intel/xe_pm.c b/tests/intel/xe_pm.c
> index 6eb21d5ec..322b22eb0 100644
> --- a/tests/intel/xe_pm.c
> +++ b/tests/intel/xe_pm.c
> @@ -10,9 +10,10 @@
> * Sub-category: Suspend-resume tests
> * Test category: functionality test
> */
> -
> +#include <ctype.h>
> #include <limits.h>
> #include <fcntl.h>
> +#include <stddef.h>
> #include <string.h>
>
> #include "igt.h"
> @@ -413,6 +414,46 @@ child_exec(void *arguments)
> return NULL;
> }
>
> +static char *read_content_line(const char *content, const char *prefix)
> +{
> + const char *line_start = content;
> + char line[1024];
> + char *result;
> + size_t len;
> +
> + while (*line_start) {
> + const char *line_end = strchr(line_start, '\n');
> + size_t line_len = line_end ? (size_t)(line_end - line_start) : strlen(line_start);
> +
> + if (line_len >= sizeof(line))
> + line_len = sizeof(line) - 1;
> +
> + memcpy(line, line_start, line_len);
> + line[line_len] = '\0';
> +
> + if (strstr(line, prefix)) {
> + char *colon = strchr(line, ':');
> +
> + if (colon) {
> + colon++;
> + while (isspace((unsigned char)*colon))
> + colon++;
> +
> + result = strdup(colon);
> + len = strlen(result);
> + if (len > 0 && result[len - 1] == '\n')
> + result[len - 1] = '\0';
> +
> + return result;
> + }
> + }
> + line_start = line_end ? line_end + 1 : NULL;
> + if (!line_start)
> + break;
> + }
> + return NULL;
> +}
imho this function is not required, explained below.
> +
> /**
> * SUBTEST: %s-basic
> * Description: test CPU/GPU in and out of s/d state from %arg[1]
> @@ -777,6 +818,57 @@ static void test_mocs_suspend_resume(device_t device, enum igt_suspend_state s_s
> }
> }
>
> +/**
> + * SUBTEST: vrsr-capability-during-host-s2idle
> + * Functionality: pm - vram-sr
> + * Description: Test to validate vram self refresh through
> + * ModS residency counter during host s2idle
> + */
> +
> +static void test_vrsr_capability_during_host_s2idle(device_t device)
> +{
> + u32 bo, placement;
> + u64 s2idle_start_mods, s2idle_end_mods;
> + int dir, ret;
> + char buf[4096] = {0};
You can reduce the side, buf[256] should be enough to store data.
> + char *result;
> + void *map;
> +
> + dir = igt_debugfs_dir(device.fd_xe);
> + ret = igt_debugfs_simple_read(dir, "vrsr_capable",
> + buf, sizeof(buf));
> + igt_assert_f(ret >= 0, "vrsr_capable node is not present in debugfs.\n");
> + igt_assert_f(strstr(buf, "true"), "VRSR capability is not supported.");
> +
> + placement = vram_memory(device.fd_xe, 0);
> +#define XE_BO_SIZE (350 * 1024 * 1024)
define these macros at the top.
> + bo = xe_bo_create(device.fd_xe, 0, XE_BO_SIZE, placement, 0);
> + map = xe_bo_map(device.fd_xe, bo, XE_BO_SIZE);
> + memset(map, 0, XE_BO_SIZE);
> +
> + ret = igt_debugfs_simple_read(dir, "gtidle/dgfx_pkg_residencies", buf, sizeof(buf));
> + igt_assert_f(ret >= 0, "dgfx_pkg_residencies node is not present in debugfs.\n");
> +
> +#define MODS_PREFIX "ModS"
same as above.
> + result = read_content_line(buf, MODS_PREFIX);
Just to read the package residency here, you can use sscanf. For more
details please refer to the function read_mods here:
https://patchwork.freedesktop.org/patch/660150/?series=149557&rev=2
> + igt_assert(result);
> + s2idle_start_mods = (uint64_t)strtoull(result, NULL, 10);
> + free(result);
> +
> + igt_system_suspend_autoresume(SUSPEND_STATE_FREEZE, SUSPEND_TEST_NONE);
> + munmap(map, XE_BO_SIZE);
> + memset(buf, 0, sizeof(buf));
> + ret = igt_debugfs_simple_read(dir, "gtidle/dgfx_pkg_residencies", buf, sizeof(buf));
> +
> + result = read_content_line(buf, MODS_PREFIX);
same as above.
> + igt_assert(result);
> +
> + s2idle_end_mods = (uint64_t)strtoull(result, NULL, 10);
> + free(result);
> +
> + igt_assert(s2idle_start_mods != s2idle_end_mods);
Maybe we can check if the end counter is greater than the first one or not.
Regards,
Anirban
> +}
> +
> igt_main
> {
> device_t device;
> @@ -936,6 +1028,11 @@ igt_main
> test_vram_d3cold_threshold(device, sysfs_fd);
> }
>
> + igt_describe("Validate VRAM self refresh capability during host s2idle");
> + igt_subtest("vrsr-capability-during-host-s2idle") {
> + test_vrsr_capability_during_host_s2idle(device);
> + }
> +
> igt_fixture {
> close(sysfs_fd);
> igt_pm_set_d3cold_allowed(device.pci_slot_name, d3cold_allowed);
More information about the igt-dev
mailing list