mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 02:17:36 -04:00
samples: rust: rust_driver_pci: use HRT lifetime for Bar
Convert the sample driver to SampleDriver<'bound>, taking advantage of the lifetime-parameterized Driver trait. The driver struct holds &'bound pci::Device directly instead of ARef<pci::Device>, and pci::Bar<'bound> directly instead of Devres<pci::Bar>. This removes PinnedDrop, pin_init_scope, and runtime revocation checks on BAR access. Reviewed-by: Eliot Courtney <ecourtney@nvidia.com> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Reviewed-by: Alexandre Courbot <acourbot@nvidia.com> Reviewed-by: Gary Guo <gary@garyguo.net> Link: https://patch.msgid.link/20260525202921.124698-21-dakr@kernel.org Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
@@ -9,7 +9,6 @@
|
||||
Bound,
|
||||
Core, //
|
||||
},
|
||||
devres::Devres,
|
||||
io::{
|
||||
register,
|
||||
register::Array,
|
||||
@@ -17,8 +16,7 @@
|
||||
},
|
||||
num::Bounded,
|
||||
pci,
|
||||
prelude::*,
|
||||
sync::aref::ARef, //
|
||||
prelude::*, //
|
||||
};
|
||||
|
||||
mod regs {
|
||||
@@ -45,7 +43,7 @@ mod regs {
|
||||
pub(super) const END: usize = 0x10;
|
||||
}
|
||||
|
||||
type Bar0 = pci::Bar<'static, { regs::END }>;
|
||||
type Bar0<'bound> = pci::Bar<'bound, { regs::END }>;
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
struct TestIndex(u8);
|
||||
@@ -66,14 +64,14 @@ impl TestIndex {
|
||||
const NO_EVENTFD: Self = Self(0);
|
||||
}
|
||||
|
||||
#[pin_data(PinnedDrop)]
|
||||
struct SampleDriver {
|
||||
pdev: ARef<pci::Device>,
|
||||
#[pin]
|
||||
bar: Devres<Bar0>,
|
||||
struct SampleDriverData<'bound> {
|
||||
pdev: &'bound pci::Device,
|
||||
bar: Bar0<'bound>,
|
||||
index: TestIndex,
|
||||
}
|
||||
|
||||
struct SampleDriver;
|
||||
|
||||
kernel::pci_device_table!(
|
||||
PCI_TABLE,
|
||||
MODULE_PCI_TABLE,
|
||||
@@ -84,8 +82,8 @@ struct SampleDriver {
|
||||
)]
|
||||
);
|
||||
|
||||
impl SampleDriver {
|
||||
fn testdev(index: &TestIndex, bar: &Bar0) -> Result<u32> {
|
||||
impl SampleDriverData<'_> {
|
||||
fn testdev(index: &TestIndex, bar: &Bar0<'_>) -> Result<u32> {
|
||||
// Select the test.
|
||||
bar.write_reg(regs::TEST::zeroed().with_index(*index));
|
||||
|
||||
@@ -140,56 +138,49 @@ fn config_space(pdev: &pci::Device<Bound>) {
|
||||
|
||||
impl pci::Driver for SampleDriver {
|
||||
type IdInfo = TestIndex;
|
||||
type Data<'bound> = Self;
|
||||
type Data<'bound> = SampleDriverData<'bound>;
|
||||
|
||||
const ID_TABLE: pci::IdTable<Self::IdInfo> = &PCI_TABLE;
|
||||
|
||||
fn probe<'bound>(
|
||||
pdev: &'bound pci::Device<Core<'_>>,
|
||||
info: &'bound Self::IdInfo,
|
||||
) -> impl PinInit<Self, Error> + 'bound {
|
||||
pin_init::pin_init_scope(move || {
|
||||
let vendor = pdev.vendor_id();
|
||||
dev_dbg!(
|
||||
pdev,
|
||||
"Probe Rust PCI driver sample (PCI ID: {}, 0x{:x}).\n",
|
||||
vendor,
|
||||
pdev.device_id()
|
||||
);
|
||||
) -> impl PinInit<Self::Data<'bound>, Error> + 'bound {
|
||||
let vendor = pdev.vendor_id();
|
||||
dev_dbg!(
|
||||
pdev,
|
||||
"Probe Rust PCI driver sample (PCI ID: {}, 0x{:x}).\n",
|
||||
vendor,
|
||||
pdev.device_id()
|
||||
);
|
||||
|
||||
pdev.enable_device_mem()?;
|
||||
pdev.set_master();
|
||||
pdev.enable_device_mem()?;
|
||||
pdev.set_master();
|
||||
|
||||
Ok(try_pin_init!(Self {
|
||||
bar: pdev.iomap_region_sized::<{ regs::END }>(0, c"rust_driver_pci")?
|
||||
.into_devres()?,
|
||||
index: *info,
|
||||
_: {
|
||||
let bar = bar.access(pdev.as_ref())?;
|
||||
let bar = pdev.iomap_region_sized::<{ regs::END }>(0, c"rust_driver_pci")?;
|
||||
|
||||
dev_info!(
|
||||
pdev,
|
||||
"pci-testdev data-match count: {}\n",
|
||||
Self::testdev(info, bar)?
|
||||
);
|
||||
Self::config_space(pdev);
|
||||
},
|
||||
pdev: pdev.into(),
|
||||
}))
|
||||
dev_info!(
|
||||
pdev,
|
||||
"pci-testdev data-match count: {}\n",
|
||||
SampleDriverData::testdev(info, &bar)?
|
||||
);
|
||||
SampleDriverData::config_space(pdev);
|
||||
|
||||
Ok(SampleDriverData {
|
||||
pdev,
|
||||
bar,
|
||||
index: *info,
|
||||
})
|
||||
}
|
||||
|
||||
fn unbind(pdev: &pci::Device<Core<'_>>, this: Pin<&Self>) {
|
||||
if let Ok(bar) = this.bar.access(pdev.as_ref()) {
|
||||
// Reset pci-testdev by writing a new test index.
|
||||
bar.write_reg(regs::TEST::zeroed().with_index(this.index));
|
||||
}
|
||||
fn unbind<'bound>(_pdev: &'bound pci::Device<Core<'_>>, this: Pin<&Self::Data<'bound>>) {
|
||||
this.bar
|
||||
.write_reg(regs::TEST::zeroed().with_index(this.index));
|
||||
}
|
||||
}
|
||||
|
||||
#[pinned_drop]
|
||||
impl PinnedDrop for SampleDriver {
|
||||
fn drop(self: Pin<&mut Self>) {
|
||||
impl Drop for SampleDriverData<'_> {
|
||||
fn drop(&mut self) {
|
||||
dev_dbg!(self.pdev, "Remove Rust PCI driver sample.\n");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user