[PATCH i-g-t] tests/intel/xe_pm: Test to validate vram-sr through Mods during host s2idle
Purkait, Soham
soham.purkait at intel.com
Tue Aug 26 12:32:22 UTC 2025
Hi Anirban,
On 24-06-2025 00:28, Anirban, Sk wrote:
> 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.
I guess a generic read function is more appropriate and it could be
reusable for other residencies as well.
Thanks,
Soham
>> +
>> /**
>> * 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