[PATCH 01/37] PCI/MSI: Add Devres managed IRQ vectors allocation
Shawn Lin <[email protected]> Mon, 23 Feb 2026 23:29:40 +0800
| Newsgroups | dev.linux.lists.mhi,dev.linux.lists.iommu,org.freedesktop.lists.dri-devel,org.infradead.lists.linux-i3c,org.infradead.lists.linux-riscv,org.kernel.vger.dmaengine,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-crypto,org.kernel.vger.linux-cxl,org.kernel.vger.linux-gpio,org.kernel.vger.linux-i2c,org.kernel.vger.linux-input,org.kernel.vger.linux-media,org.kernel.vger.linux-mmc,org.kernel.vger.linux-pci,org.kernel.vger.linux-serial,org.kernel.vger.linux-spi,org.kernel.vger.linux-usb,org.kernel.vger.netdev,org.kernel.vger.platform-driver-x86 |
|---|---|
| Message-ID | <[email protected]> |
pcim_alloc_irq_vectors() and pcim_alloc_irq_vectors_affinity() are created for pci device drivers which rely on the devres machinery to help cleanup the IRQ vectors. Signed-off-by: Shawn Lin <[email protected]> --- drivers/pci/msi/api.c | 26 ++++++++++++++++++++++++++ include/linux/pci.h | 22 ++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c index c18559b..2362fca 100644 --- a/drivers/pci/msi/api.c +++ b/drivers/pci/msi/api.c @@ -297,6 +297,32 @@ int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity); /** + * pcim_alloc_irq_vectors() - devres managed pci_alloc_irq_vectors() + * Interrupt vectors are automatically freed by the devres machinery + */ +int pcim_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs, + unsigned int max_vecs, unsigned int flags) +{ + return pcim_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs, + flags, NULL); +} +EXPORT_SYMBOL(pcim_alloc_irq_vectors); + +/** + * pcim_alloc_irq_vectors_affinity() - devres managed pci_alloc_irq_vectors_affinity() + * Interrupt vectors are automatically freed by the devres machinery + */ +int pcim_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, + unsigned int max_vecs, unsigned int flags, + struct irq_affinity *affd) +{ + dev->is_msi_managed = true; + return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs, + flags, affd); +} +EXPORT_SYMBOL(pcim_alloc_irq_vectors_affinity); + +/** * pci_irq_vector() - Get Linux IRQ number of a device interrupt vector * @dev: the PCI device to operate on * @nr: device-relative interrupt vector index (0-based); has different diff --git a/include/linux/pci.h b/include/linux/pci.h index d5ec0f8..ae58f70 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -1764,6 +1764,12 @@ int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, unsigned int max_vecs, unsigned int flags, struct irq_affinity *affd); +int pcim_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs, + unsigned int max_vecs, unsigned int flags); +int pcim_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, + unsigned int max_vecs, unsigned int flags, + struct irq_affinity *affd); + bool pci_msix_can_alloc_dyn(struct pci_dev *dev); struct msi_map pci_msix_alloc_irq_at(struct pci_dev *dev, unsigned int index, const struct irq_affinity_desc *affdesc); @@ -1806,6 +1812,22 @@ pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs, flags, NULL); } +static inline int +pcim_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, + unsigned int max_vecs, unsigned int flags, + struct irq_affinity *aff_desc) +{ + return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs, + flags, aff_desc); +} +static inline int +pcim_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs, + unsigned int max_vecs, unsigned int flags) +{ + return pcim_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs, + flags, NULL); +} + static inline bool pci_msix_can_alloc_dyn(struct pci_dev *dev) { return false; } static inline struct msi_map pci_msix_alloc_irq_at(struct pci_dev *dev, unsigned int index, -- 2.7.4