summaryrefslogtreecommitdiff
path: root/samples/rust
diff options
context:
space:
mode:
authorDanilo Krummrich <dakr@kernel.org>2026-05-05 17:23:08 +0200
committerDanilo Krummrich <dakr@kernel.org>2026-05-11 15:26:12 +0200
commitfd3b87ff0232f46e1ad53a48609a3853c8757c6c (patch)
treeb808a8a7b0ef53891648e5ac0fef90b3db75d436 /samples/rust
parentabb21500e7e5dcf2d1b1a4a02b2ee77b3d5061b6 (diff)
rust: auxiliary: add registration data to auxiliary devices
Add a registration_data pointer to struct auxiliary_device, allowing the registering (parent) driver to attach private data to the device at registration time and retrieve it later when called back by the auxiliary (child) driver. By tying the data to the device's registration, Rust drivers can bind the lifetime of device resources to it, since the auxiliary bus guarantees that the parent driver remains bound while the auxiliary device is bound. On the Rust side, Registration<T> takes ownership of the data via ForeignOwnable. A TypeId is stored alongside the data for runtime type checking, making Device::registration_data<T>() a safe method. Reviewed-by: Alice Ryhl <aliceryhl@google.com> Link: https://patch.msgid.link/20260505152400.3905096-3-dakr@kernel.org Signed-off-by: Danilo Krummrich <dakr@kernel.org>
Diffstat (limited to 'samples/rust')
-rw-r--r--samples/rust/rust_driver_auxiliary.rs40
1 files changed, 25 insertions, 15 deletions
diff --git a/samples/rust/rust_driver_auxiliary.rs b/samples/rust/rust_driver_auxiliary.rs
index 5c5a5105a3ff..319ef734c02b 100644
--- a/samples/rust/rust_driver_auxiliary.rs
+++ b/samples/rust/rust_driver_auxiliary.rs
@@ -17,8 +17,6 @@ use kernel::{
InPlaceModule, //
};
-use core::any::TypeId;
-
const MODULE_NAME: &CStr = <LocalModule as kernel::ModuleMetadata>::NAME;
const AUXILIARY_NAME: &CStr = c"auxiliary";
@@ -49,13 +47,13 @@ impl auxiliary::Driver for AuxiliaryDriver {
}
}
-#[pin_data]
+struct Data {
+ index: u32,
+}
+
struct ParentDriver {
- private: TypeId,
- #[pin]
- _reg0: Devres<auxiliary::Registration>,
- #[pin]
- _reg1: Devres<auxiliary::Registration>,
+ _reg0: Devres<auxiliary::Registration<Data>>,
+ _reg1: Devres<auxiliary::Registration<Data>>,
}
kernel::pci_device_table!(
@@ -71,10 +69,21 @@ impl pci::Driver for ParentDriver {
const ID_TABLE: pci::IdTable<Self::IdInfo> = &PCI_TABLE;
fn probe(pdev: &pci::Device<Core>, _info: &Self::IdInfo) -> impl PinInit<Self, Error> {
- try_pin_init!(Self {
- private: TypeId::of::<Self>(),
- _reg0 <- auxiliary::Registration::new(pdev.as_ref(), AUXILIARY_NAME, 0, MODULE_NAME),
- _reg1 <- auxiliary::Registration::new(pdev.as_ref(), AUXILIARY_NAME, 1, MODULE_NAME),
+ Ok(Self {
+ _reg0: auxiliary::Registration::new(
+ pdev.as_ref(),
+ AUXILIARY_NAME,
+ 0,
+ MODULE_NAME,
+ Data { index: 0 },
+ )?,
+ _reg1: auxiliary::Registration::new(
+ pdev.as_ref(),
+ AUXILIARY_NAME,
+ 1,
+ MODULE_NAME,
+ Data { index: 1 },
+ )?,
})
}
}
@@ -83,7 +92,8 @@ impl ParentDriver {
fn connect(adev: &auxiliary::Device<Bound>) -> Result {
let dev = adev.parent();
let pdev: &pci::Device<Bound> = dev.try_into()?;
- let drvdata = dev.drvdata::<Self>()?;
+
+ let data = adev.registration_data::<Data>()?;
dev_info!(
dev,
@@ -95,8 +105,8 @@ impl ParentDriver {
dev_info!(
dev,
- "We have access to the private data of {:?}.\n",
- drvdata.private
+ "Connected to auxiliary device with index {}.\n",
+ data.index
);
Ok(())