[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