[PATCH 2/5] rust: drm: add connector abstraction
Albert Esteve <[email protected]>
| Newsgroups | org.kernel.vger.rust-for-linux,org.freedesktop.lists.dri-devel,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Add DRM Connector abstraction wrapping `struct drm_connector`. Used by the DRM panel abstractions added in the following patch. Since it is merely used as a raw pointer and managed internally in the panel's C functions, the Connector does not need to expose anything else for now. Signed-off-by: Albert Esteve <[email protected]> --- rust/bindings/bindings_helper.h | 1 + rust/kernel/drm/connector.rs | 33 +++++++++++++++++++++++++++++++++ rust/kernel/drm/mod.rs | 1 + 3 files changed, 35 insertions(+) diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h index 1124785e210b3..7f3030ac0feb6 100644 --- a/rust/bindings/bindings_helper.h +++ b/rust/bindings/bindings_helper.h @@ -30,6 +30,7 @@ #include <linux/acpi.h> #include <linux/gpu_buddy.h> +#include <drm/drm_connector.h> #include <drm/drm_device.h> #include <drm/drm_drv.h> #include <drm/drm_file.h> diff --git a/rust/kernel/drm/connector.rs b/rust/kernel/drm/connector.rs new file mode 100644 index 0000000000000..b3b36644375dd --- /dev/null +++ b/rust/kernel/drm/connector.rs @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! DRM connector abstractions. +//! +//! C header: [`include/drm/drm_connector.h`](srctree/include/drm/drm_connector.h) + +use crate::{bindings, types::Opaque}; + +/// A DRM connector (`struct drm_connector`). +/// +/// # Invariants +/// +/// The inner pointer is always a valid, non-null pointer to a `struct drm_connector`. +#[repr(transparent)] +pub struct Connector(Opaque<bindings::drm_connector>); + +impl Connector { + /// Creates a reference to a [`Connector`] from a raw pointer. + /// + /// # Safety + /// + /// `ptr` must be a valid, non-null pointer to a `struct drm_connector` that + /// remains valid for at least the lifetime `'a`. + pub unsafe fn from_raw<'a>(ptr: *mut bindings::drm_connector) -> &'a Self { + // SAFETY: Caller guarantees `ptr` is valid and lives for `'a`. + unsafe { &*ptr.cast() } + } + + /// Returns the raw pointer to the underlying `struct drm_connector`. + pub fn as_raw(&self) -> *mut bindings::drm_connector { + self.0.get() + } +} diff --git a/rust/kernel/drm/mod.rs b/rust/kernel/drm/mod.rs index a66e7166f66b5..672ea8728e1c3 100644 --- a/rust/kernel/drm/mod.rs +++ b/rust/kernel/drm/mod.rs @@ -2,6 +2,7 @@ //! DRM subsystem abstractions. +pub mod connector; pub mod device; pub mod driver; pub mod file; -- 2.55.0