[PATCH 5/5] rust: pci: expose the allocated interrupt type
From: Danilo Krummrich
Date: Mon Aug 10 2026 - 18:53:12 EST
Add irq_type() on IrqVectorRegistration, wrapping the new pci_irq_type()
C function. A driver whose interrupt acknowledgment depends on the type
(MSI-X vs MSI vs INTx) queries it here rather than assuming which type
the PCI core selected.
Suggested-by: John Hubbard <jhubbard@xxxxxxxxxx>
Link: https://lore.kernel.org/all/20260808031120.363869-4-jhubbard@xxxxxxxxxx/
Signed-off-by: Danilo Krummrich <dakr@xxxxxxxxxx>
---
rust/helpers/pci.c | 5 +++++
rust/kernel/pci/irq.rs | 17 +++++++++++++++++
2 files changed, 22 insertions(+)
diff --git a/rust/helpers/pci.c b/rust/helpers/pci.c
index e44905317d75..23b06becb448 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 unsigned int rust_helper_pci_irq_type(struct pci_dev *pdev)
+{
+ return pci_irq_type(pdev);
+}
+
#ifndef CONFIG_PCI_MSI
__rust_helper int rust_helper_pci_alloc_irq_vectors(struct pci_dev *dev,
unsigned int min_vecs,
diff --git a/rust/kernel/pci/irq.rs b/rust/kernel/pci/irq.rs
index d69ab6435a80..618310e4535c 100644
--- a/rust/kernel/pci/irq.rs
+++ b/rust/kernel/pci/irq.rs
@@ -36,6 +36,16 @@ const fn as_raw(self) -> u32 {
IrqType::MsiX => bindings::PCI_IRQ_MSIX,
}
}
+
+ /// Construct from raw value.
+ #[inline]
+ const fn from_raw(raw: u32) -> Self {
+ match raw {
+ bindings::PCI_IRQ_MSIX => IrqType::MsiX,
+ bindings::PCI_IRQ_MSI => IrqType::Msi,
+ _ => IrqType::Intx,
+ }
+ }
}
/// Set of IRQ types that can be used for PCI interrupt allocation.
@@ -99,6 +109,13 @@ pub fn vector_count(&self) -> usize {
self.count.get()
}
+ /// Returns the interrupt type the PCI core selected for this allocation.
+ #[inline]
+ pub fn irq_type(&self) -> IrqType {
+ // SAFETY: `self.dev.as_raw()` is a valid pointer to a `struct pci_dev`.
+ IrqType::from_raw(unsafe { bindings::pci_irq_type(self.dev.as_raw()) })
+ }
+
/// Resolves the vector at `index` to an [`IrqRequest`].
///
/// The returned [`IrqRequest`] borrows from this registration, ensuring the vector allocation
--
2.55.0