All of lore.kernel.org
 help / color / mirror / Atom feed
From: Danilo Krummrich <dakr@kernel.org>
To: gregkh@linuxfoundation.org, rafael@kernel.org,
	bhelgaas@google.com, ojeda@kernel.org, alex.gaynor@gmail.com,
	boqun.feng@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com,
	benno.lossin@proton.me, tmgross@umich.edu,
	a.hindborg@samsung.com, aliceryhl@google.com, airlied@gmail.com,
	fujita.tomonori@gmail.com, lina@asahilina.net,
	pstanner@redhat.com, ajanulgu@redhat.com, lyude@redhat.com,
	robh@kernel.org, daniel.almeida@collabora.com,
	saravanak@google.com, dirk.behme@de.bosch.com, j@jannau.net,
	fabien.parent@linaro.org, chrisi.schrefl@gmail.com,
	paulmck@kernel.org
Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-pci@vger.kernel.org, devicetree@vger.kernel.org,
	rcu@vger.kernel.org, Danilo Krummrich <dakr@kernel.org>
Subject: [PATCH v6 12/16] rust: of: add `of::DeviceId` abstraction
Date: Thu, 12 Dec 2024 17:33:43 +0100	[thread overview]
Message-ID: <20241212163357.35934-13-dakr@kernel.org> (raw)
In-Reply-To: <20241212163357.35934-1-dakr@kernel.org>

`of::DeviceId` is an abstraction around `struct of_device_id`.

This is used by subsequent patches, in particular the platform bus
abstractions, to create OF device ID tables.

Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
---
 MAINTAINERS        |  1 +
 rust/kernel/lib.rs |  1 +
 rust/kernel/of.rs  | 60 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 62 insertions(+)
 create mode 100644 rust/kernel/of.rs

diff --git a/MAINTAINERS b/MAINTAINERS
index b15eb7c6b23f..025a279ac8ca 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -17502,6 +17502,7 @@ T:	git git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git
 F:	Documentation/ABI/testing/sysfs-firmware-ofw
 F:	drivers/of/
 F:	include/linux/of*.h
+F:	rust/kernel/of.rs
 F:	scripts/dtc/
 F:	tools/testing/selftests/dt/
 K:	of_overlay_notifier_
diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
index 1dc7eda6b480..27f914b0769b 100644
--- a/rust/kernel/lib.rs
+++ b/rust/kernel/lib.rs
@@ -56,6 +56,7 @@
 pub mod miscdevice;
 #[cfg(CONFIG_NET)]
 pub mod net;
+pub mod of;
 pub mod page;
 pub mod pid_namespace;
 pub mod prelude;
diff --git a/rust/kernel/of.rs b/rust/kernel/of.rs
new file mode 100644
index 000000000000..04f2d8ef29cb
--- /dev/null
+++ b/rust/kernel/of.rs
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: GPL-2.0
+
+//! Device Tree / Open Firmware abstractions.
+
+use crate::{bindings, device_id::RawDeviceId, prelude::*};
+
+/// IdTable type for OF drivers.
+pub type IdTable<T> = &'static dyn kernel::device_id::IdTable<DeviceId, T>;
+
+/// An open firmware device id.
+#[repr(transparent)]
+#[derive(Clone, Copy)]
+pub struct DeviceId(bindings::of_device_id);
+
+// SAFETY:
+// * `DeviceId` is a `#[repr(transparent)` wrapper of `struct of_device_id` and does not add
+//   additional invariants, so it's safe to transmute to `RawType`.
+// * `DRIVER_DATA_OFFSET` is the offset to the `data` field.
+unsafe impl RawDeviceId for DeviceId {
+    type RawType = bindings::of_device_id;
+
+    const DRIVER_DATA_OFFSET: usize = core::mem::offset_of!(bindings::of_device_id, data);
+
+    fn index(&self) -> usize {
+        self.0.data as _
+    }
+}
+
+impl DeviceId {
+    /// Create a new device id from an OF 'compatible' string.
+    pub const fn new(compatible: &'static CStr) -> Self {
+        let src = compatible.as_bytes_with_nul();
+        // Replace with `bindings::of_device_id::default()` once stabilized for `const`.
+        // SAFETY: FFI type is valid to be zero-initialized.
+        let mut of: bindings::of_device_id = unsafe { core::mem::zeroed() };
+
+        // TODO: Use `clone_from_slice` once the corresponding types do match.
+        let mut i = 0;
+        while i < src.len() {
+            of.compatible[i] = src[i] as _;
+            i += 1;
+        }
+
+        Self(of)
+    }
+}
+
+/// Create an OF `IdTable` with an "alias" for modpost.
+#[macro_export]
+macro_rules! of_device_table {
+    ($table_name:ident, $module_table_name:ident, $id_info_type: ty, $table_data: expr) => {
+        const $table_name: $crate::device_id::IdArray<
+            $crate::of::DeviceId,
+            $id_info_type,
+            { $table_data.len() },
+        > = $crate::device_id::IdArray::new($table_data);
+
+        $crate::module_device_table!("of", $module_table_name, $table_name);
+    };
+}
-- 
2.47.1


  parent reply	other threads:[~2024-12-12 16:36 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-12 16:33 [PATCH v6 00/16] Device / Driver PCI / Platform Rust abstractions Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 01/16] rust: module: add trait `ModuleMetadata` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 02/16] rust: implement generic driver registration Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 03/16] rust: implement `IdArray`, `IdTable` and `RawDeviceId` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 04/16] rust: add rcu abstraction Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 05/16] rust: types: add `Opaque::pin_init` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 06/16] rust: add `Revocable` type Danilo Krummrich
