Lines Matching +full:root +full:- +full:node

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * pci_root.c - ACPI PCI Root Bridge Driver ($Revision: 40 $)
19 #include <linux/pci-acpi.h>
30 #define ACPI_PCI_ROOT_DEVICE_NAME "PCI Root Bridge"
62 * acpi_is_root_bridge - determine whether an ACPI CA node is a PCI root bridge
63 * @handle: the ACPI CA node in question.
98 res->start = address.address.minimum; in get_root_bridge_busnr_callback()
99 res->end = address.address.minimum + address.address.address_length - 1; in get_root_bridge_busnr_callback()
110 res->start = -1; in try_get_root_bridge_busnr()
116 if (res->start == -1) in try_get_root_bridge_busnr()
133 { OSC_PCI_HPX_TYPE_3_SUPPORT, "HPX-Type3" },
146 static void decode_osc_bits(struct acpi_pci_root *root, char *msg, u32 word, in decode_osc_bits() argument
155 if (word & entry->bit) in decode_osc_bits()
156 len += scnprintf(buf + len, sizeof(buf) - len, "%s%s", in decode_osc_bits()
157 len ? " " : "", entry->desc); in decode_osc_bits()
159 dev_info(&root->device->dev, "_OSC: %s [%s]\n", msg, buf); in decode_osc_bits()
162 static void decode_osc_support(struct acpi_pci_root *root, char *msg, u32 word) in decode_osc_support() argument
164 decode_osc_bits(root, msg, word, pci_osc_support_bit, in decode_osc_support()
168 static void decode_osc_control(struct acpi_pci_root *root, char *msg, u32 word) in decode_osc_control() argument
170 decode_osc_bits(root, msg, word, pci_osc_control_bit, in decode_osc_control()
174 static u8 pci_osc_uuid_str[] = "33DB4D5B-1FF7-401C-9657-7441C03DD766";
195 static acpi_status acpi_pci_query_osc(struct acpi_pci_root *root, in acpi_pci_query_osc() argument
203 support |= root->osc_support_set; in acpi_pci_query_osc()
209 capbuf[OSC_CONTROL_DWORD] = *control | root->osc_control_set; in acpi_pci_query_osc()
212 capbuf[OSC_CONTROL_DWORD] = root->osc_control_set; in acpi_pci_query_osc()
215 status = acpi_pci_run_osc(root->device->handle, capbuf, &result); in acpi_pci_query_osc()
217 root->osc_support_set = support; in acpi_pci_query_osc()
224 static acpi_status acpi_pci_osc_support(struct acpi_pci_root *root, u32 flags) in acpi_pci_osc_support() argument
226 return acpi_pci_query_osc(root, flags, NULL); in acpi_pci_osc_support()
231 struct acpi_pci_root *root; in acpi_pci_find_root() local
238 root = acpi_driver_data(device); in acpi_pci_find_root()
240 return root; in acpi_pci_find_root()
245 struct list_head node; member
250 * acpi_get_pci_dev - convert ACPI CA handle to struct pci_dev
269 struct acpi_handle_node *node, *tmp; in acpi_get_pci_dev() local
270 struct acpi_pci_root *root; in acpi_get_pci_dev() local
274 * Walk up the ACPI CA namespace until we reach a PCI root bridge. in acpi_get_pci_dev()
278 node = kzalloc(sizeof(struct acpi_handle_node), GFP_KERNEL); in acpi_get_pci_dev()
279 if (!node) in acpi_get_pci_dev()
282 INIT_LIST_HEAD(&node->node); in acpi_get_pci_dev()
283 node->handle = phandle; in acpi_get_pci_dev()
284 list_add(&node->node, &device_list); in acpi_get_pci_dev()
291 root = acpi_pci_find_root(phandle); in acpi_get_pci_dev()
292 if (!root) in acpi_get_pci_dev()
295 pbus = root->bus; in acpi_get_pci_dev()
299 * original handle. Assumes that everything between the PCI root in acpi_get_pci_dev()
302 list_for_each_entry(node, &device_list, node) { in acpi_get_pci_dev()
303 acpi_handle hnd = node->handle; in acpi_get_pci_dev()
314 pbus = pdev->subordinate; in acpi_get_pci_dev()
318 * This function may be called for a non-PCI device that has a in acpi_get_pci_dev()
320 * case pdev->subordinate will be NULL for the parent. in acpi_get_pci_dev()
323 dev_dbg(&pdev->dev, "Not a PCI-to-PCI bridge\n"); in acpi_get_pci_dev()
329 list_for_each_entry_safe(node, tmp, &device_list, node) in acpi_get_pci_dev()
330 kfree(node); in acpi_get_pci_dev()
337 * acpi_pci_osc_control_set - Request control of PCI root _OSC features.
338 * @handle: ACPI handle of a PCI root bridge (or PCIe Root Complex).
353 struct acpi_pci_root *root; in acpi_pci_osc_control_set() local
364 root = acpi_pci_find_root(handle); in acpi_pci_osc_control_set()
365 if (!root) in acpi_pci_osc_control_set()
368 *mask = ctrl | root->osc_control_set; in acpi_pci_osc_control_set()
370 if ((root->osc_control_set & ctrl) == ctrl) in acpi_pci_osc_control_set()
375 status = acpi_pci_query_osc(root, root->osc_support_set, mask); in acpi_pci_osc_control_set()
380 decode_osc_control(root, "platform does not support", in acpi_pci_osc_control_set()
386 decode_osc_control(root, "not requesting control; platform does not support", in acpi_pci_osc_control_set()
392 capbuf[OSC_SUPPORT_DWORD] = root->osc_support_set; in acpi_pci_osc_control_set()
398 root->osc_control_set = *mask; in acpi_pci_osc_control_set()
402 static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm, in negotiate_os_control() argument
407 struct acpi_device *device = root->device; in negotiate_os_control()
408 acpi_handle handle = device->handle; in negotiate_os_control()
416 root->osc_control_set = ~OSC_PCI_EXPRESS_PME_CONTROL; in negotiate_os_control()
417 decode_osc_control(root, "OS assumes control of", in negotiate_os_control()
418 root->osc_control_set); in negotiate_os_control()
437 decode_osc_support(root, "OS supports", support); in negotiate_os_control()
438 status = acpi_pci_osc_support(root, support); in negotiate_os_control()
446 dev_info(&device->dev, "_OSC: platform retains control of PCIe features (%s)\n", in negotiate_os_control()
452 dev_info(&device->dev, "PCIe port services disabled; not requesting _OSC control\n"); in negotiate_os_control()
457 decode_osc_support(root, "not requesting OS control; OS requires", in negotiate_os_control()
479 * the PCI Firmware Spec, r3.2, sec 4.5.1, table 4-5, in negotiate_os_control()
490 decode_osc_control(root, "OS now controls", control); in negotiate_os_control()
497 dev_info(&device->dev, "FADT indicates ASPM is unsupported, using BIOS configuration\n"); in negotiate_os_control()
501 decode_osc_control(root, "OS requested", requested); in negotiate_os_control()
502 decode_osc_control(root, "platform willing to grant", control); in negotiate_os_control()
503 dev_info(&device->dev, "_OSC: platform retains control of PCIe features (%s)\n", in negotiate_os_control()
511 * root scan. in negotiate_os_control()
523 struct acpi_pci_root *root; in acpi_pci_root_add() local
524 acpi_handle handle = device->handle; in acpi_pci_root_add()
529 root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL); in acpi_pci_root_add()
530 if (!root) in acpi_pci_root_add()
531 return -ENOMEM; in acpi_pci_root_add()
537 dev_err(&device->dev, "can't evaluate _SEG\n"); in acpi_pci_root_add()
538 result = -ENODEV; in acpi_pci_root_add()
543 root->secondary.flags = IORESOURCE_BUS; in acpi_pci_root_add()
544 status = try_get_root_bridge_busnr(handle, &root->secondary); in acpi_pci_root_add()
550 * can do is assume [_BBN-0xFF] or [0-0xFF]. in acpi_pci_root_add()
552 root->secondary.end = 0xFF; in acpi_pci_root_add()
553 dev_warn(&device->dev, in acpi_pci_root_add()
558 root->secondary.start = bus; in acpi_pci_root_add()
560 root->secondary.start = 0; in acpi_pci_root_add()
562 dev_err(&device->dev, "can't evaluate _BBN\n"); in acpi_pci_root_add()
563 result = -ENODEV; in acpi_pci_root_add()
568 root->device = device; in acpi_pci_root_add()
569 root->segment = segment & 0xFFFF; in acpi_pci_root_add()
572 device->driver_data = root; in acpi_pci_root_add()
575 result = -ENXIO; in acpi_pci_root_add()
581 root->segment, &root->secondary); in acpi_pci_root_add()
583 root->mcfg_addr = acpi_pci_root_get_mcfg_addr(handle); in acpi_pci_root_add()
586 negotiate_os_control(root, &no_aspm, is_pcie); in acpi_pci_root_add()
593 * Scan the Root Bridge in acpi_pci_root_add()
594 * -------------------- in acpi_pci_root_add()
595 * Must do this prior to any attempt to bind the root device, as the in acpi_pci_root_add()
597 * thus the root bridge's pci_dev does not exist). in acpi_pci_root_add()
599 root->bus = pci_acpi_scan_root(root); in acpi_pci_root_add()
600 if (!root->bus) { in acpi_pci_root_add()
601 dev_err(&device->dev, in acpi_pci_root_add()
603 root->segment, (unsigned int)root->secondary.start); in acpi_pci_root_add()
604 device->driver_data = NULL; in acpi_pci_root_add()
605 result = -ENODEV; in acpi_pci_root_add()
613 device_set_wakeup_capable(root->bus->bridge, device->wakeup.flags.valid); in acpi_pci_root_add()
616 pcibios_resource_survey_bus(root->bus); in acpi_pci_root_add()
617 pci_assign_unassigned_root_bus_resources(root->bus); in acpi_pci_root_add()
619 * This is only called for the hotadd case. For the boot-time in acpi_pci_root_add()
623 * This is currently x86-specific, because acpi_ioapic_add() in acpi_pci_root_add()
628 acpi_ioapic_add(root->device->handle); in acpi_pci_root_add()
632 pci_bus_add_devices(root->bus); in acpi_pci_root_add()
640 kfree(root); in acpi_pci_root_add()
646 struct acpi_pci_root *root = acpi_driver_data(device); in acpi_pci_root_remove() local
650 pci_stop_root_bus(root->bus); in acpi_pci_root_remove()
652 pci_ioapic_remove(root); in acpi_pci_root_remove()
653 device_set_wakeup_capable(root->bus->bridge, false); in acpi_pci_root_remove()
656 pci_remove_root_bus(root->bus); in acpi_pci_root_remove()
657 WARN_ON(acpi_ioapic_remove(root)); in acpi_pci_root_remove()
659 dmar_device_remove(device->handle); in acpi_pci_root_remove()
663 kfree(root); in acpi_pci_root_remove()
676 struct resource *res1, *res2, *root = NULL; in acpi_pci_root_validate_resources() local
680 root = (type & IORESOURCE_MEM) ? &iomem_resource : &ioport_resource; in acpi_pci_root_validate_resources()
687 res1 = entry->res; in acpi_pci_root_validate_resources()
688 if (!(res1->flags & type)) in acpi_pci_root_validate_resources()
691 /* Exclude non-addressable range or non-addressable portion */ in acpi_pci_root_validate_resources()
692 end = min(res1->end, root->end); in acpi_pci_root_validate_resources()
693 if (end <= res1->start) { in acpi_pci_root_validate_resources()
698 } else if (res1->end != end) { in acpi_pci_root_validate_resources()
699 dev_info(dev, "host bridge window %pR ([%#llx-%#llx] ignored, not CPU addressable)\n", in acpi_pci_root_validate_resources()
701 (unsigned long long)res1->end); in acpi_pci_root_validate_resources()
702 res1->end = end; in acpi_pci_root_validate_resources()
706 res2 = entry2->res; in acpi_pci_root_validate_resources()
707 if (!(res2->flags & type)) in acpi_pci_root_validate_resources()
736 struct resource *res = entry->res; in acpi_pci_root_remap_iospace()
737 resource_size_t cpu_addr = res->start; in acpi_pci_root_remap_iospace()
738 resource_size_t pci_addr = cpu_addr - entry->offset; in acpi_pci_root_remap_iospace()
746 if (port == (unsigned long)-1) in acpi_pci_root_remap_iospace()
749 res->start = port; in acpi_pci_root_remap_iospace()
750 res->end = port + length - 1; in acpi_pci_root_remap_iospace()
751 entry->offset = port - pci_addr; in acpi_pci_root_remap_iospace()
759 res->flags |= IORESOURCE_DISABLED; in acpi_pci_root_remap_iospace()
766 struct list_head *list = &info->resources; in acpi_pci_probe_root_resources()
767 struct acpi_device *device = info->bridge; in acpi_pci_probe_root_resources()
776 dev_warn(&device->dev, in acpi_pci_probe_root_resources()
779 dev_dbg(&device->dev, in acpi_pci_probe_root_resources()
783 if (entry->res->flags & IORESOURCE_IO) in acpi_pci_probe_root_resources()
784 acpi_pci_root_remap_iospace(&device->fwnode, in acpi_pci_probe_root_resources()
787 if (entry->res->flags & IORESOURCE_DISABLED) in acpi_pci_probe_root_resources()
790 entry->res->name = info->name; in acpi_pci_probe_root_resources()
792 acpi_pci_root_validate_resources(&device->dev, list, in acpi_pci_probe_root_resources()
794 acpi_pci_root_validate_resources(&device->dev, list, in acpi_pci_probe_root_resources()
804 struct resource *res, *conflict, *root = NULL; in pci_acpi_root_add_resources() local
806 resource_list_for_each_entry_safe(entry, tmp, &info->resources) { in pci_acpi_root_add_resources()
807 res = entry->res; in pci_acpi_root_add_resources()
808 if (res->flags & IORESOURCE_MEM) in pci_acpi_root_add_resources()
809 root = &iomem_resource; in pci_acpi_root_add_resources()
810 else if (res->flags & IORESOURCE_IO) in pci_acpi_root_add_resources()
811 root = &ioport_resource; in pci_acpi_root_add_resources()
819 if (res == root) in pci_acpi_root_add_resources()
822 conflict = insert_resource_conflict(root, res); in pci_acpi_root_add_resources()
824 dev_info(&info->bridge->dev, in pci_acpi_root_add_resources()
826 res, conflict->name, conflict); in pci_acpi_root_add_resources()
840 resource_list_for_each_entry_safe(entry, tmp, &info->resources) { in __acpi_pci_root_release_info()
841 res = entry->res; in __acpi_pci_root_release_info()
842 if (res->parent && in __acpi_pci_root_release_info()
843 (res->flags & (IORESOURCE_MEM | IORESOURCE_IO))) in __acpi_pci_root_release_info()
848 info->ops->release_info(info); in __acpi_pci_root_release_info()
856 resource_list_for_each_entry(entry, &bridge->windows) { in acpi_pci_root_release_info()
857 res = entry->res; in acpi_pci_root_release_info()
858 if (res->flags & IORESOURCE_IO) in acpi_pci_root_release_info()
860 if (res->parent && in acpi_pci_root_release_info()
861 (res->flags & (IORESOURCE_MEM | IORESOURCE_IO))) in acpi_pci_root_release_info()
864 __acpi_pci_root_release_info(bridge->release_data); in acpi_pci_root_release_info()
867 struct pci_bus *acpi_pci_root_create(struct acpi_pci_root *root, in acpi_pci_root_create() argument
872 int ret, busnum = root->secondary.start; in acpi_pci_root_create()
873 struct acpi_device *device = root->device; in acpi_pci_root_create()
874 int node = acpi_get_node(device->handle); in acpi_pci_root_create() local
879 info->root = root; in acpi_pci_root_create()
880 info->bridge = device; in acpi_pci_root_create()
881 info->ops = ops; in acpi_pci_root_create()
882 INIT_LIST_HEAD(&info->resources); in acpi_pci_root_create()
883 snprintf(info->name, sizeof(info->name), "PCI Bus %04x:%02x", in acpi_pci_root_create()
884 root->segment, busnum); in acpi_pci_root_create()
886 if (ops->init_info && ops->init_info(info)) in acpi_pci_root_create()
888 if (ops->prepare_resources) in acpi_pci_root_create()
889 ret = ops->prepare_resources(info); in acpi_pci_root_create()
896 pci_add_resource(&info->resources, &root->secondary); in acpi_pci_root_create()
897 bus = pci_create_root_bus(NULL, busnum, ops->pci_ops, in acpi_pci_root_create()
898 sysdata, &info->resources); in acpi_pci_root_create()
902 host_bridge = to_pci_host_bridge(bus->bridge); in acpi_pci_root_create()
903 if (!(root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL)) in acpi_pci_root_create()
904 host_bridge->native_pcie_hotplug = 0; in acpi_pci_root_create()
905 if (!(root->osc_control_set & OSC_PCI_SHPC_NATIVE_HP_CONTROL)) in acpi_pci_root_create()
906 host_bridge->native_shpc_hotplug = 0; in acpi_pci_root_create()
907 if (!(root->osc_control_set & OSC_PCI_EXPRESS_AER_CONTROL)) in acpi_pci_root_create()
908 host_bridge->native_aer = 0; in acpi_pci_root_create()
909 if (!(root->osc_control_set & OSC_PCI_EXPRESS_PME_CONTROL)) in acpi_pci_root_create()
910 host_bridge->native_pme = 0; in acpi_pci_root_create()
911 if (!(root->osc_control_set & OSC_PCI_EXPRESS_LTR_CONTROL)) in acpi_pci_root_create()
912 host_bridge->native_ltr = 0; in acpi_pci_root_create()
913 if (!(root->osc_control_set & OSC_PCI_EXPRESS_DPC_CONTROL)) in acpi_pci_root_create()
914 host_bridge->native_dpc = 0; in acpi_pci_root_create()
921 obj = acpi_evaluate_dsm(ACPI_HANDLE(bus->bridge), &pci_acpi_dsm_guid, 1, in acpi_pci_root_create()
923 if (obj && obj->type == ACPI_TYPE_INTEGER && obj->integer.value == 0) in acpi_pci_root_create()
924 host_bridge->preserve_config = 1; in acpi_pci_root_create()
930 if (node != NUMA_NO_NODE) in acpi_pci_root_create()
931 dev_printk(KERN_DEBUG, &bus->dev, "on NUMA node %d\n", node); in acpi_pci_root_create()