[PATCH v3 resend i-g-t 3/6] tests: Add core_debugfs_heads_power
Karthik B S
karthik.b.s at intel.com
Fri Jul 4 10:02:00 UTC 2025
Hi,
On 6/16/2025 1:12 PM, Peter Senna Tschudin wrote:
> Introduce core_debugfs_heads_power that is expected to work with any
> GPU, not limited to i915 and Xe. The test powers off all available
> heads before reading debugfs files, and then powers on all heads
> before reading the files again.
>
> Cc: Karthik B S <karthik.b.s at intel.com>
> Cc: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
> Cc: Juha-Pekka Heikkila <juha-pekka.heikkila at intel.com>
> Cc: Swati Sharma <swati2.sharma at intel.com>
> Cc: michal.wajdeczko at intel.com
> Cc: marcin.bernatowicz at intel.com
> Cc: kamil.konieczny at linux.intel.com
> Cc: katarzyna.piecielska at intel.com
> Cc: zbigniew.kempczynski at intel.com
> Cc: ewelina.musial at intel.com
> Signed-off-by: Peter Senna Tschudin <peter.senna at linux.intel.com>
> ---
> v3:
> - renamed the test
> - Removed reference to sysfs from comments (thanks Kamil)
> - Updated description to match the display part (thanks Kamil)
> - Moved from "display" to "heads". Our CI uses "headless" to refer
> to a DUT without display and it is shorter
> - renamed subtests for shorter names (thanks Kamil)
> - fixed comments style (thanks Kamil)
> - updated CC list
> - changed the order to test first with all heads off then with all heads on
> to prevent the need from powering on the heads at the end of the test
> (thanks Kamil)
> - removed snprintf from test names (thanks Kamil)
> - removed subtest group (thanks Kamil)
> - deleted kms_tests() and moved the code to igt_main (thanks Kamil)
>
> v2:
> - changed style of comparison to NULL
> - moved to a separate patch
>
> tests/core_debugfs_heads_power.c | 156 +++++++++++++++++++++++++++++++
> tests/meson.build | 1 +
> 2 files changed, 157 insertions(+)
> create mode 100644 tests/core_debugfs_heads_power.c
>
> diff --git a/tests/core_debugfs_heads_power.c b/tests/core_debugfs_heads_power.c
> new file mode 100644
> index 000000000..1813986d8
> --- /dev/null
> +++ b/tests/core_debugfs_heads_power.c
> @@ -0,0 +1,156 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +#include "igt.h"
> +#include "igt_debugfs.h"
> +#include "igt_dir.h"
> +
> +/**
> + * TEST: debugfs heads power test
> + * Description: Read entries from debugfs with all heads on and with all heads
> + * off.
> + * Category: Core
> + * Mega feature: General Core features
> + * Sub-category: uapi
> + * Functionality: debugfs
> + * Feature: core
> + * Test category: uapi
> + *
> + * SUBTEST: off-read-all
> + * Description: Read all debugfs entries with heads off.
> + *
> + * SUBTEST: on-read-all
> + * Description: Read all debugfs entries with heads on.
> + */
> +
> +/**
> + * bool igt_kms_all_displays_on: Try to turn on all heads
> + * @display: pointer to the igt_display structure
> + *
> + * Returns: void
> + */
> +static void igt_display_all_on(igt_display_t *display)
> +{
> + struct igt_fb fb[IGT_MAX_PIPES];
> + enum pipe pipe;
> + int ret;
> +
> + /* try to light all pipes */
> +retry:
> + for_each_pipe(display, pipe) {
> + igt_output_t *output;
> +
> + for_each_valid_output_on_pipe(display, pipe, output) {
> + igt_plane_t *primary;
> + drmModeModeInfo *mode;
> +
> + if (output->pending_pipe != PIPE_NONE)
> + continue;
> +
> + igt_output_set_pipe(output, pipe);
> + primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> + mode = igt_output_get_mode(output);
> + igt_create_pattern_fb(display->drm_fd,
> + mode->hdisplay, mode->vdisplay,
> + DRM_FORMAT_XRGB8888,
> + DRM_FORMAT_MOD_LINEAR, &fb[pipe]);
> +
> + /* Set a valid fb as some debugfs like to
> + * inspect it on a active pipe
> + */
> + igt_plane_set_fb(primary, &fb[pipe]);
> + break;
> + }
> + }
> +
> + if (display->is_atomic)
> + ret = igt_display_try_commit_atomic(display,
> + DRM_MODE_ATOMIC_TEST_ONLY |
> + DRM_MODE_ATOMIC_ALLOW_MODESET,
> + NULL);
> + else
> + ret = igt_display_try_commit2(display, COMMIT_LEGACY);
> +
> + if (ret) {
> + igt_output_t *output;
> + bool found = igt_override_all_active_output_modes_to_fit_bw(display);
> +
> + igt_require_f(found, "No valid mode combo found.\n");
> +
> + for_each_connected_output(display, output)
> + igt_output_set_pipe(output, PIPE_NONE);
> +
> + goto retry;
> + }
Instead of this could we use the wrapper function, 'igt_fit_modes_in_bw'?
> +
> + igt_display_commit2(display, display->is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
> +}
> +
> +/**
> + * bool igt_kms_all_displays_off: Try to turn off all heads
> + * @display: pointer to the igt_display structure
> + *
> + * Returns: void
> + */
> +static void igt_display_all_off(igt_display_t *display)
> +{
> + enum pipe pipe;
> + igt_output_t *output;
> + igt_plane_t *plane;
> +
> + for_each_connected_output(display, output)
> + igt_output_set_pipe(output, PIPE_NONE);
> +
> + for_each_pipe(display, pipe)
> + for_each_plane_on_pipe(display, pipe, plane)
> + igt_plane_set_fb(plane, NULL);
> +
> + igt_display_commit2(display, display->is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
> +}
> +
> +IGT_TEST_DESCRIPTION("Read entries from debugfs with display on/off.");
> +
> +igt_main
> +{
> + int debugfs = -1;
> + igt_display_t *display;
> + int fd = -1;
> + igt_dir_t *igt_dir = NULL;
> +
> + igt_fixture {
> + fd = drm_open_driver_master(DRIVER_ANY);
> + debugfs = igt_debugfs_dir(fd);
> + igt_require(debugfs >= 0);
> +
> + igt_dir = igt_dir_create(debugfs);
> + igt_require(igt_dir);
> +
> + kmstest_set_vt_graphics_mode();
> +
> + display = calloc(1, sizeof(*display));
> + igt_display_require(display, fd);
Could we also add 'igt_display_require_output' to assure we've at least
one output connected?
Regards,
Karthik.B.S
> + }
> +
> + igt_subtest("off-read-all") {
> + igt_display_all_off(display);
> +
> + igt_dir_scan_dirfd(igt_dir, -1);
> + igt_dir_process_files(igt_dir, NULL, NULL);
> + }
> +
> + igt_subtest("on-read-all") {
> + /* try to light all pipes */
> + igt_display_all_on(display);
> +
> + igt_dir_scan_dirfd(igt_dir, -1);
> + igt_dir_process_files(igt_dir, NULL, NULL);
> + }
> +
> + igt_fixture {
> + igt_display_fini(display);
> + close(debugfs);
> + drm_close_driver(fd);
> + }
> +}
> diff --git a/tests/meson.build b/tests/meson.build
> index fa62cbeb9..99dbd4feb 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -1,6 +1,7 @@
> test_progs = [
> 'core_auth',
> 'core_debugfs',
> + 'core_debugfs_heads_power',
> 'core_getclient',
> 'core_getstats',
> 'core_getversion',
More information about the igt-dev
mailing list