From: Marius Vlad <marius.vlad@collabora.com>
To: igt-dev@lists.freedesktop.org
Cc: tzimmermann@suse.de, yixie@chromium.org, seanpaul@chromium.org,
daniel@ffwll.ch, brpol@chromium.org, igormtorrente@gmail.com
Subject: [igt-dev] [PATCH i-g-t 4/5] tests/vkms: Add more tests for VKMS
Date: Fri, 1 Sep 2023 12:28:19 +0300 [thread overview]
Message-ID: <20230901092819.16924-5-marius.vlad@collabora.com> (raw)
In-Reply-To: <20230901092819.16924-1-marius.vlad@collabora.com>
From: Jim Shargo <jshargo@chromium.org>
This adds four more tests, one that should fail when no primary plane
is created and added to the pipeline, one that creates a device with
multiple overlay and cursor planes, another one that create two outputs,
and tests that disable works.
Signed-off-by: Jim Shargo <jshargo@chromium.org>
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
---
lib/igt_vkms.c | 27 ++++++++
lib/igt_vkms.h | 1 +
tests/vkms/vkms_configfs.c | 132 +++++++++++++++++++++++++++++++++++++
3 files changed, 160 insertions(+)
diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index 7ae8dde55..1128a9328 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -440,6 +440,33 @@ void igt_vkms_enable(igt_vkms_t *device)
igt_assert_eq(ret, 0);
}
+/**
+ * igt_vkms_disable:
+ * @device: the vkms device in question
+ *
+ * This would disable the vkms device.
+ *
+ */
+void igt_vkms_disable(igt_vkms_t *device)
+{
+ char enabled_file[VKMS_CARD_OBJECT_DIR_SIZE];
+ int fd, ret;
+
+ memset(enabled_file, 0x0, sizeof(enabled_file));
+ snprintf(enabled_file, sizeof(enabled_file),
+ "%s/enabled", device->device_dir);
+
+ fd = open(enabled_file, O_WRONLY);
+ igt_assert_f(fd > 0, "Unable to open '%s'\n", enabled_file);
+
+ ret = write(fd, "0", 1);
+ igt_assert_f(ret >= 0, "Unable to write '%s'. Got errno=%d (%s)\n",
+ enabled_file, errno, strerror(errno));
+
+ ret = close(fd);
+ igt_assert_eq(ret, 0);
+}
+
/**
* igt_vkms_connector_connect:
* @device: the vkms device in question
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index 174039ca0..48bdb063f 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -59,6 +59,7 @@ void igt_vkms_device_attach_encoder_to_connector(igt_vkms_t *device,
const char *encoder_name);
void igt_vkms_enable(igt_vkms_t *device);
+void igt_vkms_disable(igt_vkms_t *device);
void igt_vkms_connector_connect(igt_vkms_t *device, const char *connector_name);
void igt_vkms_connector_disconnect(igt_vkms_t *device, const char *connector_name);
bool igt_vkms_is_enabled(igt_vkms_t *device);
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 974753318..1d3fa2ec1 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -51,6 +51,105 @@ static void vkms_basic_test(igt_vkms_t *device)
igt_assert(igt_vkms_is_enabled(device));
}
+static void vkms_crtc_no_primary_test(igt_vkms_t *device)
+{
+ igt_vkms_device_add_crtc(device, "crtc");
+ igt_vkms_device_add_encoder(device, "encoder");
+ igt_vkms_device_add_connector(device, "connector");
+ igt_vkms_connector_connect(device, "connector");
+
+ igt_vkms_device_attach_encoder_to_connector(device, "connector", "encoder");
+ igt_vkms_device_attach_crtc_to_encoder(device, "encoder", "crtc");
+
+ igt_vkms_enable(device);
+ igt_assert(!igt_vkms_is_enabled(device));
+}
+
+static void vkms_multiple_overlays_test(igt_vkms_t *device)
+{
+ igt_vkms_device_add_plane(device, "primary", DRM_PLANE_TYPE_PRIMARY);
+ igt_vkms_device_add_plane(device, "cursor", DRM_PLANE_TYPE_CURSOR);
+ igt_vkms_device_add_plane(device, "overlay0", DRM_PLANE_TYPE_OVERLAY);
+ igt_vkms_device_add_plane(device, "overlay1", DRM_PLANE_TYPE_OVERLAY);
+ igt_vkms_device_add_plane(device, "overlay2", DRM_PLANE_TYPE_OVERLAY);
+ igt_vkms_device_add_plane(device, "overlay3", DRM_PLANE_TYPE_OVERLAY);
+ igt_vkms_device_add_crtc(device, "crtc");
+ igt_vkms_device_add_encoder(device, "encoder");
+ igt_vkms_device_add_connector(device, "connector");
+ igt_vkms_connector_connect(device, "connector");
+
+ igt_vkms_device_attach_plane_to_crtc(device, "primary", "crtc");
+ igt_vkms_device_attach_plane_to_crtc(device, "cursor", "crtc");
+ igt_vkms_device_attach_plane_to_crtc(device, "overlay0", "crtc");
+ igt_vkms_device_attach_plane_to_crtc(device, "overlay1", "crtc");
+ igt_vkms_device_attach_plane_to_crtc(device, "overlay2", "crtc");
+ igt_vkms_device_attach_plane_to_crtc(device, "overlay3", "crtc");
+ igt_vkms_device_attach_encoder_to_connector(device, "connector", "encoder");
+ igt_vkms_device_attach_crtc_to_encoder(device, "encoder", "crtc");
+
+ igt_vkms_enable(device);
+ igt_assert(igt_vkms_is_enabled(device));
+}
+
+static void vkms_multiple_displays_test(igt_vkms_t *device)
+{
+ igt_vkms_device_add_plane(device, "primary0", DRM_PLANE_TYPE_PRIMARY);
+ igt_vkms_device_add_plane(device, "primary1", DRM_PLANE_TYPE_PRIMARY);
+ igt_vkms_device_add_plane(device, "cursor0", DRM_PLANE_TYPE_CURSOR);
+ igt_vkms_device_add_plane(device, "cursor1", DRM_PLANE_TYPE_CURSOR);
+ igt_vkms_device_add_plane(device, "overlay0", DRM_PLANE_TYPE_OVERLAY);
+ igt_vkms_device_add_plane(device, "overlay1", DRM_PLANE_TYPE_OVERLAY);
+ igt_vkms_device_add_plane(device, "overlay2", DRM_PLANE_TYPE_OVERLAY);
+ igt_vkms_device_add_plane(device, "overlay3", DRM_PLANE_TYPE_OVERLAY);
+ igt_vkms_device_add_crtc(device, "crtc0");
+ igt_vkms_device_add_crtc(device, "crtc1");
+ igt_vkms_device_add_encoder(device, "encoder0");
+ igt_vkms_device_add_encoder(device, "encoder1");
+ igt_vkms_device_add_connector(device, "connector0");
+ igt_vkms_connector_connect(device, "connector0");
+ igt_vkms_device_add_connector(device, "connector1");
+ igt_vkms_connector_connect(device, "connector1");
+
+ igt_vkms_device_attach_plane_to_crtc(device, "primary0", "crtc0");
+ igt_vkms_device_attach_plane_to_crtc(device, "cursor0", "crtc0");
+ igt_vkms_device_attach_plane_to_crtc(device, "overlay0", "crtc0");
+ igt_vkms_device_attach_plane_to_crtc(device, "overlay1", "crtc0");
+ igt_vkms_device_attach_plane_to_crtc(device, "overlay2", "crtc0");
+ igt_vkms_device_attach_plane_to_crtc(device, "overlay3", "crtc0");
+ igt_vkms_device_attach_encoder_to_connector(device, "connector0", "encoder0");
+ igt_vkms_device_attach_crtc_to_encoder(device, "encoder0", "crtc0");
+
+ igt_vkms_device_attach_plane_to_crtc(device, "primary1", "crtc1");
+ igt_vkms_device_attach_plane_to_crtc(device, "cursor1", "crtc1");
+ igt_vkms_device_attach_plane_to_crtc(device, "overlay0", "crtc1");
+ igt_vkms_device_attach_plane_to_crtc(device, "overlay1", "crtc1");
+ igt_vkms_device_attach_plane_to_crtc(device, "overlay2", "crtc1");
+ igt_vkms_device_attach_plane_to_crtc(device, "overlay3", "crtc1");
+ igt_vkms_device_attach_encoder_to_connector(device, "connector1", "encoder1");
+ igt_vkms_device_attach_crtc_to_encoder(device, "encoder1", "crtc1");
+
+ igt_vkms_enable(device);
+ igt_assert(igt_vkms_is_enabled(device));
+}
+
+static void disable_device(igt_vkms_t *device)
+{
+ igt_vkms_device_add_plane(device, "primary", DRM_PLANE_TYPE_PRIMARY);
+ igt_vkms_device_add_crtc(device, "crtc");
+ igt_vkms_device_add_encoder(device, "encoder");
+ igt_vkms_device_add_connector(device, "connector");
+ igt_vkms_connector_connect(device, "connector");
+
+ igt_vkms_device_attach_plane_to_crtc(device, "primary", "crtc");
+ igt_vkms_device_attach_encoder_to_connector(device, "connector", "encoder");
+ igt_vkms_device_attach_crtc_to_encoder(device, "encoder", "crtc");
+
+ igt_vkms_enable(device);
+ igt_assert(igt_vkms_is_enabled(device));
+
+ igt_vkms_disable(device);
+ igt_assert(!igt_vkms_is_enabled(device));
+}
igt_main
{
@@ -72,6 +171,39 @@ igt_main
igt_vkms_device_destroy(&device);
}
+ igt_describe("Registering a CRTC with no primary fails");
+ igt_subtest("no_primary")
+ {
+ igt_vkms_device_create(&device, "no-primary");
+ vkms_crtc_no_primary_test(&device);
+ igt_vkms_device_destroy(&device);
+ }
+
+
+ igt_describe("Can create a device with multiple overlays");
+ igt_subtest("multiple_overlays_device")
+ {
+ igt_vkms_device_create(&device, "multiple-overlays-device");
+ vkms_multiple_overlays_test(&device);
+ igt_vkms_device_destroy(&device);
+ }
+
+ igt_describe("Can create a device with multiple displays");
+ igt_subtest("multiple_displays_device")
+ {
+ igt_vkms_device_create(&device, "multiple-displays-device");
+ vkms_multiple_displays_test(&device);
+ igt_vkms_device_destroy(&device);
+ }
+
+ igt_describe("Disable the device");
+ igt_subtest("disable_device")
+ {
+ igt_vkms_device_create(&device, "device-disable");
+ disable_device(&device);
+ igt_vkms_device_destroy(&device);
+ }
+
igt_fixture
{
igt_require_vkms();
--
2.40.1
prev parent reply other threads:[~2023-09-01 9:28 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-01 9:28 [igt-dev] [PATCH i-g-t 0/4] Add vkms configfs testing Marius Vlad
2023-09-01 9:28 ` [igt-dev] [PATCH i-g-t 1/5] lib/drmtest: Add VKMS as a known driver type Marius Vlad
2023-09-01 9:28 ` [igt-dev] [PATCH i-g-t 2/5] lib/confifs: Add helpers for mounting/unmounting configfs Marius Vlad
2023-09-01 9:28 ` [igt-dev] [PATCH i-g-t 3/5] tests/vkms: Add a small library for VKMS testing Marius Vlad
2023-09-01 9:28 ` Marius Vlad [this message]
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=20230901092819.16924-5-marius.vlad@collabora.com \
--to=marius.vlad@collabora.com \
--cc=brpol@chromium.org \
--cc=daniel@ffwll.ch \
--cc=igormtorrente@gmail.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=seanpaul@chromium.org \
--cc=tzimmermann@suse.de \
--cc=yixie@chromium.org \
/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