[igt-dev] [v3 4/6] tests/intel: Add multi-gt support for rc6-accuracy test

Sundaresan, Sujaritha sujaritha.sundaresan at intel.com
Tue Nov 14 06:42:41 UTC 2023


On 11/14/2023 12:01 PM, Riana Tauro wrote:
> Hi Suja
>
> On 11/14/2023 10:22 AM, Sujaritha Sundaresan wrote:
>> Add multi-gt support for the rc6_accuracy subtest
>>
>> v3: Align get_rc6_enabled_mask with other changes
>>      Introduce rc6_enabled_mask
>>
>> Signed-off-by: Sujaritha Sundaresan <sujaritha.sundaresan at intel.com>
>> ---
>>   tests/intel/i915_pm_rc6_residency.c | 75 ++++++++++++++++-------------
>>   1 file changed, 41 insertions(+), 34 deletions(-)
>>
>> diff --git a/tests/intel/i915_pm_rc6_residency.c 
>> b/tests/intel/i915_pm_rc6_residency.c
>> index e84e8ea96..0f427687d 100644
>> --- a/tests/intel/i915_pm_rc6_residency.c
>> +++ b/tests/intel/i915_pm_rc6_residency.c
>> @@ -73,32 +73,28 @@ struct residencies {
>>       int duration;
>>   };
>>   -static unsigned long get_rc6_enabled_mask(void)
>> +static unsigned long get_rc6_enabled_mask(int dirfd)
>>   {
>>       unsigned long enabled;
>>         enabled = 0;
>> -    igt_sysfs_scanf(sysfs, "power/rc6_enable", "%lu", &enabled);
>> +    igt_sysfs_rps_scanf(dirfd, RC6_ENABLE, "%lu", &enabled);
>>       return enabled;
>>   }
>>   -static bool has_rc6_residency(const char *name)
>> +static bool has_rc6_residency(int dirfd, enum i915_attr_id id)
>>   {
>>       unsigned long residency;
>> -    char path[128];
>>   -    sprintf(path, "power/%s_residency_ms", name);
>> -    return igt_sysfs_scanf(sysfs, path, "%lu", &residency) == 1;
>> +    return igt_sysfs_rps_scanf(dirfd, id, "%lu", &residency) == 1;
>>   }
>>   -static unsigned long read_rc6_residency(const char *name)
>> +static unsigned long read_rc6_residency(int dirfd, enum i915_attr_id 
>> id)
>>   {
>>       unsigned long residency;
>> -    char path[128];
>>         residency = 0;
>> -    sprintf(path, "power/%s_residency_ms", name);
>> -    igt_assert(igt_sysfs_scanf(sysfs, path, "%lu", &residency) == 1);
>> +    igt_assert(igt_sysfs_rps_scanf(dirfd, id, "%lu", &residency) == 1);
>>       return residency;
>>   }
>>   @@ -125,28 +121,28 @@ static unsigned long gettime_ms(void)
>>       return ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
>>   }
>>   -static void read_residencies(int devid, unsigned int mask,
>> +static void read_residencies(int devid, int dirfd, unsigned int mask,
>>                    struct residencies *res)
>>   {
>>       res->duration = gettime_ms();
>>         if (mask & RC6_ENABLED)
>> -        res->rc6 = read_rc6_residency("rc6");
>> +        res->rc6 = read_rc6_residency(dirfd, RC6_RESIDENCY_MS);
>>         if ((mask & RC6_ENABLED) &&
>>           (IS_VALLEYVIEW(devid) || IS_CHERRYVIEW(devid)))
>> -        res->media_rc6 = read_rc6_residency("media_rc6");
>> +        res->media_rc6 = read_rc6_residency(dirfd, 
>> MEDIA_RC6_RESIDENCY_MS);
>>         if (mask & RC6P_ENABLED)
>> -        res->rc6p = read_rc6_residency("rc6p");
>> +        res->rc6p = read_rc6_residency(dirfd, RC6P_RESIDENCY_MS);
>>         if (mask & RC6PP_ENABLED)
>> -        res->rc6pp = read_rc6_residency("rc6pp");
>> +        res->rc6pp = read_rc6_residency(dirfd, RC6PP_RESIDENCY_MS);
>>         res->duration += (gettime_ms() - res->duration) / 2;
>>   }
>>   -static void measure_residencies(int devid, unsigned int mask,
>> +static void measure_residencies(int devid, int dirfd, unsigned int 
>> mask,
>>                   struct residencies *res)
>>   {
>>       struct residencies start = { };
>> @@ -158,13 +154,13 @@ static void measure_residencies(int devid, 
>> unsigned int mask,
>>        * measurement, since the valid counter range is different on
>>        * different platforms and so fixing it up would be non-trivial.
>>        */
>> -    read_residencies(devid, mask, &end);
>> +    read_residencies(devid, dirfd, mask, &end);
>>       igt_debug("time=%d: rc6=(%d, %d), rc6p=%d, rc6pp=%d\n",
>>             end.duration, end.rc6, end.media_rc6, end.rc6p, end.rc6pp);
>>       for (retry = 0; retry < 2; retry++) {
>>           start = end;
>>           sleep(SLEEP_DURATION);
>> -        read_residencies(devid, mask, &end);
>> +        read_residencies(devid, dirfd, mask, &end);
>>             igt_debug("time=%d: rc6=(%d, %d), rc6p=%d, rc6pp=%d\n",
>>                 end.duration,
>> @@ -196,7 +192,7 @@ static void measure_residencies(int devid, 
>> unsigned int mask,
>>       res->rc6 += res->rc6p;
>>   }
>>   -static bool wait_for_rc6(void)
>> +static bool wait_for_rc6(int dirfd)
>>   {
>>       struct timespec tv = {};
>>       unsigned long start, now;
>> @@ -205,11 +201,11 @@ static bool wait_for_rc6(void)
>>       usleep(160 * 1000);
>>         /* Then poll for RC6 to start ticking */
>> -    now = read_rc6_residency("rc6");
>> +    now = read_rc6_residency(dirfd, RC6_RESIDENCY_MS);
>>       do {
>>           start = now;
>>           usleep(5000);
>> -        now = read_rc6_residency("rc6");
>> +        now = read_rc6_residency(dirfd, RC6_RESIDENCY_MS);
>>           if (now - start > 1)
>>               return true;
>>       } while (!igt_seconds_elapsed(&tv));
>> @@ -558,6 +554,17 @@ static void rc6_fence(int i915, unsigned int gt)
>>       close(fd);
>>   }
>>   +static unsigned int rc6_enabled_mask(int i915, int dirfd)
>> +{
>> +    igt_require(has_rc6_residency(dirfd, RC6_RESIDENCY_MS));
>> +
>> +    /* Make sure rc6 counters are running */
>> +    igt_drop_caches_set(i915, DROP_IDLE);
>> +    igt_require(wait_for_rc6(dirfd));
>> +
>> +    return get_rc6_enabled_mask(dirfd);
>> +}
>> +
>>   igt_main
>>   {
>>       int i915 = -1;
>> @@ -603,22 +610,19 @@ igt_main
>>           igt_fixture {
>>               devid = intel_get_drm_devid(i915);
>>               sysfs = igt_sysfs_open(i915);
>> -
>> -            igt_require(has_rc6_residency("rc6"));
>> -
>> -            /* Make sure rc6 counters are running */
>> -            igt_drop_caches_set(i915, DROP_IDLE);
>> -            igt_require(wait_for_rc6());
>> -
>> -            rc6_enabled = get_rc6_enabled_mask();
>> -            igt_require(rc6_enabled & RC6_ENABLED);
>> +            igt_assert(sysfs != 1);
>>           }
>>             igt_subtest("rc6-accuracy") {
>> -            struct residencies res;
>> +            for_each_sysfs_gt_dirfd(i915, dirfd, gt) {
> Lets keep the gt loop consistent across the file
> i915_for_each_gt or for_each_sysfs_gt_dirfd
This I can fix.
>
> Also should this be a dynamic subtest to identify which gt caused
> a failure?

That might be a little iffy to make it dynamic. Since it's not a 
straightforward call

like rc6_idle or rc6_fence.

Thanks,

Suja

>> +                struct residencies res;
>>   -            measure_residencies(devid, rc6_enabled, &res);
>> -            residency_accuracy(res.rc6, res.duration, "rc6");
>> +                rc6_enabled = rc6_enabled_mask(i915, dirfd);
>> +                igt_require(rc6_enabled & RC6_ENABLED);
>> +
>> +                measure_residencies(devid, dirfd, rc6_enabled, &res);
>> +                residency_accuracy(res.rc6, res.duration, "rc6");
>> +            }
>>           }
>>             igt_subtest("media-rc6-accuracy") {
>> @@ -626,7 +630,10 @@ igt_main
>>                 igt_require(IS_VALLEYVIEW(devid) || 
>> IS_CHERRYVIEW(devid));
>>   -            measure_residencies(devid, rc6_enabled, &res);
>> +            rc6_enabled = rc6_enabled_mask(i915, sysfs);
>> +            igt_require(rc6_enabled & RC6_ENABLED);
>> +
>> +            measure_residencies(devid, sysfs, rc6_enabled, &res);
>>               residency_accuracy(res.media_rc6, res.duration, 
>> "media_rc6");
>>           }


More information about the igt-dev mailing list