Commit b0b7301b authored by Danilo Krummrich's avatar Danilo Krummrich
Browse files

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: default avatarAlice Ryhl <aliceryhl@google.com>
Reviewed-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarDanilo Krummrich <dakr@kernel.org>
parent 710ac546
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -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 @@ fn probe(adev: &auxiliary::Device<Core>, _info: &Self::IdInfo) -> impl PinInit<S

#[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 @@ fn probe(pdev: &pci::Device<Core>, _info: &Self::IdInfo) -> impl PinInit<Self, E
}

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 @@ fn connect(adev: &auxiliary::Device) -> Result {
            pdev.device_id()
        );

        dev_info!(
            dev,
            "We have access to the private data of {:?}.\n",
            drvdata.private
        );

        Ok(())
    }
}