Add a method to check if a PCI device is a Virtual Function (VF). This allows Rust drivers to determine whether a device is a VF created through SR-IOV. This is required in order to implement VFIO, because drivers such as NovaCore must only bind to Physical Functions (PFs) or regular PCI devices. The VFs must be left unclaimed, so that a VFIO kernel module can claim them.
is_virtfn() returns true if the device's is_virtfn flag is set, matching the behavior of the C code. Signed-off-by: John Hubbard <[email protected]> --- rust/kernel/pci.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rust/kernel/pci.rs b/rust/kernel/pci.rs index 7fcc5f6022c1..476b80f05905 100644 --- a/rust/kernel/pci.rs +++ b/rust/kernel/pci.rs @@ -496,6 +496,12 @@ pub fn resource_start(&self, bar: u32) -> Result<bindings::resource_size_t> { Ok(unsafe { bindings::pci_resource_start(self.as_raw(), bar.try_into()?) }) } + /// Returns true if this device is a Virtual Function (VF). + pub fn is_virtfn(&self) -> bool { + // SAFETY: `self.as_raw` is a valid pointer to a `struct pci_dev`. + unsafe { (*self.as_raw()).is_virtfn() != 0 } + } + /// Returns the size of the given PCI bar resource. pub fn resource_len(&self, bar: u32) -> Result<bindings::resource_size_t> { if !Bar::index_is_valid(bar) { -- 2.51.0
