[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:01:02 UTC 2025
Hi,
On 7/4/2025 1:36 PM, Peter Senna Tschudin wrote:
>
> On 7/3/2025 10:39 PM, Rodrigo Vivi wrote:
>> On Mon, Jun 16, 2025 at 09:42:35AM +0200, 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
>> Could we please use display instead of heads here?
>> From display folks perspective heads might be indeed more clear because we will
>> only use display if any 'head' is attached, but from folks outside of display
>> world, heads will be a confusing term to be in the name of the test.
>>
>> Or perhaps we name kms_debugfs
> My first name proposal was core_debugfs_display_on_off. This is
> informative because it makes it explicit that this runs the test with
> display on and with the display off. This name is also a good contrast
> with the other test core_debugfs. Removing the on_off suffix makes the
> name less informative.
>
> Problem is that core_debugfs_display_on_off is a large name. So using
> heads instead of display was an attempt to make the name shorter, but no
> one liked it. We are waiting the KMS team to decide on which name they want.
I would vote for kms_debugfs as this would be also consistent with the
existing display tests. I'm also okay with 'core_debugfs_display' if we
can't have kms_debugfs.
>
>
>
>
>>> + * 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;
>>> + }
>>> +
>>> + 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);
>>> + }
>>> +
>>> + 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',
>>> --
>>> 2.43.0
>>>
More information about the igt-dev
mailing list