diff options
author | Alexander Gordeev <agordeev@redhat.com> | 2014-02-13 12:48:02 -0500 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2014-02-13 12:48:02 -0500 |
commit | 3ce4e860e578f843db36a1f7357ba00aeaa7610f (patch) | |
tree | 5ab6d5d5db55c65646e4cce6ce0c17e1d87fc203 /include | |
parent | 13f9653dab9a5d350a560c435a0f3d90ff7905ef (diff) |
PCI/MSI: Add pci_enable_msi_exact() and pci_enable_msix_exact()
The new functions are special cases for pci_enable_msi_range() and
pci_enable_msix_range() when a particular number of MSI or MSI-X
is needed.
By contrast with pci_enable_msi_range() and pci_enable_msix_range()
functions, pci_enable_msi_exact() and pci_enable_msix_exact()
return zero in case of success, which indicates MSI or MSI-X
interrupts have been successfully allocated.
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/pci.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/include/linux/pci.h b/include/linux/pci.h index fb57c892b214..33aa2caf0f0c 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -1169,8 +1169,23 @@ void msi_remove_pci_irq_vectors(struct pci_dev *dev); | |||
1169 | void pci_restore_msi_state(struct pci_dev *dev); | 1169 | void pci_restore_msi_state(struct pci_dev *dev); |
1170 | int pci_msi_enabled(void); | 1170 | int pci_msi_enabled(void); |
1171 | int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec); | 1171 | int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec); |
1172 | static inline int pci_enable_msi_exact(struct pci_dev *dev, int nvec) | ||
1173 | { | ||
1174 | int rc = pci_enable_msi_range(dev, nvec, nvec); | ||
1175 | if (rc < 0) | ||
1176 | return rc; | ||
1177 | return 0; | ||
1178 | } | ||
1172 | int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, | 1179 | int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, |
1173 | int minvec, int maxvec); | 1180 | int minvec, int maxvec); |
1181 | static inline int pci_enable_msix_exact(struct pci_dev *dev, | ||
1182 | struct msix_entry *entries, int nvec) | ||
1183 | { | ||
1184 | int rc = pci_enable_msix_range(dev, entries, nvec, nvec); | ||
1185 | if (rc < 0) | ||
1186 | return rc; | ||
1187 | return 0; | ||
1188 | } | ||
1174 | #else | 1189 | #else |
1175 | static inline int pci_msi_vec_count(struct pci_dev *dev) { return -ENOSYS; } | 1190 | static inline int pci_msi_vec_count(struct pci_dev *dev) { return -ENOSYS; } |
1176 | static inline int pci_enable_msi_block(struct pci_dev *dev, int nvec) | 1191 | static inline int pci_enable_msi_block(struct pci_dev *dev, int nvec) |
@@ -1189,9 +1204,14 @@ static inline int pci_msi_enabled(void) { return 0; } | |||
1189 | static inline int pci_enable_msi_range(struct pci_dev *dev, int minvec, | 1204 | static inline int pci_enable_msi_range(struct pci_dev *dev, int minvec, |
1190 | int maxvec) | 1205 | int maxvec) |
1191 | { return -ENOSYS; } | 1206 | { return -ENOSYS; } |
1207 | static inline int pci_enable_msi_exact(struct pci_dev *dev, int nvec) | ||
1208 | { return -ENOSYS; } | ||
1192 | static inline int pci_enable_msix_range(struct pci_dev *dev, | 1209 | static inline int pci_enable_msix_range(struct pci_dev *dev, |
1193 | struct msix_entry *entries, int minvec, int maxvec) | 1210 | struct msix_entry *entries, int minvec, int maxvec) |
1194 | { return -ENOSYS; } | 1211 | { return -ENOSYS; } |
1212 | static inline int pci_enable_msix_exact(struct pci_dev *dev, | ||
1213 | struct msix_entry *entries, int nvec) | ||
1214 | { return -ENOSYS; } | ||
1195 | #endif | 1215 | #endif |
1196 | 1216 | ||
1197 | #ifdef CONFIG_PCIEPORTBUS | 1217 | #ifdef CONFIG_PCIEPORTBUS |