2024-12-18 12:20   ` Benoît du Garreau
2024-12-18 12:38     ` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 07/16] rust: add `io::{Io, IoRaw}` base types Danilo Krummrich
2024-12-16 16:20   ` Danilo Krummrich
2025-02-02 21:19     ` Asahi Lina
2025-02-02 22:20       ` Danilo Krummrich
2025-02-02 22:42         ` Asahi Lina
2024-12-17 20:10   ` Fabien Parent
2024-12-18 12:55     ` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 08/16] rust: add devres abstraction Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 09/16] rust: pci: add basic PCI device / driver abstractions Danilo Krummrich
2024-12-15 12:23   ` Greg KH
2024-12-16 16:24     ` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 10/16] rust: pci: implement I/O mappable `pci::Bar` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 11/16] samples: rust: add Rust PCI sample driver Danilo Krummrich
2024-12-12 16:33 ` Danilo Krummrich [this message]
2024-12-12 16:33 ` [PATCH v6 13/16] rust: driver: implement `Adapter` Danilo Krummrich
2024-12-19 10:53   ` Andreas Hindborg
2024-12-19 15:07     ` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 14/16] rust: platform: add basic platform device / driver abstractions Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 15/16] samples: rust: add Rust platform sample driver Danilo Krummrich
2024-12-15 12:25   ` Greg KH
2024-12-16 16:31     ` Danilo Krummrich
2024-12-16 16:43       ` Miguel Ojeda
2024-12-18 12:49         ` Danilo Krummrich
2024-12-12 16:33 ` [PATCH v6 16/16] MAINTAINERS: add Danilo to DRIVER CORE Danilo Krummrich
2024-12-13  7:06 ` [PATCH v6 00/16] Device / Driver PCI / Platform Rust abstractions Dirk Behme
2024-12-16 16:16   ` Danilo Krummrich
2024-12-18 23:46 ` Fabien Parent

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=20241212163357.35934-13-dakr@kernel.org \
    --to=dakr@kernel.org \
    --cc=a.hindborg@samsung.com \
    --cc=airlied@gmail.com \
    --cc=ajanulgu@redhat.com \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=benno.lossin@proton.me \
    --cc=bhelgaas@google.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=chrisi.schrefl@gmail.com \
    --cc=daniel.almeida@collabora.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dirk.behme@de.bosch.com \
    --cc=fabien.parent@linaro.org \
    --cc=fujita.tomonori@gmail.com \
    --cc=gary@garyguo.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=j@jannau.net \
    --cc=lina@asahilina.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=lyude@redhat.com \
    --cc=ojeda@kernel.org \
    --cc=paulmck@kernel.org \
    --cc=pstanner@redhat.com \
    --cc=rafael@kernel.org \
    --cc=rcu@vger.kernel.org \
    --cc=robh@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=saravanak@google.com \
    --cc=tmgross@umich.edu \
    /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.