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
