From: Jeevan B <jeevan.b@intel.com>
To: igt-dev@lists.freedesktop.org
Cc: arun.r.murthy@intel.com, Jeevan B <jeevan.b@intel.com>
Subject: [PATCH i-g-t 3/3] RFC: tests/kms_atomic_error_code: Add tests for atomic failure reporting
Date: Thu, 9 Apr 2026 15:06:39 +0530 [thread overview]
Message-ID: <20260409093639.27449-4-jeevan.b@intel.com> (raw)
In-Reply-To: <20260409093639.27449-1-jeevan.b@intel.com>
This test validates that, when supported by the kernel, atomic commit
failures that occur during state validation return meaningful failure
codes instead of only -EINVAL. The test checks common failure classes
such as invalid API usage, async property changes, full modeset
requirements, and bandwidth-related limitations.
The test requires DRM_CAP_ATOMIC_ERROR_REPORTING and is skipped entirely
when the capability is not exposed by the driver. Subtests that depend
on optional or hardware-specific behavior skip gracefully when the
kernel does not reach the relevant validation stage.
Signed-off-by: Jeevan B <jeevan.b@intel.com>
---
tests/kms_atomic_error.c | 156 +++++++++++++++++++++++++++++++++++++++
tests/meson.build | 1 +
2 files changed, 157 insertions(+)
create mode 100644 tests/kms_atomic_error.c
diff --git a/tests/kms_atomic_error.c b/tests/kms_atomic_error.c
new file mode 100644
index 000000000..fe62d2ce0
--- /dev/null
+++ b/tests/kms_atomic_error.c
@@ -0,0 +1,156 @@
+/**
+ * TEST: kms_atomic_error_code
+ * Category: KMS
+ * Functionality: Atomic
+ * Mega-feature: Atomic error reporting
+ *
+ * SUBTEST: invalid-api-usage
+ * Description: Verify that invalid atomic API usage is reported with
+ * DRM_MODE_ATOMIC_INVALID_API_USAGE.
+ *
+ * SUBTEST: need-full-modeset
+ * Description: Verify that atomic commits which require a full modeset
+ * are reported with DRM_MODE_ATOMIC_NEED_FULL_MODESET.
+ *
+ * SUBTEST: async-prop-changed
+ * Description: Verify that modifying non async-safe properties in an
+ * async atomic commit is reported with
+ * DRM_MODE_ATOMIC_ASYNC_PROP_CHANGED.
+ *
+ * SUBTEST: bandwidth-errors
+ * Description: Verify that atomic commit failures caused by bandwidth or
+ * resource limitations are reported using one of the
+ * bandwidth-related atomic failure codes.
+ */
+
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "igt.h"
+#include "drm.h"
+#include "drmtest.h"
+#include "ioctl_wrappers.h"
+
+IGT_TEST_DESCRIPTION("Validate DRM atomic failure error codes");
+
+typedef struct {
+ int drm_fd;
+} data_t;
+
+static void init_atomic_ioc(struct drm_mode_atomic *ioc,
+ struct drm_mode_atomic_err_code *err)
+{
+ memset(ioc, 0, sizeof(*ioc));
+ memset(err, 0, sizeof(*err));
+
+ ioc->reserved = to_user_pointer(err);
+}
+
+static void test_invalid_api_usage(data_t *data)
+{
+ struct drm_mode_atomic ioc;
+ struct drm_mode_atomic_err_code err;
+
+ init_atomic_ioc(&ioc, &err);
+
+ ioc.flags = 0xdeadbeef;
+
+ do_ioctl_err(data->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EINVAL);
+
+ igt_assert_eq(err.failure_code,
+ DRM_MODE_ATOMIC_INVALID_API_USAGE);
+}
+
+static void test_need_full_modeset(data_t *data)
+{
+ struct drm_mode_atomic ioc;
+ struct drm_mode_atomic_err_code err;
+ int ret;
+
+ init_atomic_ioc(&ioc, &err);
+
+ ret = drmIoctl(data->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc);
+
+ if (ret == 0)
+ igt_skip("Atomic commit succeeded; full modeset not required\n");
+
+ igt_assert_eq(err.failure_code,
+ DRM_MODE_ATOMIC_NEED_FULL_MODESET);
+}
+
+static void test_async_prop_changed(data_t *data)
+{
+ struct drm_mode_atomic ioc;
+ struct drm_mode_atomic_err_code err;
+
+ igt_require(igt_has_drm_cap(data->drm_fd,
+ DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP));
+
+ init_atomic_ioc(&ioc, &err);
+
+ ioc.flags = DRM_MODE_ATOMIC_NONBLOCK;
+
+ do_ioctl_err(data->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EINVAL);
+
+ igt_assert_eq(err.failure_code,
+ DRM_MODE_ATOMIC_ASYNC_PROP_CHANGED);
+}
+
+static void test_bandwidth_errors(data_t *data)
+{
+ struct drm_mode_atomic ioc;
+ struct drm_mode_atomic_err_code err;
+ int ret;
+
+ init_atomic_ioc(&ioc, &err);
+
+ ret = drmIoctl(data->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc);
+
+ if (ret == 0)
+ igt_skip("Platform satisfies bandwidth constraints\n");
+
+ switch (err.failure_code) {
+ case DRM_MODE_ATOMIC_SCANOUT_BW:
+ case DRM_MODE_ATTOMIC_CONNECTOR_BW:
+ case DRM_MODE_ATTOMIC_PIPE_BW:
+ case DRM_MODE_ATOMIC_MEMORY_DOMAIN:
+ break;
+ default:
+ igt_assert_f(false,
+ "Unexpected atomic failure code: %llu\n",
+ err.failure_code);
+ }
+}
+
+int igt_main()
+{
+ data_t data = {};
+
+ igt_fixture() {
+ data.drm_fd = drm_open_driver_master(DRIVER_ANY);
+
+ igt_require_f(
+ igt_has_drm_cap(data.drm_fd,
+ DRM_CAP_ATOMIC_ERROR_REPORTING),
+ "DRM atomic error code reporting not supported\n");
+ }
+
+ igt_subtest("invalid-api-usage")
+ test_invalid_api_usage(&data);
+
+ igt_subtest("need-full-modeset")
+ test_need_full_modeset(&data);
+
+ igt_subtest("async-prop-changed")
+ test_async_prop_changed(&data);
+
+ igt_subtest("bandwidth-errors")
+ test_bandwidth_errors(&data);
+
+ igt_fixture() {
+ close(data.drm_fd);
+ }
+
+ igt_exit();
+}
diff --git a/tests/meson.build b/tests/meson.build
index 26d9345ec..1bb50ef96 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -21,6 +21,7 @@ test_progs = [
'kms_addfb_basic',
'kms_async_flips',
'kms_atomic',
+ 'kms_atomic_error',
'kms_atomic_interruptible',
'kms_atomic_transition',
'kms_bw',
--
2.43.0
next prev parent reply other threads:[~2026-04-09 9:39 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-09 9:36 [PATCH i-g-t 0/3] RFC: Add tests for atomic failure error reporting Jeevan B
2026-04-09 9:36 ` [PATCH i-g-t 1/3] DONT_MERGE: include/drm-uapi: Add atomic_ioctl error codes Jeevan B
2026-04-09 9:36 ` [PATCH i-g-t 2/3] DONT_MERGE: include/drm-uapi: Add ERROR_REPORTING capability Jeevan B
2026-04-09 9:36 ` Jeevan B [this message]
2026-04-10 2:49 ` ✓ i915.CI.BAT: success for RFC: Add tests for atomic failure error reporting Patchwork
2026-04-10 2:50 ` ✓ Xe.CI.BAT: " Patchwork
2026-04-10 6:48 ` ✗ Xe.CI.FULL: failure " Patchwork
2026-04-10 21:50 ` ✗ i915.CI.Full: " 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=20260409093639.27449-4-jeevan.b@intel.com \
--to=jeevan.b@intel.com \
--cc=arun.r.murthy@intel.com \
--cc=igt-dev@lists.freedesktop.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.