[PATCH 5/5] rust: drm: add KUnit tests for panel
From: Albert Esteve
Date: Mon Aug 17 2026 - 07:44:34 EST
Add a test module to verify basic data type conversions
and layout. The tests covers:
- PanelOrientation and ConnectorType: TryFrom conversion for valid
values and also out-of-range invalid inputs.
- PanelContainer: layout invariants (offset, alignment, size) on which
Panel::new relies on for memory access.
Tests are gated on CONFIG_RUST_DRM_PANEL_KUNIT_TEST.
Signed-off-by: Albert Esteve <aesteve@xxxxxxxxxx>
---
rust/kernel/Kconfig.test | 10 ++++++
rust/kernel/drm/panel.rs | 87 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 97 insertions(+)
diff --git a/rust/kernel/Kconfig.test b/rust/kernel/Kconfig.test
index e6a5c7a795f0f..397b916dca0d4 100644
--- a/rust/kernel/Kconfig.test
+++ b/rust/kernel/Kconfig.test
@@ -83,4 +83,14 @@ config RUST_BITFIELD_KUNIT_TEST
If unsure, say N.
+config RUST_DRM_PANEL_KUNIT_TEST
+ bool "KUnit tests for Rust panel API" if !KUNIT_ALL_TESTS
+ default KUNIT_ALL_TESTS
+ help
+ This option enables KUnit tests for the Rust panel API.
+ These are only for development and testing, not for regular
+ kernel use cases.
+
+ If unsure, say N.
+
endif
diff --git a/rust/kernel/drm/panel.rs b/rust/kernel/drm/panel.rs
index 8f87774e06ed7..3da203c39edd6 100644
--- a/rust/kernel/drm/panel.rs
+++ b/rust/kernel/drm/panel.rs
@@ -595,3 +595,90 @@ pub(crate) const fn build() -> &'static bindings::drm_panel_funcs {
&Self::VTABLE
}
}
+
+#[cfg(CONFIG_RUST_DRM_PANEL_KUNIT_TEST)]
+#[macros::kunit_tests(rust_kernel_drm_panel)]
+mod tests {
+ use super::*;
+ use core::mem::{align_of, offset_of, size_of, ManuallyDrop, MaybeUninit};
+
+ struct TestData {
+ _ptr: *const u8,
+ _byte: u8,
+ }
+
+ #[test]
+ fn panel_orientation() {
+ // Test valid values.
+ assert!(matches!(
+ PanelOrientation::try_from(-1),
+ Ok(PanelOrientation::Unknown)
+ ));
+ assert!(matches!(
+ PanelOrientation::try_from(0),
+ Ok(PanelOrientation::Normal)
+ ));
+ assert!(matches!(
+ PanelOrientation::try_from(1),
+ Ok(PanelOrientation::BottomUp)
+ ));
+ assert!(matches!(
+ PanelOrientation::try_from(2),
+ Ok(PanelOrientation::LeftUp)
+ ));
+ assert!(matches!(
+ PanelOrientation::try_from(3),
+ Ok(PanelOrientation::RightUp)
+ ));
+
+ // Test invalid values.
+ assert!(PanelOrientation::try_from(4).is_err());
+ assert!(PanelOrientation::try_from(-2).is_err());
+ }
+
+ #[test]
+ fn connector_type() {
+ // Test valid values.
+ assert!(matches!(
+ ConnectorType::try_from(0),
+ Ok(ConnectorType::Unknown)
+ ));
+ assert!(matches!(
+ ConnectorType::try_from(10),
+ Ok(ConnectorType::DisplayPort)
+ ));
+ assert!(matches!(
+ ConnectorType::try_from(14),
+ Ok(ConnectorType::eDP)
+ ));
+ assert!(matches!(
+ ConnectorType::try_from(16),
+ Ok(ConnectorType::DSI)
+ ));
+ assert!(matches!(
+ ConnectorType::try_from(20),
+ Ok(ConnectorType::USB)
+ ));
+
+ // Test invalid values.
+ assert!(ConnectorType::try_from(21).is_err());
+ }
+
+ #[test]
+ fn panel_container_layout() {
+ assert_eq!(offset_of!(PanelContainer<TestData>, data), 0);
+
+ assert_eq!(size_of::<ManuallyDrop<TestData>>(), size_of::<TestData>());
+
+ let panel_offset = offset_of!(PanelContainer<TestData>, panel);
+ assert_eq!(
+ panel_offset % align_of::<MaybeUninit<bindings::drm_panel>>(),
+ 0
+ );
+
+ assert!(
+ size_of::<PanelContainer<TestData>>()
+ >= panel_offset + size_of::<bindings::drm_panel>()
+ );
+ }
+}
--
2.55.0