From: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
To: igt-dev@lists.freedesktop.org, kamil.konieczny@linux.intel.com
Cc: Jani Nikula <jani.nikula@intel.com>
Subject: [igt-dev] [i-g-t V4] lib/kms: Get pipe enum from debugfs
Date: Fri, 24 Mar 2023 10:50:19 +0530 [thread overview]
Message-ID: <20230324052019.3131946-1-bhanuprakash.modem@intel.com> (raw)
The pipe may not be the same as crtc index if pipes are fused off.
For testing purposes, IGT needs to know the pipe. There's already
a I915_GET_PIPE_FROM_CRTC_ID IOCTL for this. However, the upcoming
Xe driver won't have that IOCTL.
Add IGT support to read the pipe from debugfs. For i915, still
fallback to ioctl method to support older kernels.
V2: - Fix kmstest_get_pipe_from_crtc_id() (Bhanu)
V3: - Read pipe as a letter instead of number (Jani)
V4: - Fallback to ioctl method if debugfs is not found (Kamil)
Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
Acked-by: Jani Nikula <jani.nikula@intel.com>
---
lib/igt_kms.c | 81 ++++++++++++++++++++++++++++++++++++---------------
1 file changed, 57 insertions(+), 24 deletions(-)
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index c12823d31..50655f136 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -1067,6 +1067,54 @@ void kmstest_dump_mode(drmModeModeInfo *mode)
aspect ? aspect : "", aspect ? ")" : "");
}
+/*
+ * With non-contiguous pipes display, crtc mapping is not always same
+ * as pipe mapping, In i915 pipe is enum id of i915's crtc object.
+ * hence allocating upper bound igt_pipe array to support non-contiguos
+ * pipe display and reading pipe enum for a crtc using GET_PIPE_FROM_CRTC_ID
+ * ioctl for a pipe to do pipe ordering with respect to crtc list.
+ */
+static int __intel_get_pipe_from_crtc_id(int fd, int crtc_id, int crtc_idx)
+{
+ char buf[2];
+ int debugfs_fd, res = 0;
+
+ /*
+ * No GET_PIPE_FROM_CRTC_ID ioctl support for XE. Instead read
+ * from the debugfs "i915_pipe".
+ *
+ * This debugfs is applicable for both i915 & XE. For i915, still
+ * we can fallback to ioctl method to support older kernels.
+ */
+ debugfs_fd = igt_debugfs_pipe_dir(fd, crtc_idx, O_RDONLY);
+
+ if (debugfs_fd >= 0) {
+ res = igt_debugfs_simple_read(debugfs_fd, "i915_pipe", buf, sizeof(buf));
+ close(debugfs_fd);
+ }
+
+ if (res <= 0) {
+ /* Fallback to older ioctl method. */
+ if (is_i915_device(fd)) {
+ struct drm_i915_get_pipe_from_crtc_id get_pipe;
+
+ get_pipe.pipe = 0;
+ get_pipe.crtc_id = crtc_id;
+
+ do_ioctl(fd, DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID,
+ &get_pipe);
+
+ return get_pipe.pipe;
+ } else
+ igt_assert_f(false, "XE: Failed to read the debugfs i915_pipe.\n");
+ } else {
+ char pipe;
+
+ igt_assert_eq(sscanf(buf, "%c", &pipe), 1);
+ return kmstest_pipe_to_index(pipe);
+ }
+}
+
/**
* kmstest_get_pipe_from_crtc_id:
* @fd: DRM fd
@@ -1100,7 +1148,8 @@ int kmstest_get_pipe_from_crtc_id(int fd, int crtc_id)
drmModeFreeResources(res);
- return i;
+ return is_intel_device(fd) ?
+ __intel_get_pipe_from_crtc_id(fd, crtc_id, i) : i;
}
/**
@@ -2558,14 +2607,14 @@ void igt_display_require(igt_display_t *display, int drm_fd)
drmModeRes *resources;
drmModePlaneRes *plane_resources;
int i;
- bool is_i915_dev;
+ bool is_intel_dev;
memset(display, 0, sizeof(igt_display_t));
LOG_INDENT(display, "init");
display->drm_fd = drm_fd;
- is_i915_dev = is_i915_device(drm_fd);
+ is_intel_dev = is_intel_device(drm_fd);
drmSetClientCap(drm_fd, DRM_CLIENT_CAP_WRITEBACK_CONNECTORS, 1);
@@ -2593,34 +2642,18 @@ void igt_display_require(igt_display_t *display, int drm_fd)
if (is_xe_device(drm_fd))
xe_device_get(drm_fd);
- /*
- * With non-contiguous pipes display, crtc mapping is not always same
- * as pipe mapping, In i915 pipe is enum id of i915's crtc object.
- * hence allocating upper bound igt_pipe array to support non-contiguos
- * pipe display and reading pipe enum for a crtc using GET_PIPE_FROM_CRTC_ID ioctl
- * for a pipe to do pipe ordering with respect to crtc list.
- */
display->n_pipes = IGT_MAX_PIPES;
display->pipes = calloc(sizeof(igt_pipe_t), display->n_pipes);
igt_assert_f(display->pipes, "Failed to allocate memory for %d pipes\n", display->n_pipes);
for (i = 0; i < resources->count_crtcs; i++) {
igt_pipe_t *pipe;
+ int pipe_enum = (is_intel_dev)?
+ __intel_get_pipe_from_crtc_id(drm_fd,
+ resources->crtcs[i], i) : i;
- if (is_i915_dev) {
- struct drm_i915_get_pipe_from_crtc_id get_pipe;
-
- get_pipe.pipe = 0;
- get_pipe.crtc_id = resources->crtcs[i];
- do_ioctl(display->drm_fd,
- DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID, &get_pipe);
- pipe = &display->pipes[get_pipe.pipe];
- pipe->pipe = get_pipe.pipe;
- }
- else {
- pipe = &display->pipes[i];
- pipe->pipe = i;
- }
+ pipe = &display->pipes[pipe_enum];
+ pipe->pipe = pipe_enum;
/* pipe is enabled/disabled */
pipe->enabled = true;
--
2.40.0
next reply other threads:[~2023-03-24 5:24 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-24 5:20 Bhanuprakash Modem [this message]
2023-03-24 7:20 ` [igt-dev] ✓ Fi.CI.BAT: success for lib/kms: Get pipe enum from debugfs (rev6) Patchwork
2023-03-24 13:47 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
2023-03-27 9:38 ` [igt-dev] [i-g-t V4] lib/kms: Get pipe enum from debugfs Kamil Konieczny
2023-04-05 15:35 ` [igt-dev] ✓ Fi.CI.BAT: success for lib/kms: Get pipe enum from debugfs (rev7) Patchwork
2023-04-06 4:59 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
2023-04-10 10:57 ` [igt-dev] ✓ Fi.CI.BAT: success for lib/kms: Get pipe enum from debugfs (rev8) Patchwork
2023-04-10 12:48 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230324052019.3131946-1-bhanuprakash.modem@intel.com \
--to=bhanuprakash.modem@intel.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=jani.nikula@intel.com \
--cc=kamil.konieczny@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox