Lines Matching +full:pci +full:- +full:domain

1 // SPDX-License-Identifier: GPL-2.0
3 * PCI Message Signaled Interrupt (MSI)
5 * Copyright (C) 2003-2004 Intel
16 #include <linux/pci.h>
27 #include "pci.h"
37 struct irq_domain *domain; in pci_msi_setup_msi_irqs() local
39 domain = dev_get_msi_domain(&dev->dev); in pci_msi_setup_msi_irqs()
40 if (domain && irq_domain_is_hierarchy(domain)) in pci_msi_setup_msi_irqs()
41 return msi_domain_alloc_irqs(domain, &dev->dev, nvec); in pci_msi_setup_msi_irqs()
48 struct irq_domain *domain; in pci_msi_teardown_msi_irqs() local
50 domain = dev_get_msi_domain(&dev->dev); in pci_msi_teardown_msi_irqs()
51 if (domain && irq_domain_is_hierarchy(domain)) in pci_msi_teardown_msi_irqs()
52 msi_domain_free_irqs(domain, &dev->dev); in pci_msi_teardown_msi_irqs()
65 struct msi_controller *chip = dev->bus->msi; in arch_setup_msi_irq()
68 if (!chip || !chip->setup_irq) in arch_setup_msi_irq()
69 return -EINVAL; in arch_setup_msi_irq()
71 err = chip->setup_irq(chip, dev, desc); in arch_setup_msi_irq()
75 irq_set_chip_data(desc->irq, chip); in arch_setup_msi_irq()
84 if (!chip || !chip->teardown_irq) in arch_teardown_msi_irq()
87 chip->teardown_irq(chip, irq); in arch_teardown_msi_irq()
92 struct msi_controller *chip = dev->bus->msi; in arch_setup_msi_irqs()
96 if (chip && chip->setup_irqs) in arch_setup_msi_irqs()
97 return chip->setup_irqs(chip, dev, nvec, type); in arch_setup_msi_irqs()
110 return -ENOSPC; in arch_setup_msi_irqs()
117 * We have a default implementation available as a separate non-weak
118 * function, as it is used by the Xen x86 PCI code
126 if (entry->irq) in default_teardown_msi_irqs()
127 for (i = 0; i < entry->nvec_used; i++) in default_teardown_msi_irqs()
128 arch_teardown_msi_irq(entry->irq + i); in default_teardown_msi_irqs()
142 if (dev->msix_enabled) { in default_restore_msi_irq()
144 if (irq == entry->irq) in default_restore_msi_irq()
147 } else if (dev->msi_enabled) { in default_restore_msi_irq()
152 __pci_write_msi_msg(entry, &entry->msg); in default_restore_msi_irq()
165 return (1 << (1 << x)) - 1; in msi_mask()
169 * PCI 2.3 does not specify mask bits for each MSI interrupt. Attempting to
176 u32 mask_bits = desc->masked; in __pci_msi_desc_mask_irq()
178 if (pci_msi_ignore_mask || !desc->msi_attrib.maskbit) in __pci_msi_desc_mask_irq()
183 pci_write_config_dword(msi_desc_to_pci_dev(desc), desc->mask_pos, in __pci_msi_desc_mask_irq()
191 desc->masked = __pci_msi_desc_mask_irq(desc, mask, flag); in msi_mask_irq()
196 if (desc->msi_attrib.is_virtual) in pci_msix_desc_addr()
199 return desc->mask_base + in pci_msix_desc_addr()
200 desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE; in pci_msix_desc_addr()
204 * This internal function does not flush PCI writes to the device.
208 * of MSI-X interrupts.
212 u32 mask_bits = desc->masked; in __pci_msix_desc_mask_irq()
233 desc->masked = __pci_msix_desc_mask_irq(desc, flag); in msix_mask_irq()
240 if (desc->msi_attrib.is_msix) { in msi_set_mask_bit()
242 readl(desc->mask_base); /* Flush write to device */ in msi_set_mask_bit()
244 unsigned offset = data->irq - desc->irq; in msi_set_mask_bit()
250 * pci_msi_mask_irq - Generic IRQ chip callback to mask PCI/MSI interrupts
260 * pci_msi_unmask_irq - Generic IRQ chip callback to unmask PCI/MSI interrupts
274 default_restore_msi_irq(dev, entry->irq); in default_restore_msi_irqs()
281 BUG_ON(dev->current_state != PCI_D0); in __pci_read_msi_msg()
283 if (entry->msi_attrib.is_msix) { in __pci_read_msi_msg()
291 msg->address_lo = readl(base + PCI_MSIX_ENTRY_LOWER_ADDR); in __pci_read_msi_msg()
292 msg->address_hi = readl(base + PCI_MSIX_ENTRY_UPPER_ADDR); in __pci_read_msi_msg()
293 msg->data = readl(base + PCI_MSIX_ENTRY_DATA); in __pci_read_msi_msg()
295 int pos = dev->msi_cap; in __pci_read_msi_msg()
299 &msg->address_lo); in __pci_read_msi_msg()
300 if (entry->msi_attrib.is_64) { in __pci_read_msi_msg()
302 &msg->address_hi); in __pci_read_msi_msg()
305 msg->address_hi = 0; in __pci_read_msi_msg()
308 msg->data = data; in __pci_read_msi_msg()
316 if (dev->current_state != PCI_D0 || pci_dev_is_disconnected(dev)) { in __pci_write_msi_msg()
318 } else if (entry->msi_attrib.is_msix) { in __pci_write_msi_msg()
320 bool unmasked = !(entry->masked & PCI_MSIX_ENTRY_CTRL_MASKBIT); in __pci_write_msi_msg()
336 writel(msg->address_lo, base + PCI_MSIX_ENTRY_LOWER_ADDR); in __pci_write_msi_msg()
337 writel(msg->address_hi, base + PCI_MSIX_ENTRY_UPPER_ADDR); in __pci_write_msi_msg()
338 writel(msg->data, base + PCI_MSIX_ENTRY_DATA); in __pci_write_msi_msg()
346 int pos = dev->msi_cap; in __pci_write_msi_msg()
351 msgctl |= entry->msi_attrib.multiple << 4; in __pci_write_msi_msg()
355 msg->address_lo); in __pci_write_msi_msg()
356 if (entry->msi_attrib.is_64) { in __pci_write_msi_msg()
358 msg->address_hi); in __pci_write_msi_msg()
360 msg->data); in __pci_write_msi_msg()
363 msg->data); in __pci_write_msi_msg()
370 entry->msg = *msg; in __pci_write_msi_msg()
372 if (entry->write_msi_msg) in __pci_write_msi_msg()
373 entry->write_msi_msg(entry, entry->write_msi_msg_data); in __pci_write_msi_msg()
387 struct list_head *msi_list = dev_to_msi_list(&dev->dev); in free_msi_irqs()
394 if (entry->irq) in free_msi_irqs()
395 for (i = 0; i < entry->nvec_used; i++) in free_msi_irqs()
396 BUG_ON(irq_has_action(entry->irq + i)); in free_msi_irqs()
398 if (dev->msi_irq_groups) { in free_msi_irqs()
399 sysfs_remove_groups(&dev->dev.kobj, dev->msi_irq_groups); in free_msi_irqs()
400 msi_attrs = dev->msi_irq_groups[0]->attrs; in free_msi_irqs()
404 kfree(dev_attr->attr.name); in free_msi_irqs()
409 kfree(dev->msi_irq_groups[0]); in free_msi_irqs()
410 kfree(dev->msi_irq_groups); in free_msi_irqs()
411 dev->msi_irq_groups = NULL; in free_msi_irqs()
417 if (entry->msi_attrib.is_msix) { in free_msi_irqs()
418 if (list_is_last(&entry->list, msi_list)) in free_msi_irqs()
419 iounmap(entry->mask_base); in free_msi_irqs()
422 list_del(&entry->list); in free_msi_irqs()
429 if (!(dev->dev_flags & PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG)) in pci_intx_for_msi()
438 if (!dev->msi_enabled) in __pci_restore_msi_state()
441 entry = irq_get_msi_desc(dev->irq); in __pci_restore_msi_state()
447 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control); in __pci_restore_msi_state()
448 msi_mask_irq(entry, msi_mask(entry->msi_attrib.multi_cap), in __pci_restore_msi_state()
449 entry->masked); in __pci_restore_msi_state()
451 control |= (entry->msi_attrib.multiple << 4) | PCI_MSI_FLAGS_ENABLE; in __pci_restore_msi_state()
452 pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control); in __pci_restore_msi_state()
459 if (!dev->msix_enabled) in __pci_restore_msix_state()
461 BUG_ON(list_empty(dev_to_msi_list(&dev->dev))); in __pci_restore_msix_state()
470 msix_mask_irq(entry, entry->masked); in __pci_restore_msix_state()
489 retval = kstrtoul(attr->attr.name, 10, &irq); in msi_mode_show()
496 entry->msi_attrib.is_msix ? "msix" : "msi"); in msi_mode_show()
498 return -ENODEV; in msi_mode_show()
509 int ret = -ENOMEM; in populate_msi_sysfs()
516 num_msi += entry->nvec_used; in populate_msi_sysfs()
520 /* Dynamically create the MSI attributes for the PCI device */ in populate_msi_sysfs()
523 return -ENOMEM; in populate_msi_sysfs()
525 for (i = 0; i < entry->nvec_used; i++) { in populate_msi_sysfs()
529 msi_attrs[count] = &msi_dev_attr->attr; in populate_msi_sysfs()
531 sysfs_attr_init(&msi_dev_attr->attr); in populate_msi_sysfs()
532 msi_dev_attr->attr.name = kasprintf(GFP_KERNEL, "%d", in populate_msi_sysfs()
533 entry->irq + i); in populate_msi_sysfs()
534 if (!msi_dev_attr->attr.name) in populate_msi_sysfs()
536 msi_dev_attr->attr.mode = S_IRUGO; in populate_msi_sysfs()
537 msi_dev_attr->show = msi_mode_show; in populate_msi_sysfs()
545 msi_irq_group->name = "msi_irqs"; in populate_msi_sysfs()
546 msi_irq_group->attrs = msi_attrs; in populate_msi_sysfs()
553 ret = sysfs_create_groups(&pdev->dev.kobj, msi_irq_groups); in populate_msi_sysfs()
556 pdev->msi_irq_groups = msi_irq_groups; in populate_msi_sysfs()
569 kfree(msi_attr->name); in populate_msi_sysfs()
589 entry = alloc_msi_entry(&dev->dev, nvec, masks); in msi_setup_entry()
593 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control); in msi_setup_entry()
595 if (dev->dev_flags & PCI_DEV_FLAGS_HAS_MSI_MASKING) in msi_setup_entry()
598 entry->msi_attrib.is_msix = 0; in msi_setup_entry()
599 entry->msi_attrib.is_64 = !!(control & PCI_MSI_FLAGS_64BIT); in msi_setup_entry()
600 entry->msi_attrib.is_virtual = 0; in msi_setup_entry()
601 entry->msi_attrib.entry_nr = 0; in msi_setup_entry()
602 entry->msi_attrib.maskbit = !!(control & PCI_MSI_FLAGS_MASKBIT); in msi_setup_entry()
603 entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */ in msi_setup_entry()
604 entry->msi_attrib.multi_cap = (control & PCI_MSI_FLAGS_QMASK) >> 1; in msi_setup_entry()
605 entry->msi_attrib.multiple = ilog2(__roundup_pow_of_two(nvec)); in msi_setup_entry()
608 entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_64; in msi_setup_entry()
610 entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_32; in msi_setup_entry()
613 if (entry->msi_attrib.maskbit) in msi_setup_entry()
614 pci_read_config_dword(dev, entry->mask_pos, &entry->masked); in msi_setup_entry()
626 if (!dev->no_64bit_msi || !entry->msg.address_hi) in msi_verify_entries()
628 pci_err(dev, "Device has broken 64-bit MSI but arch" in msi_verify_entries()
630 return -EIO; in msi_verify_entries()
636 * msi_capability_init - configure device's MSI capability structure
658 return -ENOMEM; in msi_capability_init()
661 mask = msi_mask(entry->msi_attrib.multi_cap); in msi_capability_init()
664 list_add_tail(&entry->list, dev_to_msi_list(&dev->dev)); in msi_capability_init()
691 dev->msi_enabled = 1; in msi_capability_init()
694 dev->irq = entry->irq; in msi_capability_init()
705 pci_read_config_dword(dev, dev->msix_cap + PCI_MSIX_TABLE, in msix_map_region()
732 entry = alloc_msi_entry(&dev->dev, 1, curmsk); in msix_setup_entries()
739 ret = -ENOMEM; in msix_setup_entries()
743 entry->msi_attrib.is_msix = 1; in msix_setup_entries()
744 entry->msi_attrib.is_64 = 1; in msix_setup_entries()
747 entry->msi_attrib.entry_nr = entries[i].entry; in msix_setup_entries()
749 entry->msi_attrib.entry_nr = i; in msix_setup_entries()
751 entry->msi_attrib.is_virtual = in msix_setup_entries()
752 entry->msi_attrib.entry_nr >= vec_count; in msix_setup_entries()
754 entry->msi_attrib.default_irq = dev->irq; in msix_setup_entries()
755 entry->mask_base = base; in msix_setup_entries()
759 entry->masked = readl(addr + PCI_MSIX_ENTRY_VECTOR_CTRL); in msix_setup_entries()
761 list_add_tail(&entry->list, dev_to_msi_list(&dev->dev)); in msix_setup_entries()
777 entries->vector = entry->irq; in msix_update_entries()
796 * msix_capability_init - configure device's MSI-X capability
797 * @dev: pointer to the pci_dev data structure of MSI-X device function
802 * Setup the MSI-X capability structure of device function with a
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.
814 * Some devices require MSI-X to be enabled before the MSI-X in msix_capability_init()
821 pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control); in msix_capability_init()
822 /* Request & Map MSI-X table region */ in msix_capability_init()
826 ret = -ENOMEM; in msix_capability_init()
849 /* Set MSI-X enabled bits and unmask the function */ in msix_capability_init()
851 dev->msix_enabled = 1; in msix_capability_init()
858 * which takes the MSI-X mask bits into account even in msix_capability_init()
859 * when MSI-X is disabled, which prevents MSI delivery. in msix_capability_init()
877 if (entry->irq != 0) in msix_capability_init()
894 * pci_msi_supported - check whether MSI may be enabled on a device
899 * to determine if MSI/-X are supported for the device. If MSI/-X is
910 if (!dev || dev->no_msi) in pci_msi_supported()
925 * We expect only arch-specific PCI host bus controller driver in pci_msi_supported()
926 * or quirks for specific PCI bridges to be setting NO_MSI. in pci_msi_supported()
928 for (bus = dev->bus; bus; bus = bus->parent) in pci_msi_supported()
929 if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI) in pci_msi_supported()
936 * pci_msi_vec_count - Return the number of MSI vectors a device can send
950 if (!dev->msi_cap) in pci_msi_vec_count()
951 return -EINVAL; in pci_msi_vec_count()
953 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl); in pci_msi_vec_count()
965 if (!pci_msi_enable || !dev || !dev->msi_enabled) in pci_msi_shutdown()
968 BUG_ON(list_empty(dev_to_msi_list(&dev->dev))); in pci_msi_shutdown()
973 dev->msi_enabled = 0; in pci_msi_shutdown()
976 mask = msi_mask(desc->msi_attrib.multi_cap); in pci_msi_shutdown()
979 /* Restore dev->irq to its default pin-assertion IRQ */ in pci_msi_shutdown()
980 dev->irq = desc->msi_attrib.default_irq; in pci_msi_shutdown()
986 if (!pci_msi_enable || !dev || !dev->msi_enabled) in pci_disable_msi()
995 * pci_msix_vec_count - return the number of device's MSI-X table entries
996 * @dev: pointer to the pci_dev data structure of MSI-X device function
997 * This function returns the number of device's MSI-X table entries and
998 * therefore the number of MSI-X vectors device is capable of sending.
999 * It returns a negative errno if the device is not capable of sending MSI-X
1006 if (!dev->msix_cap) in pci_msix_vec_count()
1007 return -EINVAL; in pci_msix_vec_count()
1009 pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control); in pci_msix_vec_count()
1020 if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0) in __pci_enable_msix()
1021 return -EINVAL; in __pci_enable_msix()
1033 return -EINVAL; /* invalid entry */ in __pci_enable_msix()
1036 return -EINVAL; /* duplicate entry */ in __pci_enable_msix()
1042 if (dev->msi_enabled) { in __pci_enable_msix()
1043 pci_info(dev, "can't enable MSI-X (MSI IRQ already assigned)\n"); in __pci_enable_msix()
1044 return -EINVAL; in __pci_enable_msix()
1053 if (!pci_msi_enable || !dev || !dev->msix_enabled) in pci_msix_shutdown()
1057 dev->msix_enabled = 0; in pci_msix_shutdown()
1061 /* Return the device with MSI-X masked as initial states */ in pci_msix_shutdown()
1067 dev->msix_enabled = 0; in pci_msix_shutdown()
1073 if (!pci_msi_enable || !dev || !dev->msix_enabled) in pci_disable_msix()
1087 * pci_msi_enabled - is MSI enabled?
1089 * Returns true if MSI has not been disabled by the command-line option
1090 * pci=nomsi.
1104 if (!pci_msi_supported(dev, minvec) || dev->current_state != PCI_D0) in __pci_enable_msi_range()
1105 return -EINVAL; in __pci_enable_msi_range()
1107 /* Check whether driver already requested MSI-X IRQs */ in __pci_enable_msi_range()
1108 if (dev->msix_enabled) { in __pci_enable_msi_range()
1109 pci_info(dev, "can't enable MSI (MSI-X already enabled)\n"); in __pci_enable_msi_range()
1110 return -EINVAL; in __pci_enable_msi_range()
1114 return -ERANGE; in __pci_enable_msi_range()
1116 if (WARN_ON_ONCE(dev->msi_enabled)) in __pci_enable_msi_range()
1117 return -EINVAL; in __pci_enable_msi_range()
1123 return -ENOSPC; in __pci_enable_msi_range()
1132 return -ENOSPC; in __pci_enable_msi_range()
1142 return -ENOSPC; in __pci_enable_msi_range()
1166 return -ERANGE; in __pci_enable_msix_range()
1168 if (WARN_ON_ONCE(dev->msix_enabled)) in __pci_enable_msix_range()
1169 return -EINVAL; in __pci_enable_msix_range()
1175 return -ENOSPC; in __pci_enable_msix_range()
1185 return -ENOSPC; in __pci_enable_msix_range()
1192 * pci_enable_msix_range - configure device's MSI-X capability structure
1193 * @dev: pointer to the pci_dev data structure of MSI-X device function
1194 * @entries: pointer to an array of MSI-X entries
1195 * @minvec: minimum number of MSI-X IRQs requested
1196 * @maxvec: maximum number of MSI-X IRQs requested
1198 * Setup the MSI-X capability structure of device function with a maximum
1200 * upon its software driver call to request for MSI-X mode enabled on its
1203 * indicates the successful configuration of MSI-X capability structure
1204 * with new allocated MSI-X interrupts.
1214 * pci_alloc_irq_vectors_affinity - allocate multiple IRQs for a device
1215 * @dev: PCI device to operate on
1221 * Allocate up to @max_vecs interrupt vectors for @dev, using MSI-X or MSI
1226 * available for @dev the function will fail with -ENOSPC.
1236 int nvecs = -ENOSPC; in pci_alloc_irq_vectors_affinity()
1261 if (min_vecs == 1 && dev->irq) { in pci_alloc_irq_vectors_affinity()
1279 * pci_free_irq_vectors - free previously allocated IRQs for a device
1280 * @dev: PCI device to operate on
1292 * pci_irq_vector - return Linux IRQ number of a device vector
1293 * @dev: PCI device to operate on
1294 * @nr: Interrupt vector index (0-based)
1297 * MSI-X: The index in the MSI-X vector table
1301 * Return: The Linux interrupt number or -EINVAl if @nr is out of range.
1305 if (dev->msix_enabled) { in pci_irq_vector()
1309 if (entry->msi_attrib.entry_nr == nr) in pci_irq_vector()
1310 return entry->irq; in pci_irq_vector()
1313 return -EINVAL; in pci_irq_vector()
1316 if (dev->msi_enabled) { in pci_irq_vector()
1319 if (WARN_ON_ONCE(nr >= entry->nvec_used)) in pci_irq_vector()
1320 return -EINVAL; in pci_irq_vector()
1323 return -EINVAL; in pci_irq_vector()
1326 return dev->irq + nr; in pci_irq_vector()
1331 * pci_irq_get_affinity - return the affinity of a particular MSI vector
1332 * @dev: PCI device to operate on
1333 * @nr: device-relative interrupt vector index (0-based).
1336 * MSI-X: The index in the MSI-X vector table
1344 if (dev->msix_enabled) { in pci_irq_get_affinity()
1348 if (entry->msi_attrib.entry_nr == nr) in pci_irq_get_affinity()
1349 return &entry->affinity->mask; in pci_irq_get_affinity()
1353 } else if (dev->msi_enabled) { in pci_irq_get_affinity()
1356 if (WARN_ON_ONCE(!entry || !entry->affinity || in pci_irq_get_affinity()
1357 nr >= entry->nvec_used)) in pci_irq_get_affinity()
1360 return &entry->affinity[nr].mask; in pci_irq_get_affinity()
1369 return to_pci_dev(desc->dev); in msi_desc_to_pci_dev()
1377 return dev->bus->sysdata; in msi_desc_to_pci_sysdata()
1383 * pci_msi_domain_write_msg - Helper to write MSI message to PCI config space
1392 * For MSI-X desc->irq is always equal to irq_data->irq. For in pci_msi_domain_write_msg()
1395 if (desc->irq == irq_data->irq) in pci_msi_domain_write_msg()
1400 * pci_msi_domain_calc_hwirq - Generate a unique ID for an MSI source
1409 return (irq_hw_number_t)desc->msi_attrib.entry_nr | in pci_msi_domain_calc_hwirq()
1411 (pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 27; in pci_msi_domain_calc_hwirq()
1416 return !desc->msi_attrib.is_msix && desc->nvec_used > 1; in pci_msi_desc_is_multi_msi()
1420 * pci_msi_domain_check_cap - Verify that @domain supports the capabilities
1422 * @domain: The interrupt domain to check
1423 * @info: The domain info for verification
1428 * 1 if Multi MSI is requested, but the domain does not support it
1429 * -ENOTSUPP otherwise
1431 int pci_msi_domain_check_cap(struct irq_domain *domain, in pci_msi_domain_check_cap() argument
1438 !(info->flags & MSI_FLAG_MULTI_PCI_MSI)) in pci_msi_domain_check_cap()
1440 else if (desc->msi_attrib.is_msix && !(info->flags & MSI_FLAG_PCI_MSIX)) in pci_msi_domain_check_cap()
1441 return -ENOTSUPP; in pci_msi_domain_check_cap()
1446 static int pci_msi_domain_handle_error(struct irq_domain *domain, in pci_msi_domain_handle_error() argument
1450 if (pci_msi_desc_is_multi_msi(desc) && error == -ENOSPC) in pci_msi_domain_handle_error()
1459 arg->desc = desc; in pci_msi_domain_set_desc()
1460 arg->hwirq = pci_msi_domain_calc_hwirq(desc); in pci_msi_domain_set_desc()
1471 struct msi_domain_ops *ops = info->ops; in pci_msi_domain_update_dom_ops()
1474 info->ops = &pci_msi_domain_ops_default; in pci_msi_domain_update_dom_ops()
1476 if (ops->set_desc == NULL) in pci_msi_domain_update_dom_ops()
1477 ops->set_desc = pci_msi_domain_set_desc; in pci_msi_domain_update_dom_ops()
1478 if (ops->msi_check == NULL) in pci_msi_domain_update_dom_ops()
1479 ops->msi_check = pci_msi_domain_check_cap; in pci_msi_domain_update_dom_ops()
1480 if (ops->handle_error == NULL) in pci_msi_domain_update_dom_ops()
1481 ops->handle_error = pci_msi_domain_handle_error; in pci_msi_domain_update_dom_ops()
1487 struct irq_chip *chip = info->chip; in pci_msi_domain_update_chip_ops()
1490 if (!chip->irq_write_msi_msg) in pci_msi_domain_update_chip_ops()
1491 chip->irq_write_msi_msg = pci_msi_domain_write_msg; in pci_msi_domain_update_chip_ops()
1492 if (!chip->irq_mask) in pci_msi_domain_update_chip_ops()
1493 chip->irq_mask = pci_msi_mask_irq; in pci_msi_domain_update_chip_ops()
1494 if (!chip->irq_unmask) in pci_msi_domain_update_chip_ops()
1495 chip->irq_unmask = pci_msi_unmask_irq; in pci_msi_domain_update_chip_ops()
1499 * pci_msi_create_irq_domain - Create a MSI interrupt domain
1501 * @info: MSI domain info
1502 * @parent: Parent irq domain
1504 * Updates the domain and chip ops and creates a MSI interrupt domain.
1507 * A domain pointer or NULL in case of failure.
1513 struct irq_domain *domain; in pci_msi_create_irq_domain() local
1515 if (WARN_ON(info->flags & MSI_FLAG_LEVEL_CAPABLE)) in pci_msi_create_irq_domain()
1516 info->flags &= ~MSI_FLAG_LEVEL_CAPABLE; in pci_msi_create_irq_domain()
1518 if (info->flags & MSI_FLAG_USE_DEF_DOM_OPS) in pci_msi_create_irq_domain()
1520 if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS) in pci_msi_create_irq_domain()
1523 info->flags |= MSI_FLAG_ACTIVATE_EARLY; in pci_msi_create_irq_domain()
1525 info->flags |= MSI_FLAG_MUST_REACTIVATE; in pci_msi_create_irq_domain()
1527 /* PCI-MSI is oneshot-safe */ in pci_msi_create_irq_domain()
1528 info->chip->flags |= IRQCHIP_ONESHOT_SAFE; in pci_msi_create_irq_domain()
1530 domain = msi_create_irq_domain(fwnode, info, parent); in pci_msi_create_irq_domain()
1531 if (!domain) in pci_msi_create_irq_domain()
1534 irq_domain_update_bus_token(domain, DOMAIN_BUS_PCI_MSI); in pci_msi_create_irq_domain()
1535 return domain; in pci_msi_create_irq_domain()
1541 * so with DMA aliases we have to pick the least-worst compromise. Devices with
1547 * case is that of PCI->PCIe so we should always use the alias RID. This echoes
1549 * well enough in practice; in the face of the horrible PCIe<->PCI-X conditions
1557 if (pdev->bus->number != bus || PCI_BUS_NUM(alias) != bus) in get_msi_id_cb()
1564 * pci_msi_domain_get_msi_rid - Get the MSI requester id (RID)
1565 * @domain: The interrupt domain
1566 * @pdev: The PCI device.
1573 u32 pci_msi_domain_get_msi_rid(struct irq_domain *domain, struct pci_dev *pdev) in pci_msi_domain_get_msi_rid() argument
1580 of_node = irq_domain_get_of_node(domain); in pci_msi_domain_get_msi_rid()
1581 rid = of_node ? of_msi_map_id(&pdev->dev, of_node, rid) : in pci_msi_domain_get_msi_rid()
1582 iort_msi_map_id(&pdev->dev, rid); in pci_msi_domain_get_msi_rid()
1588 * pci_msi_get_device_domain - Get the MSI domain for a given PCI device
1589 * @pdev: The PCI device
1591 * Use the firmware data to find a device-specific MSI domain
1594 * Returns: The corresponding MSI domain or NULL if none has been found.
1602 dom = of_msi_map_get_device_domain(&pdev->dev, rid, DOMAIN_BUS_PCI_MSI); in pci_msi_get_device_domain()
1604 dom = iort_get_device_domain(&pdev->dev, rid, in pci_msi_get_device_domain()
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.
1615 * non-standard PCI/MSI.
1619 struct irq_domain *dom = dev_get_msi_domain(&pdev->dev); in pci_dev_has_special_msi_domain()
1622 dom = dev_get_msi_domain(&pdev->bus->dev); in pci_dev_has_special_msi_domain()
1627 return dom->bus_token != DOMAIN_BUS_PCI_MSI; in pci_dev_has_special_msi_domain()