hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/pci/msi.c
....@@ -58,8 +58,8 @@
5858 #define pci_msi_teardown_msi_irqs arch_teardown_msi_irqs
5959 #endif
6060
61
+#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
6162 /* Arch hooks */
62
-
6363 int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
6464 {
6565 struct msi_controller *chip = dev->bus->msi;
....@@ -132,6 +132,7 @@
132132 {
133133 return default_teardown_msi_irqs(dev);
134134 }
135
+#endif /* CONFIG_PCI_MSI_ARCH_FALLBACKS */
135136
136137 static void default_restore_msi_irq(struct pci_dev *dev, int irq)
137138 {
....@@ -192,6 +193,9 @@
192193
193194 static void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
194195 {
196
+ if (desc->msi_attrib.is_virtual)
197
+ return NULL;
198
+
195199 return desc->mask_base +
196200 desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE;
197201 }
....@@ -206,14 +210,20 @@
206210 u32 __pci_msix_desc_mask_irq(struct msi_desc *desc, u32 flag)
207211 {
208212 u32 mask_bits = desc->masked;
213
+ void __iomem *desc_addr;
209214
210215 if (pci_msi_ignore_mask)
216
+ return 0;
217
+
218
+ desc_addr = pci_msix_desc_addr(desc);
219
+ if (!desc_addr)
211220 return 0;
212221
213222 mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
214223 if (flag & PCI_MSIX_ENTRY_CTRL_MASKBIT)
215224 mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
216
- writel(mask_bits, pci_msix_desc_addr(desc) + PCI_MSIX_ENTRY_VECTOR_CTRL);
225
+
226
+ writel(mask_bits, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
217227
218228 return mask_bits;
219229 }
....@@ -237,7 +247,7 @@
237247 }
238248
239249 /**
240
- * pci_msi_mask_irq - Generic irq chip callback to mask PCI/MSI interrupts
250
+ * pci_msi_mask_irq - Generic IRQ chip callback to mask PCI/MSI interrupts
241251 * @data: pointer to irqdata associated to that interrupt
242252 */
243253 void pci_msi_mask_irq(struct irq_data *data)
....@@ -247,7 +257,7 @@
247257 EXPORT_SYMBOL_GPL(pci_msi_mask_irq);
248258
249259 /**
250
- * pci_msi_unmask_irq - Generic irq chip callback to unmask PCI/MSI interrupts
260
+ * pci_msi_unmask_irq - Generic IRQ chip callback to unmask PCI/MSI interrupts
251261 * @data: pointer to irqdata associated to that interrupt
252262 */
253263 void pci_msi_unmask_irq(struct irq_data *data)
....@@ -272,6 +282,11 @@
272282
273283 if (entry->msi_attrib.is_msix) {
274284 void __iomem *base = pci_msix_desc_addr(entry);
285
+
286
+ if (!base) {
287
+ WARN_ON(1);
288
+ return;
289
+ }
275290
276291 msg->address_lo = readl(base + PCI_MSIX_ENTRY_LOWER_ADDR);
277292 msg->address_hi = readl(base + PCI_MSIX_ENTRY_UPPER_ADDR);
....@@ -303,6 +318,9 @@
303318 } else if (entry->msi_attrib.is_msix) {
304319 void __iomem *base = pci_msix_desc_addr(entry);
305320 bool unmasked = !(entry->masked & PCI_MSIX_ENTRY_CTRL_MASKBIT);
321
+
322
+ if (!base)
323
+ goto skip;
306324
307325 /*
308326 * The specification mandates that the entry is masked
....@@ -347,7 +365,13 @@
347365 /* Ensure that the writes are visible in the device */
348366 pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &msgctl);
349367 }
368
+
369
+skip:
350370 entry->msg = *msg;
371
+
372
+ if (entry->write_msi_msg)
373
+ entry->write_msi_msg(entry, entry->write_msi_msg_data);
374
+
351375 }
352376
353377 void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
....@@ -552,15 +576,14 @@
552576 }
553577
554578 static struct msi_desc *
555
-msi_setup_entry(struct pci_dev *dev, int nvec, const struct irq_affinity *affd)
579
+msi_setup_entry(struct pci_dev *dev, int nvec, struct irq_affinity *affd)
556580 {
557
- struct cpumask *masks = NULL;
581
+ struct irq_affinity_desc *masks = NULL;
558582 struct msi_desc *entry;
559583 u16 control;
560584
561585 if (affd)
562586 masks = irq_create_affinity_masks(nvec, affd);
563
-
564587
565588 /* MSI Entry Initialization */
566589 entry = alloc_msi_entry(&dev->dev, nvec, masks);
....@@ -574,6 +597,7 @@
574597
575598 entry->msi_attrib.is_msix = 0;
576599 entry->msi_attrib.is_64 = !!(control & PCI_MSI_FLAGS_64BIT);
600
+ entry->msi_attrib.is_virtual = 0;
577601 entry->msi_attrib.entry_nr = 0;
578602 entry->msi_attrib.maskbit = !!(control & PCI_MSI_FLAGS_MASKBIT);
579603 entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */
....@@ -612,16 +636,16 @@
612636 * msi_capability_init - configure device's MSI capability structure
613637 * @dev: pointer to the pci_dev data structure of MSI device function
614638 * @nvec: number of interrupts to allocate
615
- * @affd: description of automatic irq affinity assignments (may be %NULL)
639
+ * @affd: description of automatic IRQ affinity assignments (may be %NULL)
616640 *
617641 * Setup the MSI capability structure of the device with the requested
618642 * number of interrupts. A return value of zero indicates the successful
619
- * setup of an entry with the new MSI irq. A negative return value indicates
643
+ * setup of an entry with the new MSI IRQ. A negative return value indicates
620644 * an error, and a positive return value indicates the number of interrupts
621645 * which could have been allocated.
622646 */
623647 static int msi_capability_init(struct pci_dev *dev, int nvec,
624
- const struct irq_affinity *affd)
648
+ struct irq_affinity *affd)
625649 {
626650 struct msi_desc *entry;
627651 int ret;
....@@ -633,7 +657,7 @@
633657 if (!entry)
634658 return -ENOMEM;
635659
636
- /* All MSIs are unmasked by default, Mask them all */
660
+ /* All MSIs are unmasked by default; mask them all */
637661 mask = msi_mask(entry->msi_attrib.multi_cap);
638662 msi_mask_irq(entry, mask, mask);
639663
....@@ -661,7 +685,7 @@
661685 return ret;
662686 }
663687
664
- /* Set MSI enabled bits */
688
+ /* Set MSI enabled bits */
665689 pci_intx_for_msi(dev, 0);
666690 pci_msi_set_enable(dev, 1);
667691 dev->msi_enabled = 1;
....@@ -688,17 +712,18 @@
688712 table_offset &= PCI_MSIX_TABLE_OFFSET;
689713 phys_addr = pci_resource_start(dev, bir) + table_offset;
690714
691
- return ioremap_nocache(phys_addr, nr_entries * PCI_MSIX_ENTRY_SIZE);
715
+ return ioremap(phys_addr, nr_entries * PCI_MSIX_ENTRY_SIZE);
692716 }
693717
694718 static int msix_setup_entries(struct pci_dev *dev, void __iomem *base,
695719 struct msix_entry *entries, int nvec,
696
- const struct irq_affinity *affd)
720
+ struct irq_affinity *affd)
697721 {
698
- struct cpumask *curmsk, *masks = NULL;
722
+ struct irq_affinity_desc *curmsk, *masks = NULL;
699723 struct msi_desc *entry;
700724 void __iomem *addr;
701725 int ret, i;
726
+ int vec_count = pci_msix_vec_count(dev);
702727
703728 if (affd)
704729 masks = irq_create_affinity_masks(nvec, affd);
....@@ -722,6 +747,10 @@
722747 entry->msi_attrib.entry_nr = entries[i].entry;
723748 else
724749 entry->msi_attrib.entry_nr = i;
750
+
751
+ entry->msi_attrib.is_virtual =
752
+ entry->msi_attrib.entry_nr >= vec_count;
753
+
725754 entry->msi_attrib.default_irq = dev->irq;
726755 entry->mask_base = base;
727756
....@@ -768,14 +797,14 @@
768797 * @dev: pointer to the pci_dev data structure of MSI-X device function
769798 * @entries: pointer to an array of struct msix_entry entries
770799 * @nvec: number of @entries
771
- * @affd: Optional pointer to enable automatic affinity assignement
800
+ * @affd: Optional pointer to enable automatic affinity assignment
772801 *
773802 * Setup the MSI-X capability structure of device function with a
774
- * single MSI-X irq. A return of zero indicates the successful setup of
775
- * requested MSI-X entries with allocated irqs or non-zero for otherwise.
803
+ * single MSI-X IRQ. A return of zero indicates the successful setup of
804
+ * requested MSI-X entries with allocated IRQs or non-zero for otherwise.
776805 **/
777806 static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,
778
- int nvec, const struct irq_affinity *affd)
807
+ int nvec, struct irq_affinity *affd)
779808 {
780809 void __iomem *base;
781810 int ret, tsize;
....@@ -838,7 +867,7 @@
838867 out_avail:
839868 if (ret < 0) {
840869 /*
841
- * If we had some success, report the number of irqs
870
+ * If we had some success, report the number of IRQs
842871 * we succeeded in setting up.
843872 */
844873 struct msi_desc *entry;
....@@ -864,7 +893,7 @@
864893 /**
865894 * pci_msi_supported - check whether MSI may be enabled on a device
866895 * @dev: pointer to the pci_dev data structure of MSI device function
867
- * @nvec: how many MSIs have been requested ?
896
+ * @nvec: how many MSIs have been requested?
868897 *
869898 * Look at global flags, the device itself, and its parent buses
870899 * to determine if MSI/-X are supported for the device. If MSI/-X is
....@@ -878,7 +907,7 @@
878907 if (!pci_msi_enable)
879908 return 0;
880909
881
- if (!dev || dev->no_msi || dev->current_state != PCI_D0)
910
+ if (!dev || dev->no_msi)
882911 return 0;
883912
884913 /*
....@@ -947,7 +976,7 @@
947976 mask = msi_mask(desc->msi_attrib.multi_cap);
948977 msi_mask_irq(desc, mask, 0);
949978
950
- /* Restore dev->irq to its default pin-assertion irq */
979
+ /* Restore dev->irq to its default pin-assertion IRQ */
951980 dev->irq = desc->msi_attrib.default_irq;
952981 pcibios_alloc_irq(dev);
953982 }
....@@ -983,18 +1012,18 @@
9831012 EXPORT_SYMBOL(pci_msix_vec_count);
9841013
9851014 static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
986
- int nvec, const struct irq_affinity *affd)
1015
+ int nvec, struct irq_affinity *affd, int flags)
9871016 {
9881017 int nr_entries;
9891018 int i, j;
9901019
991
- if (!pci_msi_supported(dev, nvec))
1020
+ if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
9921021 return -EINVAL;
9931022
9941023 nr_entries = pci_msix_vec_count(dev);
9951024 if (nr_entries < 0)
9961025 return nr_entries;
997
- if (nvec > nr_entries)
1026
+ if (nvec > nr_entries && !(flags & PCI_IRQ_VIRTUAL))
9981027 return nr_entries;
9991028
10001029 if (entries) {
....@@ -1009,7 +1038,7 @@
10091038 }
10101039 }
10111040
1012
- /* Check whether driver already requested for MSI irq */
1041
+ /* Check whether driver already requested for MSI IRQ */
10131042 if (dev->msi_enabled) {
10141043 pci_info(dev, "can't enable MSI-X (MSI IRQ already assigned)\n");
10151044 return -EINVAL;
....@@ -1067,15 +1096,15 @@
10671096 EXPORT_SYMBOL(pci_msi_enabled);
10681097
10691098 static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
1070
- const struct irq_affinity *affd)
1099
+ struct irq_affinity *affd)
10711100 {
10721101 int nvec;
10731102 int rc;
10741103
1075
- if (!pci_msi_supported(dev, minvec))
1104
+ if (!pci_msi_supported(dev, minvec) || dev->current_state != PCI_D0)
10761105 return -EINVAL;
10771106
1078
- /* Check whether driver already requested MSI-X irqs */
1107
+ /* Check whether driver already requested MSI-X IRQs */
10791108 if (dev->msix_enabled) {
10801109 pci_info(dev, "can't enable MSI (MSI-X already enabled)\n");
10811110 return -EINVAL;
....@@ -1128,7 +1157,8 @@
11281157
11291158 static int __pci_enable_msix_range(struct pci_dev *dev,
11301159 struct msix_entry *entries, int minvec,
1131
- int maxvec, const struct irq_affinity *affd)
1160
+ int maxvec, struct irq_affinity *affd,
1161
+ int flags)
11321162 {
11331163 int rc, nvec = maxvec;
11341164
....@@ -1145,7 +1175,7 @@
11451175 return -ENOSPC;
11461176 }
11471177
1148
- rc = __pci_enable_msix(dev, entries, nvec, affd);
1178
+ rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
11491179 if (rc == 0)
11501180 return nvec;
11511181
....@@ -1162,8 +1192,8 @@
11621192 * pci_enable_msix_range - configure device's MSI-X capability structure
11631193 * @dev: pointer to the pci_dev data structure of MSI-X device function
11641194 * @entries: pointer to an array of MSI-X entries
1165
- * @minvec: minimum number of MSI-X irqs requested
1166
- * @maxvec: maximum number of MSI-X irqs requested
1195
+ * @minvec: minimum number of MSI-X IRQs requested
1196
+ * @maxvec: maximum number of MSI-X IRQs requested
11671197 *
11681198 * Setup the MSI-X capability structure of device function with a maximum
11691199 * possible number of interrupts in the range between @minvec and @maxvec
....@@ -1176,7 +1206,7 @@
11761206 int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
11771207 int minvec, int maxvec)
11781208 {
1179
- return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL);
1209
+ return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
11801210 }
11811211 EXPORT_SYMBOL(pci_enable_msix_range);
11821212
....@@ -1200,11 +1230,10 @@
12001230 */
12011231 int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
12021232 unsigned int max_vecs, unsigned int flags,
1203
- const struct irq_affinity *affd)
1233
+ struct irq_affinity *affd)
12041234 {
1205
- static const struct irq_affinity msi_default_affd;
1206
- int msix_vecs = -ENOSPC;
1207
- int msi_vecs = -ENOSPC;
1235
+ struct irq_affinity msi_default_affd = {0};
1236
+ int nvecs = -ENOSPC;
12081237
12091238 if (flags & PCI_IRQ_AFFINITY) {
12101239 if (!affd)
....@@ -1215,30 +1244,34 @@
12151244 }
12161245
12171246 if (flags & PCI_IRQ_MSIX) {
1218
- msix_vecs = __pci_enable_msix_range(dev, NULL, min_vecs,
1219
- max_vecs, affd);
1220
- if (msix_vecs > 0)
1221
- return msix_vecs;
1247
+ nvecs = __pci_enable_msix_range(dev, NULL, min_vecs, max_vecs,
1248
+ affd, flags);
1249
+ if (nvecs > 0)
1250
+ return nvecs;
12221251 }
12231252
12241253 if (flags & PCI_IRQ_MSI) {
1225
- msi_vecs = __pci_enable_msi_range(dev, min_vecs, max_vecs,
1226
- affd);
1227
- if (msi_vecs > 0)
1228
- return msi_vecs;
1254
+ nvecs = __pci_enable_msi_range(dev, min_vecs, max_vecs, affd);
1255
+ if (nvecs > 0)
1256
+ return nvecs;
12291257 }
12301258
1231
- /* use legacy irq if allowed */
1259
+ /* use legacy IRQ if allowed */
12321260 if (flags & PCI_IRQ_LEGACY) {
12331261 if (min_vecs == 1 && dev->irq) {
1262
+ /*
1263
+ * Invoke the affinity spreading logic to ensure that
1264
+ * the device driver can adjust queue configuration
1265
+ * for the single interrupt case.
1266
+ */
1267
+ if (affd)
1268
+ irq_create_affinity_masks(1, affd);
12341269 pci_intx(dev, 1);
12351270 return 1;
12361271 }
12371272 }
12381273
1239
- if (msix_vecs == -ENOSPC)
1240
- return -ENOSPC;
1241
- return msi_vecs;
1274
+ return nvecs;
12421275 }
12431276 EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
12441277
....@@ -1257,19 +1290,24 @@
12571290
12581291 /**
12591292 * pci_irq_vector - return Linux IRQ number of a device vector
1260
- * @dev: PCI device to operate on
1261
- * @nr: device-relative interrupt vector index (0-based).
1293
+ * @dev: PCI device to operate on
1294
+ * @nr: Interrupt vector index (0-based)
1295
+ *
1296
+ * @nr has the following meanings depending on the interrupt mode:
1297
+ * MSI-X: The index in the MSI-X vector table
1298
+ * MSI: The index of the enabled MSI vectors
1299
+ * INTx: Must be 0
1300
+ *
1301
+ * Return: The Linux interrupt number or -EINVAl if @nr is out of range.
12621302 */
12631303 int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
12641304 {
12651305 if (dev->msix_enabled) {
12661306 struct msi_desc *entry;
1267
- int i = 0;
12681307
12691308 for_each_pci_msi_entry(entry, dev) {
1270
- if (i == nr)
1309
+ if (entry->msi_attrib.entry_nr == nr)
12711310 return entry->irq;
1272
- i++;
12731311 }
12741312 WARN_ON_ONCE(1);
12751313 return -EINVAL;
....@@ -1290,20 +1328,25 @@
12901328 EXPORT_SYMBOL(pci_irq_vector);
12911329
12921330 /**
1293
- * pci_irq_get_affinity - return the affinity of a particular msi vector
1331
+ * pci_irq_get_affinity - return the affinity of a particular MSI vector
12941332 * @dev: PCI device to operate on
12951333 * @nr: device-relative interrupt vector index (0-based).
1334
+ *
1335
+ * @nr has the following meanings depending on the interrupt mode:
1336
+ * MSI-X: The index in the MSI-X vector table
1337
+ * MSI: The index of the enabled MSI vectors
1338
+ * INTx: Must be 0
1339
+ *
1340
+ * Return: A cpumask pointer or NULL if @nr is out of range
12961341 */
12971342 const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
12981343 {
12991344 if (dev->msix_enabled) {
13001345 struct msi_desc *entry;
1301
- int i = 0;
13021346
13031347 for_each_pci_msi_entry(entry, dev) {
1304
- if (i == nr)
1305
- return entry->affinity;
1306
- i++;
1348
+ if (entry->msi_attrib.entry_nr == nr)
1349
+ return &entry->affinity->mask;
13071350 }
13081351 WARN_ON_ONCE(1);
13091352 return NULL;
....@@ -1314,28 +1357,12 @@
13141357 nr >= entry->nvec_used))
13151358 return NULL;
13161359
1317
- return &entry->affinity[nr];
1360
+ return &entry->affinity[nr].mask;
13181361 } else {
13191362 return cpu_possible_mask;
13201363 }
13211364 }
13221365 EXPORT_SYMBOL(pci_irq_get_affinity);
1323
-
1324
-/**
1325
- * pci_irq_get_node - return the numa node of a particular msi vector
1326
- * @pdev: PCI device to operate on
1327
- * @vec: device-relative interrupt vector index (0-based).
1328
- */
1329
-int pci_irq_get_node(struct pci_dev *pdev, int vec)
1330
-{
1331
- const struct cpumask *mask;
1332
-
1333
- mask = pci_irq_get_affinity(pdev, vec);
1334
- if (mask)
1335
- return local_memory_node(cpu_to_node(cpumask_first(mask)));
1336
- return dev_to_node(&pdev->dev);
1337
-}
1338
-EXPORT_SYMBOL(pci_irq_get_node);
13391366
13401367 struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
13411368 {
....@@ -1371,16 +1398,16 @@
13711398
13721399 /**
13731400 * pci_msi_domain_calc_hwirq - Generate a unique ID for an MSI source
1374
- * @dev: Pointer to the PCI device
1375
- * @desc: Pointer to the msi descriptor
1401
+ * @desc: Pointer to the MSI descriptor
13761402 *
13771403 * The ID number is only used within the irqdomain.
13781404 */
1379
-irq_hw_number_t pci_msi_domain_calc_hwirq(struct pci_dev *dev,
1380
- struct msi_desc *desc)
1405
+static irq_hw_number_t pci_msi_domain_calc_hwirq(struct msi_desc *desc)
13811406 {
1407
+ struct pci_dev *dev = msi_desc_to_pci_dev(desc);
1408
+
13821409 return (irq_hw_number_t)desc->msi_attrib.entry_nr |
1383
- PCI_DEVID(dev->bus->number, dev->devfn) << 11 |
1410
+ pci_dev_id(dev) << 11 |
13841411 (pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 27;
13851412 }
13861413
....@@ -1390,7 +1417,8 @@
13901417 }
13911418
13921419 /**
1393
- * pci_msi_domain_check_cap - Verify that @domain supports the capabilities for @dev
1420
+ * pci_msi_domain_check_cap - Verify that @domain supports the capabilities
1421
+ * for @dev
13941422 * @domain: The interrupt domain to check
13951423 * @info: The domain info for verification
13961424 * @dev: The device to check
....@@ -1425,17 +1453,12 @@
14251453 return error;
14261454 }
14271455
1428
-#ifdef GENERIC_MSI_DOMAIN_OPS
14291456 static void pci_msi_domain_set_desc(msi_alloc_info_t *arg,
14301457 struct msi_desc *desc)
14311458 {
14321459 arg->desc = desc;
1433
- arg->hwirq = pci_msi_domain_calc_hwirq(msi_desc_to_pci_dev(desc),
1434
- desc);
1460
+ arg->hwirq = pci_msi_domain_calc_hwirq(desc);
14351461 }
1436
-#else
1437
-#define pci_msi_domain_set_desc NULL
1438
-#endif
14391462
14401463 static struct msi_domain_ops pci_msi_domain_ops_default = {
14411464 .set_desc = pci_msi_domain_set_desc,
....@@ -1550,13 +1573,13 @@
15501573 u32 pci_msi_domain_get_msi_rid(struct irq_domain *domain, struct pci_dev *pdev)
15511574 {
15521575 struct device_node *of_node;
1553
- u32 rid = PCI_DEVID(pdev->bus->number, pdev->devfn);
1576
+ u32 rid = pci_dev_id(pdev);
15541577
15551578 pci_for_each_dma_alias(pdev, get_msi_id_cb, &rid);
15561579
15571580 of_node = irq_domain_get_of_node(domain);
1558
- rid = of_node ? of_msi_map_rid(&pdev->dev, of_node, rid) :
1559
- iort_msi_map_rid(&pdev->dev, rid);
1581
+ rid = of_node ? of_msi_map_id(&pdev->dev, of_node, rid) :
1582
+ iort_msi_map_id(&pdev->dev, rid);
15601583
15611584 return rid;
15621585 }
....@@ -1573,12 +1596,35 @@
15731596 struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev)
15741597 {
15751598 struct irq_domain *dom;
1576
- u32 rid = PCI_DEVID(pdev->bus->number, pdev->devfn);
1599
+ u32 rid = pci_dev_id(pdev);
15771600
15781601 pci_for_each_dma_alias(pdev, get_msi_id_cb, &rid);
1579
- dom = of_msi_map_get_device_domain(&pdev->dev, rid);
1602
+ dom = of_msi_map_get_device_domain(&pdev->dev, rid, DOMAIN_BUS_PCI_MSI);
15801603 if (!dom)
1581
- dom = iort_get_device_domain(&pdev->dev, rid);
1604
+ dom = iort_get_device_domain(&pdev->dev, rid,
1605
+ DOMAIN_BUS_PCI_MSI);
15821606 return dom;
15831607 }
1608
+
1609
+/**
1610
+ * pci_dev_has_special_msi_domain - Check whether the device is handled by
1611
+ * a non-standard PCI-MSI domain
1612
+ * @pdev: The PCI device to check.
1613
+ *
1614
+ * Returns: True if the device irqdomain or the bus irqdomain is
1615
+ * non-standard PCI/MSI.
1616
+ */
1617
+bool pci_dev_has_special_msi_domain(struct pci_dev *pdev)
1618
+{
1619
+ struct irq_domain *dom = dev_get_msi_domain(&pdev->dev);
1620
+
1621
+ if (!dom)
1622
+ dom = dev_get_msi_domain(&pdev->bus->dev);
1623
+
1624
+ if (!dom)
1625
+ return true;
1626
+
1627
+ return dom->bus_token != DOMAIN_BUS_PCI_MSI;
1628
+}
1629
+
15841630 #endif /* CONFIG_PCI_MSI_IRQ_DOMAIN */