summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanilo Krummrich <dakr@kernel.org>2025-10-21 00:34:30 +0200
committerDanilo Krummrich <dakr@kernel.org>2025-10-29 18:29:32 +0100
commitb0b7301b004301afe920b3d08caa6171dd3f4011 (patch)
treee6ee133d6c8601f866e92eb18f0154bede9ea11f
parent710ac546883c2cae6e8e7b5dcf7757b8a49d75a1 (diff)
samples: rust: auxiliary: illustrate driver interaction
Illustrate how a parent driver of an auxiliary driver can take advantage of the device context guarantees given by the auxiliary bus and subsequently safely derive its device private data. Reviewed-by: Alice Ryhl <aliceryhl@google.com> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Danilo Krummrich <dakr@kernel.org>
-rw-r--r--samples/rust/rust_driver_auxiliary.rs22
1 files changed, 19 insertions, 3 deletions
diff --git a/samples/rust/rust_driver_auxiliary.rs b/samples/rust/rust_driver_auxiliary.rs
index a5d67d4d9e83..5761ea314f44 100644
--- a/samples/rust/rust_driver_auxiliary.rs
+++ b/samples/rust/rust_driver_auxiliary.rs
@@ -5,10 +5,17 @@
//! To make this driver probe, QEMU must be run with `-device pci-testdev`.
use kernel::{
- auxiliary, c_str, device::Core, devres::Devres, driver, error::Error, pci, prelude::*,
+ auxiliary, c_str,
+ device::{Bound, Core},
+ devres::Devres,
+ driver,
+ error::Error,
+ pci,
+ prelude::*,
InPlaceModule,
};
+use core::any::TypeId;
use pin_init::PinInit;
const MODULE_NAME: &CStr = <LocalModule as kernel::ModuleMetadata>::NAME;
@@ -43,6 +50,7 @@ impl auxiliary::Driver for AuxiliaryDriver {
#[pin_data]
struct ParentDriver {
+ private: TypeId,
#[pin]
_reg0: Devres<auxiliary::Registration>,
#[pin]
@@ -63,6 +71,7 @@ impl pci::Driver for ParentDriver {
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),
})
@@ -70,9 +79,10 @@ impl pci::Driver for ParentDriver {
}
impl ParentDriver {
- fn connect(adev: &auxiliary::Device) -> Result {
+ fn connect(adev: &auxiliary::Device<Bound>) -> Result {
let dev = adev.parent();
- let pdev: &pci::Device = dev.try_into()?;
+ let pdev: &pci::Device<Bound> = dev.try_into()?;
+ let drvdata = dev.drvdata::<Self>()?;
dev_info!(
dev,
@@ -82,6 +92,12 @@ impl ParentDriver {
pdev.device_id()
);
+ dev_info!(
+ dev,
+ "We have access to the private data of {:?}.\n",
+ drvdata.private
+ );
+
Ok(())
}
}