[PATCH v6 01/11] rust: pci: add internal SR-IOV enable and disable helpers

From: Simon Song

Date: Wed Nov 11 2026 - 17:44:53 EST


From: Peter Colberg <peter@xxxxxxxxxxx>

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.

Stub both helpers when CONFIG_PCI_IOV is disabled, so the SR-IOV API
builds regardless and drivers need no configuration guards.

Suggested-by: Danilo Krummrich <dakr@xxxxxxxxxx>
Signed-off-by: Peter Colberg <peter@xxxxxxxxxxx>
Signed-off-by: Zhi Wang <zhiw@xxxxxxxxxx>
Reviewed-by: Alexandre Courbot <acourbot@xxxxxxxxxx>
Signed-off-by: Simon Song <xinmengs@xxxxxxxxxx>
---
rust/helpers/pci.c | 11 ++++++++++
rust/kernel/pci.rs | 1 +
rust/kernel/pci/iov.rs | 48 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 60 insertions(+)
create mode 100644 rust/kernel/pci/iov.rs

diff --git a/rust/helpers/pci.c b/rust/helpers/pci.c
index a8540f90b13c..a87b5a77efef 100644
--- a/rust/helpers/pci.c
+++ b/rust/helpers/pci.c
@@ -41,6 +41,17 @@ __rust_helper u32 rust_helper_pci_ext_cap_next(u32 header)
}

#ifndef CONFIG_PCI_IOV
+__rust_helper int rust_helper_pci_enable_sriov(struct pci_dev *pdev,
+ int nr_virtfn)
+{
+ return pci_enable_sriov(pdev, nr_virtfn);
+}
+
+__rust_helper void rust_helper_pci_disable_sriov(struct pci_dev *pdev)
+{
+ pci_disable_sriov(pdev);
+}
+
__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 769d01d23429..8a4af261d1d4 100644
--- a/rust/kernel/pci.rs
+++ b/rust/kernel/pci.rs
@@ -36,6 +36,7 @@
mod cap;
mod id;
mod io;
+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 000000000000..18e42b2d3965
--- /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