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()
324 writel(msg->address_lo, base + PCI_MSIX_ENTRY_LOWER_ADDR); in __pci_write_msi_msg()
325 writel(msg->address_hi, base + PCI_MSIX_ENTRY_UPPER_ADDR); in __pci_write_msi_msg()
326 writel(msg->data, base + PCI_MSIX_ENTRY_DATA); in __pci_write_msi_msg()
328 int pos = dev->msi_cap; in __pci_write_msi_msg()
333 msgctl |= entry->msi_attrib.multiple << 4; in __pci_write_msi_msg()
337 msg->address_lo); in __pci_write_msi_msg()
338 if (entry->msi_attrib.is_64) { in __pci_write_msi_msg()
340 msg->address_hi); in __pci_write_msi_msg()
342 msg->data); in __pci_write_msi_msg()
345 msg->data); in __pci_write_msi_msg()
350 entry->msg = *msg; in __pci_write_msi_msg()
352 if (entry->write_msi_msg) in __pci_write_msi_msg()
353 entry->write_msi_msg(entry, entry->write_msi_msg_data); in __pci_write_msi_msg()
367 struct list_head *msi_list = dev_to_msi_list(&dev->dev); in free_msi_irqs()
374 if (entry->irq) in free_msi_irqs()
375 for (i = 0; i < entry->nvec_used; i++) in free_msi_irqs()
376 BUG_ON(irq_has_action(entry->irq + i)); in free_msi_irqs()
381 if (entry->msi_attrib.is_msix) { in free_msi_irqs()
382 if (list_is_last(&entry->list, msi_list)) in free_msi_irqs()
383 iounmap(entry->mask_base); in free_msi_irqs()
386 list_del(&entry->list); in free_msi_irqs()
390 if (dev->msi_irq_groups) { in free_msi_irqs()
391 sysfs_remove_groups(&dev->dev.kobj, dev->msi_irq_groups); in free_msi_irqs()
392 msi_attrs = dev->msi_irq_groups[0]->attrs; in free_msi_irqs()
396 kfree(dev_attr->attr.name); in free_msi_irqs()
401 kfree(dev->msi_irq_groups[0]); in free_msi_irqs()
402 kfree(dev->msi_irq_groups); in free_msi_irqs()
403 dev->msi_irq_groups = NULL; in free_msi_irqs()
409 if (!(dev->dev_flags & PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG)) in pci_intx_for_msi()
418 if (!dev->msi_enabled) in __pci_restore_msi_state()
421 entry = irq_get_msi_desc(dev->irq); in __pci_restore_msi_state()
427 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control); in __pci_restore_msi_state()
428 msi_mask_irq(entry, msi_mask(entry->msi_attrib.multi_cap), in __pci_restore_msi_state()
429 entry->masked); in __pci_restore_msi_state()
431 control |= (entry->msi_attrib.multiple << 4) | PCI_MSI_FLAGS_ENABLE; in __pci_restore_msi_state()
432 pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control); in __pci_restore_msi_state()
439 if (!dev->msix_enabled) in __pci_restore_msix_state()
441 BUG_ON(list_empty(dev_to_msi_list(&dev->dev))); in __pci_restore_msix_state()
450 msix_mask_irq(entry, entry->masked); in __pci_restore_msix_state()
469 retval = kstrtoul(attr->attr.name, 10, &irq); in msi_mode_show()
476 entry->msi_attrib.is_msix ? "msix" : "msi"); in msi_mode_show()
478 return -ENODEV; in msi_mode_show()
489 int ret = -ENOMEM; in populate_msi_sysfs()
496 num_msi += entry->nvec_used; in populate_msi_sysfs()
500 /* Dynamically create the MSI attributes for the PCI device */ in populate_msi_sysfs()
503 return -ENOMEM; in populate_msi_sysfs()
505 for (i = 0; i < entry->nvec_used; i++) { in populate_msi_sysfs()
509 msi_attrs[count] = &msi_dev_attr->attr; in populate_msi_sysfs()
511 sysfs_attr_init(&msi_dev_attr->attr); in populate_msi_sysfs()
512 msi_dev_attr->attr.name = kasprintf(GFP_KERNEL, "%d", in populate_msi_sysfs()
513 entry->irq + i); in populate_msi_sysfs()
514 if (!msi_dev_attr->attr.name) in populate_msi_sysfs()
516 msi_dev_attr->attr.mode = S_IRUGO; in populate_msi_sysfs()
517 msi_dev_attr->show = msi_mode_show; in populate_msi_sysfs()
525 msi_irq_group->name = "msi_irqs"; in populate_msi_sysfs()
526 msi_irq_group->attrs = msi_attrs; in populate_msi_sysfs()
533 ret = sysfs_create_groups(&pdev->dev.kobj, msi_irq_groups); in populate_msi_sysfs()
536 pdev->msi_irq_groups = msi_irq_groups; in populate_msi_sysfs()
549 kfree(msi_attr->name); in populate_msi_sysfs()
569 entry = alloc_msi_entry(&dev->dev, nvec, masks); in msi_setup_entry()
573 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control); in msi_setup_entry()
575 entry->msi_attrib.is_msix = 0; in msi_setup_entry()
576 entry->msi_attrib.is_64 = !!(control & PCI_MSI_FLAGS_64BIT); in msi_setup_entry()
577 entry->msi_attrib.is_virtual = 0; in msi_setup_entry()
578 entry->msi_attrib.entry_nr = 0; in msi_setup_entry()
579 entry->msi_attrib.maskbit = !!(control & PCI_MSI_FLAGS_MASKBIT); in msi_setup_entry()
580 entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */ in msi_setup_entry()
581 entry->msi_attrib.multi_cap = (control & PCI_MSI_FLAGS_QMASK) >> 1; in msi_setup_entry()
582 entry->msi_attrib.multiple = ilog2(__roundup_pow_of_two(nvec)); in msi_setup_entry()
585 entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_64; in msi_setup_entry()
587 entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_32; in msi_setup_entry()
590 if (entry->msi_attrib.maskbit) in msi_setup_entry()
591 pci_read_config_dword(dev, entry->mask_pos, &entry->masked); in msi_setup_entry()
603 if (!dev->no_64bit_msi || !entry->msg.address_hi) in msi_verify_entries()
605 pci_err(dev, "Device has broken 64-bit MSI but arch" in msi_verify_entries()
607 return -EIO; in msi_verify_entries()
613 * msi_capability_init - configure device's MSI capability structure
635 return -ENOMEM; in msi_capability_init()
638 mask = msi_mask(entry->msi_attrib.multi_cap); in msi_capability_init()
641 list_add_tail(&entry->list, dev_to_msi_list(&dev->dev)); in msi_capability_init()
668 dev->msi_enabled = 1; in msi_capability_init()
671 dev->irq = entry->irq; in msi_capability_init()
682 pci_read_config_dword(dev, dev->msix_cap + PCI_MSIX_TABLE, in msix_map_region()
708 entry = alloc_msi_entry(&dev->dev, 1, curmsk); in msix_setup_entries()
715 ret = -ENOMEM; in msix_setup_entries()
719 entry->msi_attrib.is_msix = 1; in msix_setup_entries()
720 entry->msi_attrib.is_64 = 1; in msix_setup_entries()
722 entry->msi_attrib.entry_nr = entries[i].entry; in msix_setup_entries()
724 entry->msi_attrib.entry_nr = i; in msix_setup_entries()
726 entry->msi_attrib.is_virtual = in msix_setup_entries()
727 entry->msi_attrib.entry_nr >= vec_count; in msix_setup_entries()
729 entry->msi_attrib.default_irq = dev->irq; in msix_setup_entries()
730 entry->mask_base = base; in msix_setup_entries()
732 list_add_tail(&entry->list, dev_to_msi_list(&dev->dev)); in msix_setup_entries()
751 entries[i++].vector = entry->irq; in msix_program_entries()
755 entry->masked = readl(desc_addr + in msix_program_entries()
758 entry->masked = 0; in msix_program_entries()
765 * msix_capability_init - configure device's MSI-X capability
766 * @dev: pointer to the pci_dev data structure of MSI-X device function
771 * Setup the MSI-X capability structure of device function with a
772 * single MSI-X IRQ. A return of zero indicates the successful setup of
773 * requested MSI-X entries with allocated IRQs or non-zero for otherwise.
782 /* Ensure MSI-X is disabled while it is set up */ in msix_capability_init()
785 pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control); in msix_capability_init()
786 /* Request & Map MSI-X table region */ in msix_capability_init()
789 return -ENOMEM; in msix_capability_init()
805 * Some devices require MSI-X to be enabled before we can touch the in msix_capability_init()
806 * MSI-X registers. We need to mask all the vectors to prevent in msix_capability_init()
818 /* Set MSI-X enabled bits and unmask the function */ in msix_capability_init()
820 dev->msix_enabled = 1; in msix_capability_init()
836 if (entry->irq != 0) in msix_capability_init()
850 * pci_msi_supported - check whether MSI may be enabled on a device
855 * to determine if MSI/-X are supported for the device. If MSI/-X is
866 if (!dev || dev->no_msi) in pci_msi_supported()
881 * We expect only arch-specific PCI host bus controller driver in pci_msi_supported()
882 * or quirks for specific PCI bridges to be setting NO_MSI. in pci_msi_supported()
884 for (bus = dev->bus; bus; bus = bus->parent) in pci_msi_supported()
885 if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI) in pci_msi_supported()
892 * pci_msi_vec_count - Return the number of MSI vectors a device can send
906 if (!dev->msi_cap) in pci_msi_vec_count()
907 return -EINVAL; in pci_msi_vec_count()
909 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl); in pci_msi_vec_count()
921 if (!pci_msi_enable || !dev || !dev->msi_enabled) in pci_msi_shutdown()
924 BUG_ON(list_empty(dev_to_msi_list(&dev->dev))); in pci_msi_shutdown()
929 dev->msi_enabled = 0; in pci_msi_shutdown()
932 mask = msi_mask(desc->msi_attrib.multi_cap); in pci_msi_shutdown()
936 /* Restore dev->irq to its default pin-assertion IRQ */ in pci_msi_shutdown()
937 dev->irq = desc->msi_attrib.default_irq; in pci_msi_shutdown()
943 if (!pci_msi_enable || !dev || !dev->msi_enabled) in pci_disable_msi()
952 * pci_msix_vec_count - return the number of device's MSI-X table entries
953 * @dev: pointer to the pci_dev data structure of MSI-X device function
954 * This function returns the number of device's MSI-X table entries and
955 * therefore the number of MSI-X vectors device is capable of sending.
956 * It returns a negative errno if the device is not capable of sending MSI-X
963 if (!dev->msix_cap) in pci_msix_vec_count()
964 return -EINVAL; in pci_msix_vec_count()
966 pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control); in pci_msix_vec_count()
977 if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0) in __pci_enable_msix()
978 return -EINVAL; in __pci_enable_msix()
990 return -EINVAL; /* invalid entry */ in __pci_enable_msix()
993 return -EINVAL; /* duplicate entry */ in __pci_enable_msix()
999 if (dev->msi_enabled) { in __pci_enable_msix()
1000 pci_info(dev, "can't enable MSI-X (MSI IRQ already assigned)\n"); in __pci_enable_msix()
1001 return -EINVAL; in __pci_enable_msix()
1010 if (!pci_msi_enable || !dev || !dev->msix_enabled) in pci_msix_shutdown()
1014 dev->msix_enabled = 0; in pci_msix_shutdown()
1018 /* Return the device with MSI-X masked as initial states */ in pci_msix_shutdown()
1026 dev->msix_enabled = 0; in pci_msix_shutdown()
1032 if (!pci_msi_enable || !dev || !dev->msix_enabled) in pci_disable_msix()
1046 * pci_msi_enabled - is MSI enabled?
1048 * Returns true if MSI has not been disabled by the command-line option
1049 * pci=nomsi.
1063 if (!pci_msi_supported(dev, minvec) || dev->current_state != PCI_D0) in __pci_enable_msi_range()
1064 return -EINVAL; in __pci_enable_msi_range()
1066 /* Check whether driver already requested MSI-X IRQs */ in __pci_enable_msi_range()
1067 if (dev->msix_enabled) { in __pci_enable_msi_range()
1068 pci_info(dev, "can't enable MSI (MSI-X already enabled)\n"); in __pci_enable_msi_range()
1069 return -EINVAL; in __pci_enable_msi_range()
1073 return -ERANGE; in __pci_enable_msi_range()
1075 if (WARN_ON_ONCE(dev->msi_enabled)) in __pci_enable_msi_range()
1076 return -EINVAL; in __pci_enable_msi_range()
1082 return -ENOSPC; in __pci_enable_msi_range()
1091 return -ENOSPC; in __pci_enable_msi_range()
1101 return -ENOSPC; in __pci_enable_msi_range()
1125 return -ERANGE; in __pci_enable_msix_range()
1127 if (WARN_ON_ONCE(dev->msix_enabled)) in __pci_enable_msix_range()
1128 return -EINVAL; in __pci_enable_msix_range()
1134 return -ENOSPC; in __pci_enable_msix_range()
1144 return -ENOSPC; in __pci_enable_msix_range()
1151 * pci_enable_msix_range - configure device's MSI-X capability structure
1152 * @dev: pointer to the pci_dev data structure of MSI-X device function
1153 * @entries: pointer to an array of MSI-X entries
1154 * @minvec: minimum number of MSI-X IRQs requested
1155 * @maxvec: maximum number of MSI-X IRQs requested
1157 * Setup the MSI-X capability structure of device function with a maximum
1159 * upon its software driver call to request for MSI-X mode enabled on its
1162 * indicates the successful configuration of MSI-X capability structure
1163 * with new allocated MSI-X interrupts.
1173 * pci_alloc_irq_vectors_affinity - allocate multiple IRQs for a device
1174 * @dev: PCI device to operate on
1180 * Allocate up to @max_vecs interrupt vectors for @dev, using MSI-X or MSI
1185 * available for @dev the function will fail with -ENOSPC.
1195 int nvecs = -ENOSPC; in pci_alloc_irq_vectors_affinity()
1220 if (min_vecs == 1 && dev->irq) { in pci_alloc_irq_vectors_affinity()
1238 * pci_free_irq_vectors - free previously allocated IRQs for a device
1239 * @dev: PCI device to operate on
1251 * pci_irq_vector - return Linux IRQ number of a device vector
1252 * @dev: PCI device to operate on
1253 * @nr: device-relative interrupt vector index (0-based).
1257 if (dev->msix_enabled) { in pci_irq_vector()
1263 return entry->irq; in pci_irq_vector()
1267 return -EINVAL; in pci_irq_vector()
1270 if (dev->msi_enabled) { in pci_irq_vector()
1273 if (WARN_ON_ONCE(nr >= entry->nvec_used)) in pci_irq_vector()
1274 return -EINVAL; in pci_irq_vector()
1277 return -EINVAL; in pci_irq_vector()
1280 return dev->irq + nr; in pci_irq_vector()
1285 * pci_irq_get_affinity - return the affinity of a particular MSI vector
1286 * @dev: PCI device to operate on
1287 * @nr: device-relative interrupt vector index (0-based).
1291 if (dev->msix_enabled) { in pci_irq_get_affinity()
1297 return &entry->affinity->mask; in pci_irq_get_affinity()
1302 } else if (dev->msi_enabled) { in pci_irq_get_affinity()
1305 if (WARN_ON_ONCE(!entry || !entry->affinity || in pci_irq_get_affinity()
1306 nr >= entry->nvec_used)) in pci_irq_get_affinity()
1309 return &entry->affinity[nr].mask; in pci_irq_get_affinity()
1318 return to_pci_dev(desc->dev); in msi_desc_to_pci_dev()
1326 return dev->bus->sysdata; in msi_desc_to_pci_sysdata()
1332 * pci_msi_domain_write_msg - Helper to write MSI message to PCI config space
1341 * For MSI-X desc->irq is always equal to irq_data->irq. For in pci_msi_domain_write_msg()
1344 if (desc->irq == irq_data->irq) in pci_msi_domain_write_msg()
1349 * pci_msi_domain_calc_hwirq - Generate a unique ID for an MSI source
1358 return (irq_hw_number_t)desc->msi_attrib.entry_nr | in pci_msi_domain_calc_hwirq()
1360 (pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 27; in pci_msi_domain_calc_hwirq()
1365 return !desc->msi_attrib.is_msix && desc->nvec_used > 1; in pci_msi_desc_is_multi_msi()
1369 * pci_msi_domain_check_cap - Verify that @domain supports the capabilities
1371 * @domain: The interrupt domain to check
1372 * @info: The domain info for verification
1377 * 1 if Multi MSI is requested, but the domain does not support it
1378 * -ENOTSUPP otherwise
1380 int pci_msi_domain_check_cap(struct irq_domain *domain, in pci_msi_domain_check_cap() argument
1387 !(info->flags & MSI_FLAG_MULTI_PCI_MSI)) in pci_msi_domain_check_cap()
1389 else if (desc->msi_attrib.is_msix && !(info->flags & MSI_FLAG_PCI_MSIX)) in pci_msi_domain_check_cap()
1390 return -ENOTSUPP; in pci_msi_domain_check_cap()
1395 static int pci_msi_domain_handle_error(struct irq_domain *domain, in pci_msi_domain_handle_error() argument
1399 if (pci_msi_desc_is_multi_msi(desc) && error == -ENOSPC) in pci_msi_domain_handle_error()
1408 arg->desc = desc; in pci_msi_domain_set_desc()
1409 arg->hwirq = pci_msi_domain_calc_hwirq(desc); in pci_msi_domain_set_desc()
1420 struct msi_domain_ops *ops = info->ops; in pci_msi_domain_update_dom_ops()
1423 info->ops = &pci_msi_domain_ops_default; in pci_msi_domain_update_dom_ops()
1425 if (ops->set_desc == NULL) in pci_msi_domain_update_dom_ops()
1426 ops->set_desc = pci_msi_domain_set_desc; in pci_msi_domain_update_dom_ops()
1427 if (ops->msi_check == NULL) in pci_msi_domain_update_dom_ops()
1428 ops->msi_check = pci_msi_domain_check_cap; in pci_msi_domain_update_dom_ops()
1429 if (ops->handle_error == NULL) in pci_msi_domain_update_dom_ops()
1430 ops->handle_error = pci_msi_domain_handle_error; in pci_msi_domain_update_dom_ops()
1436 struct irq_chip *chip = info->chip; in pci_msi_domain_update_chip_ops()
1439 if (!chip->irq_write_msi_msg) in pci_msi_domain_update_chip_ops()
1440 chip->irq_write_msi_msg = pci_msi_domain_write_msg; in pci_msi_domain_update_chip_ops()
1441 if (!chip->irq_mask) in pci_msi_domain_update_chip_ops()
1442 chip->irq_mask = pci_msi_mask_irq; in pci_msi_domain_update_chip_ops()
1443 if (!chip->irq_unmask) in pci_msi_domain_update_chip_ops()
1444 chip->irq_unmask = pci_msi_unmask_irq; in pci_msi_domain_update_chip_ops()
1448 * pci_msi_create_irq_domain - Create a MSI interrupt domain
1450 * @info: MSI domain info
1451 * @parent: Parent irq domain
1453 * Updates the domain and chip ops and creates a MSI interrupt domain.
1456 * A domain pointer or NULL in case of failure.
1462 struct irq_domain *domain; in pci_msi_create_irq_domain() local
1464 if (WARN_ON(info->flags & MSI_FLAG_LEVEL_CAPABLE)) in pci_msi_create_irq_domain()
1465 info->flags &= ~MSI_FLAG_LEVEL_CAPABLE; in pci_msi_create_irq_domain()
1467 if (info->flags & MSI_FLAG_USE_DEF_DOM_OPS) in pci_msi_create_irq_domain()
1469 if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS) in pci_msi_create_irq_domain()
1472 info->flags |= MSI_FLAG_ACTIVATE_EARLY; in pci_msi_create_irq_domain()
1474 info->flags |= MSI_FLAG_MUST_REACTIVATE; in pci_msi_create_irq_domain()
1476 /* PCI-MSI is oneshot-safe */ in pci_msi_create_irq_domain()
1477 info->chip->flags |= IRQCHIP_ONESHOT_SAFE; in pci_msi_create_irq_domain()
1479 domain = msi_create_irq_domain(fwnode, info, parent); in pci_msi_create_irq_domain()
1480 if (!domain) in pci_msi_create_irq_domain()
1483 irq_domain_update_bus_token(domain, DOMAIN_BUS_PCI_MSI); in pci_msi_create_irq_domain()
1484 return domain; in pci_msi_create_irq_domain()
1490 * so with DMA aliases we have to pick the least-worst compromise. Devices with
1496 * case is that of PCI->PCIe so we should always use the alias RID. This echoes
1498 * well enough in practice; in the face of the horrible PCIe<->PCI-X conditions
1506 if (pdev->bus->number != bus || PCI_BUS_NUM(alias) != bus) in get_msi_id_cb()
1513 * pci_msi_domain_get_msi_rid - Get the MSI requester id (RID)
1514 * @domain: The interrupt domain
1515 * @pdev: The PCI device.
1522 u32 pci_msi_domain_get_msi_rid(struct irq_domain *domain, struct pci_dev *pdev) in pci_msi_domain_get_msi_rid() argument
1529 of_node = irq_domain_get_of_node(domain); in pci_msi_domain_get_msi_rid()
1530 rid = of_node ? of_msi_map_id(&pdev->dev, of_node, rid) : in pci_msi_domain_get_msi_rid()
1531 iort_msi_map_id(&pdev->dev, rid); in pci_msi_domain_get_msi_rid()
1537 * pci_msi_get_device_domain - Get the MSI domain for a given PCI device
1538 * @pdev: The PCI device
1540 * Use the firmware data to find a device-specific MSI domain
1543 * Returns: The corresponding MSI domain or NULL if none has been found.
1551 dom = of_msi_map_get_device_domain(&pdev->dev, rid, DOMAIN_BUS_PCI_MSI); in pci_msi_get_device_domain()
1553 dom = iort_get_device_domain(&pdev->dev, rid, in pci_msi_get_device_domain()
1559 * pci_dev_has_special_msi_domain - Check whether the device is handled by
1560 * a non-standard PCI-MSI domain
1561 * @pdev: The PCI device to check.
1564 * non-standard PCI/MSI.
1568 struct irq_domain *dom = dev_get_msi_domain(&pdev->dev); in pci_dev_has_special_msi_domain()
1571 dom = dev_get_msi_domain(&pdev->bus->dev); in pci_dev_has_special_msi_domain()
1576 return dom->bus_token != DOMAIN_BUS_PCI_MSI; in pci_dev_has_special_msi_domain()