aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/msi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/msi.c')
-rw-r--r--drivers/pci/msi.c39
1 files changed, 16 insertions, 23 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 4c0b47867258..73986825d221 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -532,7 +532,7 @@ error_attrs:
532} 532}
533 533
534static struct msi_desc * 534static struct msi_desc *
535msi_setup_entry(struct pci_dev *dev, int nvec, const struct irq_affinity *affd) 535msi_setup_entry(struct pci_dev *dev, int nvec, struct irq_affinity *affd)
536{ 536{
537 struct irq_affinity_desc *masks = NULL; 537 struct irq_affinity_desc *masks = NULL;
538 struct msi_desc *entry; 538 struct msi_desc *entry;
@@ -597,7 +597,7 @@ static int msi_verify_entries(struct pci_dev *dev)
597 * which could have been allocated. 597 * which could have been allocated.
598 */ 598 */
599static int msi_capability_init(struct pci_dev *dev, int nvec, 599static int msi_capability_init(struct pci_dev *dev, int nvec,
600 const struct irq_affinity *affd) 600 struct irq_affinity *affd)
601{ 601{
602 struct msi_desc *entry; 602 struct msi_desc *entry;
603 int ret; 603 int ret;
@@ -669,7 +669,7 @@ static void __iomem *msix_map_region(struct pci_dev *dev, unsigned nr_entries)
669 669
670static int msix_setup_entries(struct pci_dev *dev, void __iomem *base, 670static int msix_setup_entries(struct pci_dev *dev, void __iomem *base,
671 struct msix_entry *entries, int nvec, 671 struct msix_entry *entries, int nvec,
672 const struct irq_affinity *affd) 672 struct irq_affinity *affd)
673{ 673{
674 struct irq_affinity_desc *curmsk, *masks = NULL; 674 struct irq_affinity_desc *curmsk, *masks = NULL;
675 struct msi_desc *entry; 675 struct msi_desc *entry;
@@ -736,7 +736,7 @@ static void msix_program_entries(struct pci_dev *dev,
736 * requested MSI-X entries with allocated irqs or non-zero for otherwise. 736 * requested MSI-X entries with allocated irqs or non-zero for otherwise.
737 **/ 737 **/
738static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries, 738static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,
739 int nvec, const struct irq_affinity *affd) 739 int nvec, struct irq_affinity *affd)
740{ 740{
741 int ret; 741 int ret;
742 u16 control; 742 u16 control;
@@ -932,7 +932,7 @@ int pci_msix_vec_count(struct pci_dev *dev)
932EXPORT_SYMBOL(pci_msix_vec_count); 932EXPORT_SYMBOL(pci_msix_vec_count);
933 933
934static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, 934static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
935 int nvec, const struct irq_affinity *affd) 935 int nvec, struct irq_affinity *affd)
936{ 936{
937 int nr_entries; 937 int nr_entries;
938 int i, j; 938 int i, j;
@@ -1018,7 +1018,7 @@ int pci_msi_enabled(void)
1018EXPORT_SYMBOL(pci_msi_enabled); 1018EXPORT_SYMBOL(pci_msi_enabled);
1019 1019
1020static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, 1020static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
1021 const struct irq_affinity *affd) 1021 struct irq_affinity *affd)
1022{ 1022{
1023 int nvec; 1023 int nvec;
1024 int rc; 1024 int rc;
@@ -1035,13 +1035,6 @@ static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
1035 if (maxvec < minvec) 1035 if (maxvec < minvec)
1036 return -ERANGE; 1036 return -ERANGE;
1037 1037
1038 /*
1039 * If the caller is passing in sets, we can't support a range of
1040 * vectors. The caller needs to handle that.
1041 */
1042 if (affd && affd->nr_sets && minvec != maxvec)
1043 return -EINVAL;
1044
1045 if (WARN_ON_ONCE(dev->msi_enabled)) 1038 if (WARN_ON_ONCE(dev->msi_enabled))
1046 return -EINVAL; 1039 return -EINVAL;
1047 1040
@@ -1086,20 +1079,13 @@ EXPORT_SYMBOL(pci_enable_msi);
1086 1079
1087static int __pci_enable_msix_range(struct pci_dev *dev, 1080static int __pci_enable_msix_range(struct pci_dev *dev,
1088 struct msix_entry *entries, int minvec, 1081 struct msix_entry *entries, int minvec,
1089 int maxvec, const struct irq_affinity *affd) 1082 int maxvec, struct irq_affinity *affd)
1090{ 1083{
1091 int rc, nvec = maxvec; 1084 int rc, nvec = maxvec;
1092 1085
1093 if (maxvec < minvec) 1086 if (maxvec < minvec)
1094 return -ERANGE; 1087 return -ERANGE;
1095 1088
1096 /*
1097 * If the caller is passing in sets, we can't support a range of
1098 * supported vectors. The caller needs to handle that.
1099 */
1100 if (affd && affd->nr_sets && minvec != maxvec)
1101 return -EINVAL;
1102
1103 if (WARN_ON_ONCE(dev->msix_enabled)) 1089 if (WARN_ON_ONCE(dev->msix_enabled))
1104 return -EINVAL; 1090 return -EINVAL;
1105 1091
@@ -1165,9 +1151,9 @@ EXPORT_SYMBOL(pci_enable_msix_range);
1165 */ 1151 */
1166int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, 1152int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
1167 unsigned int max_vecs, unsigned int flags, 1153 unsigned int max_vecs, unsigned int flags,
1168 const struct irq_affinity *affd) 1154 struct irq_affinity *affd)
1169{ 1155{
1170 static const struct irq_affinity msi_default_affd; 1156 struct irq_affinity msi_default_affd = {0};
1171 int msix_vecs = -ENOSPC; 1157 int msix_vecs = -ENOSPC;
1172 int msi_vecs = -ENOSPC; 1158 int msi_vecs = -ENOSPC;
1173 1159
@@ -1196,6 +1182,13 @@ int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
1196 /* use legacy irq if allowed */ 1182 /* use legacy irq if allowed */
1197 if (flags & PCI_IRQ_LEGACY) { 1183 if (flags & PCI_IRQ_LEGACY) {
1198 if (min_vecs == 1 && dev->irq) { 1184 if (min_vecs == 1 && dev->irq) {
1185 /*
1186 * Invoke the affinity spreading logic to ensure that
1187 * the device driver can adjust queue configuration
1188 * for the single interrupt case.
1189 */
1190 if (affd)
1191 irq_create_affinity_masks(1, affd);
1199 pci_intx(dev, 1); 1192 pci_intx(dev, 1);
1200 return 1; 1193 return 1;
1201 } 1194 }