[igt-dev] [PATCH v2] tests/i915_pm_sseu: remove broken test
Andi Shyti
andi at etezian.org
Tue Apr 7 23:55:52 UTC 2020
From: Andi Shyti <andi.shyti at intel.com>
the i915_pm_sseu test is disabled by default and anyway basked on
a broken debugfs interface on its way to be removed.
Remove it.
Closes: https://gitlab.freedesktop.org/drm/intel/issues/286
Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/863
Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/1388
Signed-off-by: Andi Shyti <andi.shyti at intel.com>
Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
---
Thanks Chris!
v2:
- just added some Closes for gitlab
tests/Makefile.sources | 3 -
tests/i915/i915_pm_sseu.c | 397 --------------------------------------
tests/meson.build | 1 -
3 files changed, 401 deletions(-)
delete mode 100644 tests/i915/i915_pm_sseu.c
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index 4e44c98c..6d312b85 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -491,9 +491,6 @@ i915_pm_dc_SOURCES = i915/i915_pm_dc.c
TESTS_progs += i915_pm_rps
i915_pm_rps_SOURCES = i915/i915_pm_rps.c
-TESTS_progs += i915_pm_sseu
-i915_pm_sseu_SOURCES = i915/i915_pm_sseu.c
-
TESTS_progs += i915_query
i915_query_SOURCES = i915/i915_query.c
diff --git a/tests/i915/i915_pm_sseu.c b/tests/i915/i915_pm_sseu.c
deleted file mode 100644
index c2dee118..00000000
--- a/tests/i915/i915_pm_sseu.c
+++ /dev/null
@@ -1,397 +0,0 @@
-/*
- * Copyright © 2015 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- *
- * Authors:
- * Jeff McGee <jeff.mcgee at intel.com>
- */
-
-#include "igt.h"
-#include <fcntl.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-#include <time.h>
-#include "i915_drm.h"
-#include "intel_bufmgr.h"
-
-IGT_TEST_DESCRIPTION("Tests slice/subslice/EU power gating functionality.\n");
-
-static struct {
- int init;
- int drm_fd;
- int devid;
- int gen;
- drm_intel_bufmgr *bufmgr;
- struct intel_batchbuffer *batch;
- igt_media_spinfunc_t spinfunc;
- struct igt_buf buf;
- uint32_t spins_per_msec;
-} gem;
-
-static double
-to_dt(const struct timespec *start, const struct timespec *end)
-{
- double dt;
-
- dt = (end->tv_sec - start->tv_sec) * 1e3;
- dt += (end->tv_nsec - start->tv_nsec) * 1e-6;
-
- return dt;
-}
-
-struct status {
- struct {
- int slice_total;
- int subslice_total;
- int subslice_per;
- int eu_total;
- int eu_per;
- bool has_slice_pg;
- bool has_subslice_pg;
- bool has_eu_pg;
- } info;
- struct {
- int slice_total;
- int subslice_total;
- int subslice_per;
- int eu_total;
- int eu_per;
- } hw;
-};
-
-#define DBG_STATUS_BUF_SIZE 4096
-
-struct {
- int init;
- int status_fd;
- char status_buf[DBG_STATUS_BUF_SIZE];
-} dbg;
-
-static void
-dbg_get_status_section(const char *title, char **first, char **last)
-{
- char *pos;
-
- *first = strstr(dbg.status_buf, title);
- igt_assert(*first != NULL);
-
- pos = *first;
- do {
- pos = strchr(pos, '\n');
- igt_assert(pos != NULL);
- pos++;
- } while (*pos == ' '); /* lines in the section begin with a space */
- *last = pos - 1;
-}
-
-static bool
-dbg_has_line(const char *first, const char *last, const char *name)
-{
- char *pos = strstr(first, name);
-
- return pos != NULL && pos < last;
-}
-
-static int
-dbg_get_int(const char *first, const char *last, const char *name)
-{
- char *pos;
-
- pos = strstr(first, name);
- igt_assert(pos != NULL);
- pos = strstr(pos, ":");
- igt_assert(pos != NULL);
- pos += 2;
- igt_assert(pos != last);
-
- return strtol(pos, &pos, 10);
-}
-
-static bool
-dbg_get_bool(const char *first, const char *last, const char *name)
-{
- char *pos;
-
- pos = strstr(first, name);
- igt_assert(pos != NULL);
- pos = strstr(pos, ":");
- igt_assert(pos != NULL);
- pos += 2;
- igt_assert(pos < last);
-
- if (*pos == 'y')
- return true;
- if (*pos == 'n')
- return false;
-
- igt_assert_f(false, "Could not read boolean value for %s.\n", name);
- return false;
-}
-
-static void
-dbg_get_status(struct status *stat)
-{
- char *first, *last;
- int nread;
-
- lseek(dbg.status_fd, 0, SEEK_SET);
- nread = read(dbg.status_fd, dbg.status_buf, DBG_STATUS_BUF_SIZE);
- igt_assert_lt(nread, DBG_STATUS_BUF_SIZE);
- dbg.status_buf[nread] = '\0';
-
- memset(stat, 0, sizeof(*stat));
-
- dbg_get_status_section("SSEU Device Info", &first, &last);
- for (char *tmp = first; tmp < last; tmp++)
- igt_debug("%c", *tmp);
- igt_debug("\n");
- stat->info.slice_total =
- dbg_get_int(first, last, "Available Slice Total:");
- stat->info.subslice_total =
- dbg_get_int(first, last, "Available Subslice Total:");
- /* Dealing with a change in 4.17. */
- if (dbg_has_line(first, last, "Available Subslice Per Slice:")) {
- stat->info.subslice_per =
- dbg_get_int(first, last, "Available Subslice Per Slice:");
- } else {
- stat->info.subslice_per =
- dbg_get_int(first, last, "Available Slice0 subslices:");
- }
- stat->info.eu_total =
- dbg_get_int(first, last, "Available EU Total:");
- stat->info.eu_per =
- dbg_get_int(first, last, "Available EU Per Subslice:");
- stat->info.has_slice_pg =
- dbg_get_bool(first, last, "Has Slice Power Gating:");
- stat->info.has_subslice_pg =
- dbg_get_bool(first, last, "Has Subslice Power Gating:");
- stat->info.has_eu_pg =
- dbg_get_bool(first, last, "Has EU Power Gating:");
-
- dbg_get_status_section("SSEU Device Status", &first, &last);
- for (char *tmp = first; tmp < last; tmp++)
- igt_debug("%c", *tmp);
- igt_debug("\n");
- stat->hw.slice_total =
- dbg_get_int(first, last, "Enabled Slice Total:");
- stat->hw.subslice_total =
- dbg_get_int(first, last, "Enabled Subslice Total:");
- /* Dealing with a change in 4.17. */
- if (dbg_has_line(first, last, "Enabled Subslice Per Slice:")) {
- stat->hw.subslice_per =
- dbg_get_int(first, last, "Enabled Subslice Per Slice:");
- } else if (dbg_has_line(first, last, "Enabled Slice0 subslices:")) {
- stat->hw.subslice_per =
- dbg_get_int(first, last, "Enabled Slice0 subslices:");
- }
- stat->hw.eu_total =
- dbg_get_int(first, last, "Enabled EU Total:");
- stat->hw.eu_per =
- dbg_get_int(first, last, "Enabled EU Per Subslice:");
-}
-
-static void
-dbg_init(void)
-{
- igt_assert(gem.init);
- dbg.status_fd = igt_debugfs_open(gem.drm_fd, "i915_sseu_status", O_RDONLY);
- igt_skip_on_f(dbg.status_fd == -1,
- "debugfs entry 'i915_sseu_status' not found\n");
- dbg.init = 1;
-}
-
-static void
-dbg_deinit(void)
-{
- switch (dbg.init)
- {
- case 1:
- close(dbg.status_fd);
- }
-}
-
-static void
-gem_check_spin(uint32_t spins)
-{
- uint32_t *data;
-
- data = (uint32_t*)gem.buf.bo->virtual;
- igt_assert_eq_u32(*data, spins);
-}
-
-static uint32_t
-gem_get_target_spins(double dt)
-{
- struct timespec tstart, tdone;
- double prev_dt, cur_dt;
- uint32_t spins;
- int i, ret;
-
- /* Double increments until we bound the target time */
- prev_dt = 0.0;
- for (i = 0; i < 32; i++) {
- spins = 1 << i;
- clock_gettime(CLOCK_MONOTONIC, &tstart);
-
- gem.spinfunc(gem.batch, &gem.buf, spins);
- ret = drm_intel_bo_map(gem.buf.bo, 0);
- igt_assert_eq(ret, 0);
- clock_gettime(CLOCK_MONOTONIC, &tdone);
-
- gem_check_spin(spins);
- drm_intel_bo_unmap(gem.buf.bo);
-
- cur_dt = to_dt(&tstart, &tdone);
- if (cur_dt > dt)
- break;
- prev_dt = cur_dt;
- }
- igt_assert_neq(i, 32);
-
- /* Linearly interpolate between i and i-1 to get target increments */
- spins = 1 << (i-1); /* lower bound spins */
- spins += spins * (dt - prev_dt)/(cur_dt - prev_dt); /* target spins */
-
- return spins;
-}
-
-static void
-gem_init(void)
-{
- gem.drm_fd = drm_open_driver(DRIVER_INTEL);
- igt_require_gem(gem.drm_fd);
- gem.init = 1;
-
- gem.devid = intel_get_drm_devid(gem.drm_fd);
- gem.gen = intel_gen(gem.devid);
- igt_require_f(gem.gen >= 8,
- "SSEU power gating only relevant for Gen8+");
-
- gem.spinfunc = igt_get_media_spinfunc(gem.devid);
- igt_require(gem.spinfunc);
-
- gem.bufmgr = drm_intel_bufmgr_gem_init(gem.drm_fd, 4096);
- igt_assert(gem.bufmgr);
- gem.init = 2;
-
- drm_intel_bufmgr_gem_enable_reuse(gem.bufmgr);
-
- gem.batch = intel_batchbuffer_alloc(gem.bufmgr, gem.devid);
- igt_assert(gem.batch);
- gem.init = 3;
-
- gem.buf.surface[0].stride = sizeof(uint32_t);
- gem.buf.tiling = I915_TILING_NONE;
- gem.buf.surface[0].size = gem.buf.surface[0].stride;
- gem.buf.bo = drm_intel_bo_alloc(gem.bufmgr, "",
- gem.buf.surface[0].size, 4096);
- gem.buf.bpp = 32;
- igt_assert(gem.buf.bo);
- gem.init = 4;
-
- gem.spins_per_msec = gem_get_target_spins(100) / 100;
-}
-
-static void
-gem_deinit(void)
-{
- switch (gem.init)
- {
- case 4:
- drm_intel_bo_unmap(gem.buf.bo);
- drm_intel_bo_unreference(gem.buf.bo);
- case 3:
- intel_batchbuffer_free(gem.batch);
- case 2:
- drm_intel_bufmgr_destroy(gem.bufmgr);
- case 1:
- close(gem.drm_fd);
- }
-}
-
-static void
-check_full_enable(struct status *stat)
-{
- igt_assert_eq(stat->hw.slice_total, stat->info.slice_total);
- igt_assert_eq(stat->hw.subslice_total, stat->info.subslice_total);
- igt_assert_eq(stat->hw.subslice_per, stat->info.subslice_per);
-
- /*
- * EU are powered in pairs, but it is possible for one EU in the pair
- * to be non-functional due to fusing. The determination of enabled
- * EU does not account for this and can therefore actually exceed the
- * available count. Allow for this small discrepancy in our
- * comparison.
- */
- igt_assert_lte(stat->info.eu_total, stat->hw.eu_total);
- igt_assert_lte(stat->info.eu_per, stat->hw.eu_per);
-}
-
-static void
-full_enable(void)
-{
- struct status stat;
- const int spin_msec = 10;
- int ret, spins;
-
- /*
- * Gen9 SKL is the first case in which render power gating can leave
- * slice/subslice/EU in a partially enabled state upon resumption of
- * render work. So start checking that this is prevented as of Gen9.
- */
- igt_require(gem.gen >= 9);
-
- spins = spin_msec * gem.spins_per_msec;
-
- gem.spinfunc(gem.batch, &gem.buf, spins);
-
- usleep(2000); /* 2ms wait to make sure batch is running */
- dbg_get_status(&stat);
-
- ret = drm_intel_bo_map(gem.buf.bo, 0);
- igt_assert_eq(ret, 0);
-
- gem_check_spin(spins);
- drm_intel_bo_unmap(gem.buf.bo);
-
- check_full_enable(&stat);
-}
-
-static void
-exit_handler(int sig)
-{
- dbg_deinit();
- gem_deinit();
-}
-
-igt_main
-{
- igt_fixture {
- igt_install_exit_handler(exit_handler);
-
- gem_init();
- dbg_init();
- }
-
- igt_subtest("full-enable")
- full_enable();
-}
diff --git a/tests/meson.build b/tests/meson.build
index e882f4dc..a890e779 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -221,7 +221,6 @@ i915_progs = [
'i915_pm_rpm',
'i915_pm_dc',
'i915_pm_rps',
- 'i915_pm_sseu',
'i915_query',
'i915_selftest',
'i915_suspend',
--
2.25.1
More information about the igt-dev
mailing list