Lines Matching +full:msi +full:- +full:x

1 // SPDX-License-Identifier: GPL-2.0
27 * be one of the first 32 MSI-X entries. Per PCI r3.0, sec 6.8.3.1, MSI
32 #define get_descriptor_id(type, service) (((type - 4) << 8) | service)
41 * release_pcie_device - free PCI Express port service device structure
54 * services are enabled in "mask". Return the number of MSI/MSI-X vectors
65 * the MSI-X table entry or the MSI offset between the base Message in pcie_message_numbers()
81 pos = dev->aer_cap; in pcie_message_numbers()
105 * pcie_port_enable_irq_vec - try to set up MSI-X or MSI as interrupt mode
118 /* Allocate the maximum possible number of MSI/MSI-X vectors */ in pcie_port_enable_irq_vec()
128 return -EIO; in pcie_port_enable_irq_vec()
137 * If we're using MSI, hardware is *allowed* to change the Interrupt in pcie_port_enable_irq_vec()
151 /* PME, hotplug and bandwidth notification share an MSI/MSI-X vector */ in pcie_port_enable_irq_vec()
170 * pcie_init_service_irqs - initialize irqs for PCI Express port services
182 irqs[i] = -1; in pcie_init_service_irqs()
185 * If we support PME but can't use MSI/MSI-X for it, we have to in pcie_init_service_irqs()
192 /* Try to use MSI-X or MSI if supported */ in pcie_init_service_irqs()
200 return -ENODEV; in pcie_init_service_irqs()
209 * get_port_device_capability - discover capabilities of a PCI Express port
214 * 7.9 - 7.11.
220 struct pci_host_bridge *host = pci_find_host_bridge(dev->bus); in get_port_device_capability()
223 if (dev->is_pciehp && in get_port_device_capability()
226 (pcie_ports_native || host->native_pcie_hotplug)) { in get_port_device_capability()
230 * Disable hot-plug interrupts in case they have been enabled in get_port_device_capability()
231 * by the BIOS and the hot-plug service driver won't be loaded in get_port_device_capability()
242 dev->aer_cap && pci_aer_available() && in get_port_device_capability()
243 (pcie_ports_native || host->native_aer)) in get_port_device_capability()
250 (pcie_ports_native || host->native_pme)) { in get_port_device_capability()
262 * With dpc-native, allow Linux to use DPC even if it doesn't have in get_port_device_capability()
277 hweight8(dev->supported_speeds) > 1) in get_port_device_capability()
285 * pcie_device_init - allocate and initialize PCI Express port service device
298 return -ENOMEM; in pcie_device_init()
299 pcie->port = pdev; in pcie_device_init()
300 pcie->irq = irq; in pcie_device_init()
301 pcie->service = service; in pcie_device_init()
304 device = &pcie->device; in pcie_device_init()
305 device->bus = &pcie_port_bus_type; in pcie_device_init()
306 device->release = release_pcie_device; /* callback to free pcie dev */ in pcie_device_init()
307 dev_set_name(device, "%s:pcie%03x", in pcie_device_init()
310 device->parent = &pdev->dev; in pcie_device_init()
325 * pcie_port_device_register - register PCI Express port
362 status = -ENODEV; in pcie_port_device_register()
391 if ((dev->bus == &pcie_port_bus_type) && dev->driver) { in pcie_port_device_iter()
392 service_driver = to_service_driver(dev->driver); in pcie_port_device_iter()
402 * pcie_port_device_suspend - suspend port services associated with a PCIe port
418 * pcie_port_device_resume - resume port services associated with a PCIe port
428 * pcie_port_device_runtime_suspend - runtime suspend port services
438 * pcie_port_device_runtime_resume - runtime resume port services
450 if (dev->bus == &pcie_port_bus_type) in remove_iter()
462 service = pdrvs->service; in find_service_iter()
464 if (device->bus == &pcie_port_bus_type && device->driver) { in find_service_iter()
465 service_driver = to_service_driver(device->driver); in find_service_iter()
466 if (service_driver->service == service) { in find_service_iter()
467 pdrvs->drv = service_driver; in find_service_iter()
468 pdrvs->dev = device; in find_service_iter()
477 * pcie_port_find_device - find the struct device
491 device_for_each_child(&dev->dev, &pdrvs, find_service_iter); in pcie_port_find_device()
499 * pcie_port_device_remove - unregister PCI Express port service devices
503 * disable MSI-X or MSI for the port.
507 device_for_each_child(&dev->dev, NULL, remove_iter); in pcie_port_device_remove()
512 * pcie_port_probe_service - probe driver for given PCI Express port service
525 if (!dev || !dev->driver) in pcie_port_probe_service()
526 return -ENODEV; in pcie_port_probe_service()
528 driver = to_service_driver(dev->driver); in pcie_port_probe_service()
529 if (!driver || !driver->probe) in pcie_port_probe_service()
530 return -ENODEV; in pcie_port_probe_service()
533 status = driver->probe(pciedev); in pcie_port_probe_service()
542 * pcie_port_remove_service - detach driver from given PCI Express port service
555 if (!dev || !dev->driver) in pcie_port_remove_service()
559 driver = to_service_driver(dev->driver); in pcie_port_remove_service()
560 if (driver && driver->remove) { in pcie_port_remove_service()
561 driver->remove(pciedev); in pcie_port_remove_service()
568 * pcie_port_shutdown_service - shut down given PCI Express port service
579 * pcie_port_service_register - register PCI Express port service driver
585 return -ENODEV; in pcie_port_service_register()
587 new->driver.name = new->name; in pcie_port_service_register()
588 new->driver.bus = &pcie_port_bus_type; in pcie_port_service_register()
589 new->driver.probe = pcie_port_probe_service; in pcie_port_service_register()
590 new->driver.remove = pcie_port_remove_service; in pcie_port_service_register()
591 new->driver.shutdown = pcie_port_shutdown_service; in pcie_port_service_register()
593 return driver_register(&new->driver); in pcie_port_service_register()
597 * pcie_port_service_unregister - unregister PCI Express port service driver
602 driver_unregister(&drv->driver); in pcie_port_service_unregister()
616 * If the user specified "pcie_ports=dpc-native", use the Linux DPC PCIe
627 else if (!strncmp(str, "dpc-native", 10)) in pcie_port_setup()
639 if (!to_pci_dev(dev)->bridge_d3) in pcie_port_runtime_suspend()
640 return -EBUSY; in pcie_port_runtime_suspend()
652 return to_pci_dev(dev)->bridge_d3 ? 0 : -EBUSY; in pcie_port_runtime_idle()
677 * pcie_portdrv_probe - Probe PCI-Express port devices
678 * @dev: PCI-Express port device being probed
695 return -ENODEV; in pcie_portdrv_probe()
706 dev_pm_set_driver_flags(&dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE | in pcie_portdrv_probe()
715 pm_runtime_set_autosuspend_delay(&dev->dev, 100); in pcie_portdrv_probe()
716 pm_runtime_use_autosuspend(&dev->dev); in pcie_portdrv_probe()
717 pm_runtime_mark_last_busy(&dev->dev); in pcie_portdrv_probe()
718 pm_runtime_put_autosuspend(&dev->dev); in pcie_portdrv_probe()
719 pm_runtime_allow(&dev->dev); in pcie_portdrv_probe()
728 pm_runtime_forbid(&dev->dev); in pcie_portdrv_remove()
729 pm_runtime_get_noresume(&dev->dev); in pcie_portdrv_remove()
730 pm_runtime_dont_use_autosuspend(&dev->dev); in pcie_portdrv_remove()
741 pm_runtime_forbid(&dev->dev); in pcie_portdrv_shutdown()
742 pm_runtime_get_noresume(&dev->dev); in pcie_portdrv_shutdown()
743 pm_runtime_dont_use_autosuspend(&dev->dev); in pcie_portdrv_shutdown()
760 device_for_each_child(&dev->dev, &off, pcie_port_device_iter); in pcie_portdrv_slot_reset()
776 /* handle any PCI-Express port */
778 /* subtractive decode PCI-to-PCI bridge, class type is 060401h */
808 pr_notice("%s detected: will not use MSI for PCIe PME signaling\n", in dmi_pcie_pme_disable_msi()
809 d->ident); in dmi_pcie_pme_disable_msi()
816 * Boxes that should not use MSI for PCIe PME signaling.
820 .ident = "MSI Wind U-100",
823 "MICRO-STAR INTERNATIONAL CO., LTD"),
824 DMI_MATCH(DMI_PRODUCT_NAME, "U-100"),
842 return -EACCES; in pcie_portdrv_init()