Re: [PATCH v8 1/1] rust: pci: add extended capability and SR-IOV support
"Alexandre Courbot" <[email protected]>
| Newsgroups | org.kernel.vger.rust-for-linux,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci |
|---|---|
| Message-ID | <[email protected]> |
On Tue Aug 18, 2026 at 5:46 PM JST, Zhi Wang wrote: > Rust PCI drivers have no typed interface for locating and accessing PCIe > extended capabilities. > > The SR-IOV extended capability describes VF topology and VF BARs. Expose > this information through the Rust PCI abstraction so drivers can use the > existing typed configuration-space accessors instead of raw bindings. > > Define ExtCapability to associate a capability ID with a register layout, > and add ConfigSpace::find_ext_capability() to locate and project that > layout. Bound the view at the next capability or the end of extended > configuration space. Add ExtSriovRegs and a decoded VF BAR iterator that > reads and validates all six VF BAR register slots up front, yields decoded > BAR addresses and widths in logical order, and keeps the raw > configuration-space slot advancement internal. Since PCI_EXT_CAP_NEXT() is > a function-like macro, expose it through a Rust helper. > > Link: https://lore.kernel.org/rust-for-linux/[email protected]/ > Cc: Alexandre Courbot <[email protected]> > Cc: Gary Guo <[email protected]> > Signed-off-by: Zhi Wang <[email protected]> > --- > rust/helpers/pci.c | 5 + > rust/kernel/pci.rs | 8 + > rust/kernel/pci/cap.rs | 329 +++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 342 insertions(+) > create mode 100644 rust/kernel/pci/cap.rs > > diff --git a/rust/helpers/pci.c b/rust/helpers/pci.c > index 4ebf256dff23..b946b14d79e4 100644 > --- a/rust/helpers/pci.c > +++ b/rust/helpers/pci.c > @@ -24,6 +24,11 @@ __rust_helper bool rust_helper_dev_is_pci(const struct device *dev) > return dev_is_pci(dev); > } > > +__rust_helper u32 rust_helper_pci_ext_cap_next(u32 header) > +{ > + return PCI_EXT_CAP_NEXT(header); > +} > + > #ifndef CONFIG_PCI_IOV > __rust_helper unsigned int > rust_helper_pci_sriov_get_totalvfs(struct pci_dev *pdev) > diff --git a/rust/kernel/pci.rs b/rust/kernel/pci.rs > index 9f19ccd5905c..008c2770a3f3 100644 > --- a/rust/kernel/pci.rs > +++ b/rust/kernel/pci.rs > @@ -32,10 +32,18 @@ > }, > }; > > +mod cap; > mod id; > mod io; > mod irq; > > +pub use self::cap::{ > + ExtCapId, > + ExtCapability, > + ExtSriovCapability, > + ExtSriovRegs, > + ExtSriovVfBar, // > +}; > pub use self::id::{ > Class, > ClassMask, > diff --git a/rust/kernel/pci/cap.rs b/rust/kernel/pci/cap.rs > new file mode 100644 > index 000000000000..ddb3fd73e195 > --- /dev/null > +++ b/rust/kernel/pci/cap.rs > @@ -0,0 +1,329 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +//! PCI extended capability support. > + > +use super::{ > + io::ConfigSpaceBackend, > + ConfigSpace, > + Extended, // > +}; > +use crate::{ > + bindings, > + io::{ > + Io, > + IoBackend, > + Region, // > + }, > + num::Bounded, > + prelude::*, > +}; > + > +/// Number of VF BAR register slots in an SR-IOV capability. > +// CAST: `PCI_SRIOV_NUM_BARS` is the PCIe-specified number of VF BAR register slots and fits in > +// `usize`. > +const NUM_VF_BARS: usize = bindings::PCI_SRIOV_NUM_BARS as usize; > + > +/// PCI extended capability IDs. > +#[repr(transparent)] > +#[derive(Debug, Clone, Copy, PartialEq, Eq)] > +pub struct ExtCapId(u16); > + > +impl ExtCapId { > + /// Single Root I/O Virtualization. > + // CAST: PCI extended capability IDs are 16-bit values defined by the PCIe specification. > + pub const SRIOV: Self = Self(bindings::PCI_EXT_CAP_ID_SRIOV as u16); Coming back to comment on the conclusion: we have settled on a solution [1] to handle this nicely, but it is likely that your series will land before it. So meanwhile, please use the turbofish solution that I initially proposed: pub const SRIOV: Self = Self(casts::u32_into_u16::<{ bindings::PCI_EXT_CAP_ID_SRIOV }>()); While it's a mouthful, [1] does remove `u32_into_u16`, which means we won't miss it and will need to update the code to use `const_as!` when applying. [1] https://lore.kernel.org/all/[email protected]/