diff options
Diffstat (limited to 'drivers/pci/msi.c')
| -rw-r--r-- | drivers/pci/msi.c | 39 |
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 | ||
| 534 | static struct msi_desc * | 534 | static struct msi_desc * |
| 535 | msi_setup_entry(struct pci_dev *dev, int nvec, const struct irq_affinity *affd) | 535 | msi_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 | */ |
| 599 | static int msi_capability_init(struct pci_dev *dev, int nvec, | 599 | static 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 | ||
| 670 | static int msix_setup_entries(struct pci_dev *dev, void __iomem *base, | 670 | static 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 | **/ |
| 738 | static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries, | 738 | static 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) | |||
| 932 | EXPORT_SYMBOL(pci_msix_vec_count); | 932 | EXPORT_SYMBOL(pci_msix_vec_count); |
| 933 | 933 | ||
| 934 | static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, | 934 | static 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) | |||
| 1018 | EXPORT_SYMBOL(pci_msi_enabled); | 1018 | EXPORT_SYMBOL(pci_msi_enabled); |
| 1019 | 1019 | ||
| 1020 | static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, | 1020 | static 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 | ||
| 1087 | static int __pci_enable_msix_range(struct pci_dev *dev, | 1080 | static 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 | */ |
| 1166 | int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, | 1152 | int 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 | } |
