From: Peter Colberg <[email protected]> Wrap pci_enable_sriov() and pci_disable_sriov() on Device<CoreInternal> for use by the SR-IOV callback tokens and their rollback guard. Keep these operations internal so drivers can only enable or disable VFs through the callback-scoped API introduced later in this series.
Suggested-by: Danilo Krummrich <[email protected]> Signed-off-by: Peter Colberg <[email protected]> Signed-off-by: Zhi Wang <[email protected]> Signed-off-by: Simon Song <[email protected]> --- rust/kernel/pci.rs | 2 ++ rust/kernel/pci/iov.rs | 48 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 rust/kernel/pci/iov.rs diff --git a/rust/kernel/pci.rs b/rust/kernel/pci.rs index f47974d3e76..e522fdddc34 100644 --- a/rust/kernel/pci.rs +++ b/rust/kernel/pci.rs @@ -36,6 +36,8 @@ mod cap; mod id; mod io; +#[cfg(CONFIG_PCI_IOV)] +mod iov; mod irq; pub use self::cap::{ diff --git a/rust/kernel/pci/iov.rs b/rust/kernel/pci/iov.rs new file mode 100644 index 00000000000..6f8f95ed618 --- /dev/null +++ b/rust/kernel/pci/iov.rs @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Abstractions for PCI Single Root I/O Virtualization (SR-IOV) drivers. + +use super::Device; + +use crate::{ + bindings, + device, + error::to_result, + prelude::*, // +}; + +impl Device<device::CoreInternal<'_>> { + /// Enable the Single Root I/O Virtualization (SR-IOV) capability for this device, + /// where `nr_virtfn` is number of Virtual Functions (VF) to enable. + #[inline] + #[expect(dead_code)] + pub(crate) fn enable_sriov(&self, nr_virtfn: u16) -> Result { + // SAFETY: + // - `self.as_raw` returns a valid pointer to a `struct pci_dev`. + // + // - `pci_enable_sriov()` checks that the enable operation is valid: + // - the device is a Physical Function (PF), + // - SR-IOV is currently disabled, and + // - `nr_virtfn` does not exceed the total number of supported VFs. + // + // - The [`CoreInternal`] device context inherits from the [`Bound`] device context, + // which guarantees that the PF device is bound to a driver. + to_result(unsafe { bindings::pci_enable_sriov(self.as_raw(), nr_virtfn.into()) }) + } + + /// Disable the Single Root I/O Virtualization (SR-IOV) capability for this device. + #[inline] + #[expect(dead_code)] + pub(crate) fn disable_sriov(&self) { + // SAFETY: + // - `self.as_raw` returns a valid pointer to a `struct pci_dev`. + // + // - `pci_disable_sriov()` checks that the disable operation is valid: + // - the device is a Physical Function (PF), and + // - SR-IOV is currently enabled. + // + // - The [`CoreInternal`] device context inherits from the [`Bound`] device context, + // which guarantees that the PF device is bound to a driver. + unsafe { bindings::pci_disable_sriov(self.as_raw()) }; + } +} -- 2.43.7
