[igt-dev] [v4 3/5] tests/intel: Add multi-gt support for rc6-accuracy test
Riana Tauro
riana.tauro at intel.com
Tue Nov 14 08:54:03 UTC 2023
On 11/14/2023 1:01 PM, 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
>
> v4: Make test dynamic (Riana)
>
> Signed-off-by: Sujaritha Sundaresan <sujaritha.sundaresan at intel.com>
> ---
> tests/intel/i915_pm_rc6_residency.c | 78 ++++++++++++++++-------------
> 1 file changed, 43 insertions(+), 35 deletions(-)
>
> diff --git a/tests/intel/i915_pm_rc6_residency.c b/tests/intel/i915_pm_rc6_residency.c
> index e84e8ea96..be5722662 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,20 @@ 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;
> + igt_subtest_with_dynamic("rc6-accuracy") {
> + i915_for_each_gt(i915, dirfd, gt) {
> + 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);
> +
> + igt_dynamic_f("gt%u", gt)
> + measure_residencies(devid, dirfd, rc6_enabled, &res);
indentation
Also keep all the calls under igt_dynamic_f. Right now its only
measure_residencies
Otherwise logs are displayed after test
Dynamic subtest gt0: SUCCESS (3.001s)
Residency in rc6 or deeper state: 3000 ms (sleep duration 3000 ms)
(100.0% of expected duration)
With all the above fixed
Reviewed-by: Riana Tauro <riana.tauro at intel.com>
> + residency_accuracy(res.rc6, res.duration, "rc6");
> + }
> }
>
> igt_subtest("media-rc6-accuracy") {
> @@ -626,7 +631,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