[RFC PATCH 4/4] rust: drm: expose drm_blend.h and the atomic new-CRTC-state accessor
From: Mike Lothian
Date: Wed Jun 17 2026 - 11:08:27 EST
Two further KMS binding prerequisites used by the in-tree DisplayLink
DL3 (vino) driver, beyond the simple-display-pipe header set:
- drm_blend.h, for drm_plane_create_rotation_property() and the
DRM_MODE_ROTATE_* / DRM_MODE_REFLECT_* constants, so a driver can
attach the standard atomic plane rotation property.
- a rust_helper for drm_atomic_get_new_crtc_state(): it is static
inline in <drm/drm_atomic.h> and so is not callable from Rust
directly. It returns a CRTC's new state within an atomic commit
(NULL when the CRTC is not part of the commit), letting a driver
inspect the proposed configuration from its mode_config
atomic_check(). vino uses it to sum the pixel clocks of all heads
and reject a modeset that would exceed the dock's USB bandwidth.
Signed-off-by: Mike Lothian <mike@xxxxxxxxxxxxxx>
Assisted-by: Claude:claude-opus-4-8 [Claude-Code]
---
rust/bindings/bindings_helper.h | 1 +
rust/helpers/drm.c | 12 ++++++++++++
2 files changed, 13 insertions(+)
diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h
index 5b311944cc14..5ff21c33385e 100644
--- a/rust/bindings/bindings_helper.h
+++ b/rust/bindings/bindings_helper.h
@@ -31,6 +31,7 @@
#include <linux/acpi.h>
#include <linux/gpu_buddy.h>
#include <drm/drm_atomic_helper.h>
+#include <drm/drm_blend.h>
#include <drm/drm_connector.h>
#include <drm/drm_device.h>
#include <drm/drm_drv.h>
diff --git a/rust/helpers/drm.c b/rust/helpers/drm.c
index 65f3f22b0e1d..5087daa23ed8 100644
--- a/rust/helpers/drm.c
+++ b/rust/helpers/drm.c
@@ -1,11 +1,23 @@
// SPDX-License-Identifier: GPL-2.0
+#include <drm/drm_atomic.h>
#include <drm/drm_gem.h>
#include <drm/drm_gem_shmem_helper.h>
#include <drm/drm_vma_manager.h>
#ifdef CONFIG_DRM
+/* Read-only accessor for a CRTC's *new* state within an atomic commit (returns NULL if the CRTC
+ * is not part of the commit). It is static-inline in <drm/drm_atomic.h>, so Rust cannot call it
+ * directly; the vino driver uses it in its combined-bandwidth atomic_check.
+ */
+__rust_helper struct drm_crtc_state *
+rust_helper_drm_atomic_get_new_crtc_state(const struct drm_atomic_commit *state,
+ struct drm_crtc *crtc)
+{
+ return drm_atomic_get_new_crtc_state(state, crtc);
+}
+
__rust_helper void rust_helper_drm_gem_object_get(struct drm_gem_object *obj)
{
drm_gem_object_get(obj);
--
2.54.0