Lines Matching +full:msi +full:- +full:x
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright 2006-2007 Michael Ellerman, IBM Corp.
10 #include <linux/irqchip/irq-msi-lib.h>
12 #include <linux/msi.h>
17 #include <asm/ppc-pci.h>
40 addr = rtas_config_addr(pdn->busno, pdn->devfn, 0); in rtas_change_msi()
41 buid = pdn->phb->buid; in rtas_change_msi()
65 rc = -rc; in rtas_change_msi()
82 * disabling MSI with the explicit interface also disables MSI-X in rtas_disable_msi()
101 addr = rtas_config_addr(pdn->busno, pdn->devfn, 0); in rtas_query_irq_number()
102 buid = pdn->phb->buid; in rtas_query_irq_number()
128 return -ENOENT; in check_req()
136 return -ENOSPC; in check_req()
146 return check_req(pdev, nvec, "ibm,req#msi"); in check_req_msi()
151 return check_req(pdev, nvec, "ibm,req#msi-x"); in check_req_msix()
163 p = of_get_property(dn, "ibm,pe-total-#msi", NULL); in __find_pe_total_msi()
195 if (edev->pe) in find_pe_dn()
196 edev = list_first_entry(&edev->pe->edevs, struct eeh_dev, in find_pe_dn()
198 dn = pci_device_to_OF_node(edev->pdev); in find_pe_dn()
231 p = of_get_property(dn, "class-code", NULL); in count_non_bridge_devices()
235 counts->num_devices++; in count_non_bridge_devices()
246 if (dn == counts->requestor) in count_spare_msis()
247 req = counts->request; in count_spare_msis()
249 /* We don't know if a driver will try to use MSI or MSI-X, in count_spare_msis()
252 p = of_get_property(dn, "ibm,req#msi", NULL); in count_spare_msis()
256 p = of_get_property(dn, "ibm,req#msi-x", NULL); in count_spare_msis()
261 if (req < counts->quota) in count_spare_msis()
262 counts->spare += counts->quota - req; in count_spare_msis()
263 else if (req > counts->quota) in count_spare_msis()
264 counts->over_quota++; in count_spare_msis()
313 /* Divide any spare by the number of over-quota requestors */ in msi_quota_for_device()
333 * fact that we using RTAS for MSIs, we don't have the 32 bit MSI RTAS in rtas_hack_32bit_msi_gen2()
336 dev_info(&pdev->dev, in rtas_hack_32bit_msi_gen2()
337 "rtas_msi: No 32 bit MSI firmware support, forcing 32 bit MSI\n"); in rtas_hack_32bit_msi_gen2()
338 pci_read_config_dword(pdev, pdev->msi_cap + PCI_MSI_ADDRESS_HI, &addr_hi); in rtas_hack_32bit_msi_gen2()
339 addr_lo = 0xffff0000 | ((addr_hi >> (48 - 32)) << 4); in rtas_hack_32bit_msi_gen2()
340 pci_write_config_dword(pdev, pdev->msi_cap + PCI_MSI_ADDRESS_LO, addr_lo); in rtas_hack_32bit_msi_gen2()
341 pci_write_config_dword(pdev, pdev->msi_cap + PCI_MSI_ADDRESS_HI, 0); in rtas_hack_32bit_msi_gen2()
382 * return MSI-Xs. in rtas_prepare_msi_irqs()
386 if (pdev->no_64bit_msi) { in rtas_prepare_msi_irqs()
390 * We only want to run the 32 bit MSI hack below if in rtas_prepare_msi_irqs()
393 if (pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) in rtas_prepare_msi_irqs()
399 rc = -1; in rtas_prepare_msi_irqs()
412 if (pdev->no_64bit_msi) in rtas_prepare_msi_irqs()
433 struct msi_domain_info *info = domain->host_data; in pseries_msi_ops_prepare()
435 int type = (info->flags & MSI_FLAG_PCI_MSIX) ? PCI_CAP_ID_MSIX : PCI_CAP_ID_MSI; in pseries_msi_ops_prepare()
441 * RTAS can not disable one MSI at a time. It's all or nothing. Do it
446 struct pci_dev *pdev = to_pci_dev(domain->dev); in pseries_msi_ops_teardown()
453 d = d->parent_data; in pseries_msi_shutdown()
454 if (d->chip->irq_shutdown) in pseries_msi_shutdown()
455 d->chip->irq_shutdown(d); in pseries_msi_shutdown()
467 * deactivate an IRQ used for testing MSI support. in pseries_msi_write_msg()
469 entry->msg = *msg; in pseries_msi_write_msg()
475 struct irq_chip *chip = info->chip; in pseries_init_dev_msi_info()
480 chip->irq_shutdown = pseries_msi_shutdown; in pseries_init_dev_msi_info()
481 chip->irq_write_msi_msg = pseries_msi_write_msg; in pseries_init_dev_msi_info()
483 info->ops->msi_prepare = pseries_msi_ops_prepare; in pseries_init_dev_msi_info()
484 info->ops->msi_teardown = pseries_msi_ops_teardown; in pseries_init_dev_msi_info()
503 .prefix = "pSeries-",
511 if (dev->current_state == PCI_D0) in pseries_msi_compose_msg()
514 get_cached_msi_msg(data->irq, msg); in pseries_msi_compose_msg()
518 .name = "pSeries-MSI",
533 parent_fwspec.fwnode = domain->parent->fwnode; in pseries_irq_parent_domain_alloc()
548 struct pci_controller *phb = domain->host_data; in pseries_irq_domain_alloc()
550 struct msi_desc *desc = info->desc; in pseries_irq_domain_alloc()
555 hwirq = rtas_query_irq_number(pci_get_pdn(pdev), desc->msi_index); in pseries_irq_domain_alloc()
557 dev_err(&pdev->dev, "Failed to query HW IRQ: %d\n", hwirq); in pseries_irq_domain_alloc()
561 dev_dbg(&pdev->dev, "%s bridge %pOF %d/%x #%d\n", __func__, in pseries_irq_domain_alloc()
562 phb->dn, virq, hwirq, nr_irqs); in pseries_irq_domain_alloc()
570 &pseries_msi_irq_chip, domain->host_data); in pseries_irq_domain_alloc()
576 /* TODO: handle RTAS cleanup in ->msi_finish() ? */ in pseries_irq_domain_alloc()
587 pr_debug("%s bridge %pOF %d #%d\n", __func__, phb->dn, virq, nr_irqs); in pseries_irq_domain_free()
602 .fwnode = of_fwnode_handle(phb->dn), in __pseries_msi_allocate_domains()
609 phb->dev_domain = msi_create_parent_irq_domain(&info, &pseries_msi_parent_ops); in __pseries_msi_allocate_domains()
610 if (!phb->dev_domain) { in __pseries_msi_allocate_domains()
611 pr_err("PCI: failed to create MSI IRQ domain bridge %pOF (domain %d)\n", in __pseries_msi_allocate_domains()
612 phb->dn, phb->global_number); in __pseries_msi_allocate_domains()
613 return -ENOMEM; in __pseries_msi_allocate_domains()
623 if (!__find_pe_total_msi(phb->dn, &count)) { in pseries_msi_allocate_domains()
625 phb->dn, phb->global_number); in pseries_msi_allocate_domains()
626 return -ENOSPC; in pseries_msi_allocate_domains()
634 if (phb->dev_domain) in pseries_msi_free_domains()
635 irq_domain_remove(phb->dev_domain); in pseries_msi_free_domains()
640 /* No LSI -> leave MSIs (if any) configured */ in rtas_msi_pci_irq_fixup()
641 if (!pdev->irq) { in rtas_msi_pci_irq_fixup()
642 dev_dbg(&pdev->dev, "rtas_msi: no LSI, nothing to do.\n"); in rtas_msi_pci_irq_fixup()
646 /* No MSI -> MSIs can't have been assigned by fw, leave LSI */ in rtas_msi_pci_irq_fixup()
648 dev_dbg(&pdev->dev, "rtas_msi: no req#msi/x, nothing to do.\n"); in rtas_msi_pci_irq_fixup()
652 dev_dbg(&pdev->dev, "rtas_msi: disabling existing MSI.\n"); in rtas_msi_pci_irq_fixup()
663 pr_debug("rtas_msi: no RTAS tokens, no MSI support.\n"); in rtas_msi_init()
664 return -1; in rtas_msi_init()
667 pr_debug("rtas_msi: Registering RTAS MSI callbacks.\n"); in rtas_msi_init()