• Home
  • Raw
  • Download

Lines Matching +full:device +full:- +full:handle

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * pci_root.c - ACPI PCI Root Bridge Driver ($Revision: 40 $)
17 #include <linux/pci-acpi.h>
27 static int acpi_pci_root_add(struct acpi_device *device,
29 static void acpi_pci_root_remove(struct acpi_device *device);
60 * acpi_is_root_bridge - determine whether an ACPI CA node is a PCI root bridge
61 * @handle: the ACPI CA node in question.
66 int acpi_is_root_bridge(acpi_handle handle) in acpi_is_root_bridge() argument
69 struct acpi_device *device; in acpi_is_root_bridge() local
71 ret = acpi_bus_get_device(handle, &device); in acpi_is_root_bridge()
75 ret = acpi_match_device_ids(device, root_device_ids); in acpi_is_root_bridge()
96 res->start = address.address.minimum; in get_root_bridge_busnr_callback()
97 res->end = address.address.minimum + address.address.address_length - 1; in get_root_bridge_busnr_callback()
103 static acpi_status try_get_root_bridge_busnr(acpi_handle handle, in try_get_root_bridge_busnr() argument
108 res->start = -1; in try_get_root_bridge_busnr()
110 acpi_walk_resources(handle, METHOD_NAME__CRS, in try_get_root_bridge_busnr()
114 if (res->start == -1) in try_get_root_bridge_busnr()
131 { OSC_PCI_HPX_TYPE_3_SUPPORT, "HPX-Type3" },
153 if (word & entry->bit) in decode_osc_bits()
154 len += scnprintf(buf + len, sizeof(buf) - len, "%s%s", in decode_osc_bits()
155 len ? " " : "", entry->desc); in decode_osc_bits()
157 dev_info(&root->device->dev, "_OSC: %s [%s]\n", msg, buf); in decode_osc_bits()
172 static u8 pci_osc_uuid_str[] = "33DB4D5B-1FF7-401C-9657-7441C03DD766";
174 static acpi_status acpi_pci_run_osc(acpi_handle handle, in acpi_pci_run_osc() argument
185 status = acpi_run_osc(handle, &context); in acpi_pci_run_osc()
201 support |= root->osc_support_set; in acpi_pci_query_osc()
207 capbuf[OSC_CONTROL_DWORD] = *control | root->osc_control_set; in acpi_pci_query_osc()
210 capbuf[OSC_CONTROL_DWORD] = root->osc_control_set; in acpi_pci_query_osc()
213 status = acpi_pci_run_osc(root->device->handle, capbuf, &result); in acpi_pci_query_osc()
215 root->osc_support_set = support; in acpi_pci_query_osc()
232 struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle) in acpi_pci_find_root() argument
235 struct acpi_device *device; in acpi_pci_find_root() local
237 if (acpi_bus_get_device(handle, &device) || in acpi_pci_find_root()
238 acpi_match_device_ids(device, root_device_ids)) in acpi_pci_find_root()
241 root = acpi_driver_data(device); in acpi_pci_find_root()
249 acpi_handle handle; member
253 * acpi_get_pci_dev - convert ACPI CA handle to struct pci_dev
254 * @handle: the handle in question
256 * Given an ACPI CA handle, the desired PCI device is located in the
259 * If the device is found, its reference count is increased and this
262 * If no device is found, %NULL is returned.
264 struct pci_dev *acpi_get_pci_dev(acpi_handle handle) in acpi_get_pci_dev() argument
279 phandle = handle; in acpi_get_pci_dev()
285 INIT_LIST_HEAD(&node->node); in acpi_get_pci_dev()
286 node->handle = phandle; in acpi_get_pci_dev()
287 list_add(&node->node, &device_list); in acpi_get_pci_dev()
298 pbus = root->bus; in acpi_get_pci_dev()
301 * Now, walk back down the PCI device tree until we return to our in acpi_get_pci_dev()
302 * original handle. Assumes that everything between the PCI root in acpi_get_pci_dev()
303 * bridge and the device we're looking for must be a P2P bridge. in acpi_get_pci_dev()
306 acpi_handle hnd = node->handle; in acpi_get_pci_dev()
314 if (!pdev || hnd == handle) in acpi_get_pci_dev()
317 pbus = pdev->subordinate; in acpi_get_pci_dev()
321 * This function may be called for a non-PCI device that has a in acpi_get_pci_dev()
323 * case pdev->subordinate will be NULL for the parent. in acpi_get_pci_dev()
326 dev_dbg(&pdev->dev, "Not a PCI-to-PCI bridge\n"); in acpi_get_pci_dev()
340 * acpi_pci_osc_control_set - Request control of PCI root _OSC features.
341 * @handle: ACPI handle of a PCI root bridge (or PCIe Root Complex).
354 acpi_status acpi_pci_osc_control_set(acpi_handle handle, u32 *mask, u32 req) in acpi_pci_osc_control_set() argument
367 root = acpi_pci_find_root(handle); in acpi_pci_osc_control_set()
373 *mask = ctrl | root->osc_control_set; in acpi_pci_osc_control_set()
375 if ((root->osc_control_set & ctrl) == ctrl) in acpi_pci_osc_control_set()
380 status = acpi_pci_query_osc(root, root->osc_support_set, mask); in acpi_pci_osc_control_set()
398 capbuf[OSC_SUPPORT_DWORD] = root->osc_support_set; in acpi_pci_osc_control_set()
400 status = acpi_pci_run_osc(handle, capbuf, mask); in acpi_pci_osc_control_set()
402 root->osc_control_set = *mask; in acpi_pci_osc_control_set()
414 struct acpi_device *device = root->device; in negotiate_os_control() local
415 acpi_handle handle = device->handle; in negotiate_os_control() local
423 root->osc_control_set = ~OSC_PCI_EXPRESS_PME_CONTROL; in negotiate_os_control()
425 root->osc_control_set); in negotiate_os_control()
453 dev_info(&device->dev, "_OSC failed (%s)%s\n", in negotiate_os_control()
460 dev_info(&device->dev, "PCIe port services disabled; not requesting _OSC control\n"); in negotiate_os_control()
487 * the PCI Firmware Spec, r3.2, sec 4.5.1, table 4-5, in negotiate_os_control()
495 status = acpi_pci_osc_control_set(handle, &control, in negotiate_os_control()
505 dev_info(&device->dev, "FADT indicates ASPM is unsupported, using BIOS configuration\n"); in negotiate_os_control()
511 dev_info(&device->dev, "_OSC failed (%s); disabling ASPM\n", in negotiate_os_control()
517 * properly handle PCIe 1.1 devices. So we set this in negotiate_os_control()
525 static int acpi_pci_root_add(struct acpi_device *device, in acpi_pci_root_add() argument
532 acpi_handle handle = device->handle; in acpi_pci_root_add() local
539 return -ENOMEM; in acpi_pci_root_add()
542 status = acpi_evaluate_integer(handle, METHOD_NAME__SEG, NULL, in acpi_pci_root_add()
545 dev_err(&device->dev, "can't evaluate _SEG\n"); in acpi_pci_root_add()
546 result = -ENODEV; in acpi_pci_root_add()
551 root->secondary.flags = IORESOURCE_BUS; in acpi_pci_root_add()
552 status = try_get_root_bridge_busnr(handle, &root->secondary); in acpi_pci_root_add()
558 * can do is assume [_BBN-0xFF] or [0-0xFF]. in acpi_pci_root_add()
560 root->secondary.end = 0xFF; in acpi_pci_root_add()
561 dev_warn(&device->dev, in acpi_pci_root_add()
563 status = acpi_evaluate_integer(handle, METHOD_NAME__BBN, in acpi_pci_root_add()
566 root->secondary.start = bus; in acpi_pci_root_add()
568 root->secondary.start = 0; in acpi_pci_root_add()
570 dev_err(&device->dev, "can't evaluate _BBN\n"); in acpi_pci_root_add()
571 result = -ENODEV; in acpi_pci_root_add()
576 root->device = device; in acpi_pci_root_add()
577 root->segment = segment & 0xFFFF; in acpi_pci_root_add()
578 strcpy(acpi_device_name(device), ACPI_PCI_ROOT_DEVICE_NAME); in acpi_pci_root_add()
579 strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS); in acpi_pci_root_add()
580 device->driver_data = root; in acpi_pci_root_add()
582 if (hotadd && dmar_device_add(handle)) { in acpi_pci_root_add()
583 result = -ENXIO; in acpi_pci_root_add()
588 acpi_device_name(device), acpi_device_bid(device), in acpi_pci_root_add()
589 root->segment, &root->secondary); in acpi_pci_root_add()
591 root->mcfg_addr = acpi_pci_root_get_mcfg_addr(handle); in acpi_pci_root_add()
593 is_pcie = strcmp(acpi_device_hid(device), "PNP0A08") == 0; in acpi_pci_root_add()
602 * -------------------- in acpi_pci_root_add()
603 * Must do this prior to any attempt to bind the root device, as the in acpi_pci_root_add()
607 root->bus = pci_acpi_scan_root(root); in acpi_pci_root_add()
608 if (!root->bus) { in acpi_pci_root_add()
609 dev_err(&device->dev, in acpi_pci_root_add()
611 root->segment, (unsigned int)root->secondary.start); in acpi_pci_root_add()
612 device->driver_data = NULL; in acpi_pci_root_add()
613 result = -ENODEV; in acpi_pci_root_add()
620 pci_acpi_add_bus_pm_notifier(device); in acpi_pci_root_add()
621 device_set_wakeup_capable(root->bus->bridge, device->wakeup.flags.valid); in acpi_pci_root_add()
624 pcibios_resource_survey_bus(root->bus); in acpi_pci_root_add()
625 pci_assign_unassigned_root_bus_resources(root->bus); in acpi_pci_root_add()
627 * This is only called for the hotadd case. For the boot-time in acpi_pci_root_add()
631 * This is currently x86-specific, because acpi_ioapic_add() in acpi_pci_root_add()
636 acpi_ioapic_add(root->device->handle); in acpi_pci_root_add()
640 pci_bus_add_devices(root->bus); in acpi_pci_root_add()
646 dmar_device_remove(handle); in acpi_pci_root_add()
652 static void acpi_pci_root_remove(struct acpi_device *device) in acpi_pci_root_remove() argument
654 struct acpi_pci_root *root = acpi_driver_data(device); in acpi_pci_root_remove()
658 pci_stop_root_bus(root->bus); in acpi_pci_root_remove()
661 device_set_wakeup_capable(root->bus->bridge, false); in acpi_pci_root_remove()
662 pci_acpi_remove_bus_pm_notifier(device); in acpi_pci_root_remove()
664 pci_remove_root_bus(root->bus); in acpi_pci_root_remove()
667 dmar_device_remove(device->handle); in acpi_pci_root_remove()
679 static void acpi_pci_root_validate_resources(struct device *dev, in acpi_pci_root_validate_resources()
695 res1 = entry->res; in acpi_pci_root_validate_resources()
696 if (!(res1->flags & type)) in acpi_pci_root_validate_resources()
699 /* Exclude non-addressable range or non-addressable portion */ in acpi_pci_root_validate_resources()
700 end = min(res1->end, root->end); in acpi_pci_root_validate_resources()
701 if (end <= res1->start) { in acpi_pci_root_validate_resources()
706 } else if (res1->end != end) { in acpi_pci_root_validate_resources()
707 dev_info(dev, "host bridge window %pR ([%#llx-%#llx] ignored, not CPU addressable)\n", in acpi_pci_root_validate_resources()
709 (unsigned long long)res1->end); in acpi_pci_root_validate_resources()
710 res1->end = end; in acpi_pci_root_validate_resources()
714 res2 = entry2->res; in acpi_pci_root_validate_resources()
715 if (!(res2->flags & type)) in acpi_pci_root_validate_resources()
724 res2->start = min(res1->start, res2->start); in acpi_pci_root_validate_resources()
725 res2->end = max(res1->end, res2->end); in acpi_pci_root_validate_resources()
746 struct resource *res = entry->res; in acpi_pci_root_remap_iospace()
747 resource_size_t cpu_addr = res->start; in acpi_pci_root_remap_iospace()
748 resource_size_t pci_addr = cpu_addr - entry->offset; in acpi_pci_root_remap_iospace()
756 if (port == (unsigned long)-1) in acpi_pci_root_remap_iospace()
759 res->start = port; in acpi_pci_root_remap_iospace()
760 res->end = port + length - 1; in acpi_pci_root_remap_iospace()
761 entry->offset = port - pci_addr; in acpi_pci_root_remap_iospace()
769 res->flags |= IORESOURCE_DISABLED; in acpi_pci_root_remap_iospace()
776 struct list_head *list = &info->resources; in acpi_pci_probe_root_resources()
777 struct acpi_device *device = info->bridge; in acpi_pci_probe_root_resources() local
782 ret = acpi_dev_get_resources(device, list, in acpi_pci_probe_root_resources()
786 dev_warn(&device->dev, in acpi_pci_probe_root_resources()
789 dev_dbg(&device->dev, in acpi_pci_probe_root_resources()
793 if (entry->res->flags & IORESOURCE_IO) in acpi_pci_probe_root_resources()
794 acpi_pci_root_remap_iospace(&device->fwnode, in acpi_pci_probe_root_resources()
797 if (entry->res->flags & IORESOURCE_DISABLED) in acpi_pci_probe_root_resources()
800 entry->res->name = info->name; in acpi_pci_probe_root_resources()
802 acpi_pci_root_validate_resources(&device->dev, list, in acpi_pci_probe_root_resources()
804 acpi_pci_root_validate_resources(&device->dev, list, in acpi_pci_probe_root_resources()
816 resource_list_for_each_entry_safe(entry, tmp, &info->resources) { in pci_acpi_root_add_resources()
817 res = entry->res; in pci_acpi_root_add_resources()
818 if (res->flags & IORESOURCE_MEM) in pci_acpi_root_add_resources()
820 else if (res->flags & IORESOURCE_IO) in pci_acpi_root_add_resources()
834 dev_info(&info->bridge->dev, in pci_acpi_root_add_resources()
836 res, conflict->name, conflict); in pci_acpi_root_add_resources()
850 resource_list_for_each_entry_safe(entry, tmp, &info->resources) { in __acpi_pci_root_release_info()
851 res = entry->res; in __acpi_pci_root_release_info()
852 if (res->parent && in __acpi_pci_root_release_info()
853 (res->flags & (IORESOURCE_MEM | IORESOURCE_IO))) in __acpi_pci_root_release_info()
858 info->ops->release_info(info); in __acpi_pci_root_release_info()
866 resource_list_for_each_entry(entry, &bridge->windows) { in acpi_pci_root_release_info()
867 res = entry->res; in acpi_pci_root_release_info()
868 if (res->flags & IORESOURCE_IO) in acpi_pci_root_release_info()
870 if (res->parent && in acpi_pci_root_release_info()
871 (res->flags & (IORESOURCE_MEM | IORESOURCE_IO))) in acpi_pci_root_release_info()
874 __acpi_pci_root_release_info(bridge->release_data); in acpi_pci_root_release_info()
882 int ret, busnum = root->secondary.start; in acpi_pci_root_create()
883 struct acpi_device *device = root->device; in acpi_pci_root_create() local
884 int node = acpi_get_node(device->handle); in acpi_pci_root_create()
889 info->root = root; in acpi_pci_root_create()
890 info->bridge = device; in acpi_pci_root_create()
891 info->ops = ops; in acpi_pci_root_create()
892 INIT_LIST_HEAD(&info->resources); in acpi_pci_root_create()
893 snprintf(info->name, sizeof(info->name), "PCI Bus %04x:%02x", in acpi_pci_root_create()
894 root->segment, busnum); in acpi_pci_root_create()
896 if (ops->init_info && ops->init_info(info)) in acpi_pci_root_create()
898 if (ops->prepare_resources) in acpi_pci_root_create()
899 ret = ops->prepare_resources(info); in acpi_pci_root_create()
906 pci_add_resource(&info->resources, &root->secondary); in acpi_pci_root_create()
907 bus = pci_create_root_bus(NULL, busnum, ops->pci_ops, in acpi_pci_root_create()
908 sysdata, &info->resources); in acpi_pci_root_create()
912 host_bridge = to_pci_host_bridge(bus->bridge); in acpi_pci_root_create()
913 if (!(root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL)) in acpi_pci_root_create()
914 host_bridge->native_pcie_hotplug = 0; in acpi_pci_root_create()
915 if (!(root->osc_control_set & OSC_PCI_SHPC_NATIVE_HP_CONTROL)) in acpi_pci_root_create()
916 host_bridge->native_shpc_hotplug = 0; in acpi_pci_root_create()
917 if (!(root->osc_control_set & OSC_PCI_EXPRESS_AER_CONTROL)) in acpi_pci_root_create()
918 host_bridge->native_aer = 0; in acpi_pci_root_create()
919 if (!(root->osc_control_set & OSC_PCI_EXPRESS_PME_CONTROL)) in acpi_pci_root_create()
920 host_bridge->native_pme = 0; in acpi_pci_root_create()
921 if (!(root->osc_control_set & OSC_PCI_EXPRESS_LTR_CONTROL)) in acpi_pci_root_create()
922 host_bridge->native_ltr = 0; in acpi_pci_root_create()
923 if (!(root->osc_control_set & OSC_PCI_EXPRESS_DPC_CONTROL)) in acpi_pci_root_create()
924 host_bridge->native_dpc = 0; in acpi_pci_root_create()
931 obj = acpi_evaluate_dsm(ACPI_HANDLE(bus->bridge), &pci_acpi_dsm_guid, 1, in acpi_pci_root_create()
933 if (obj && obj->type == ACPI_TYPE_INTEGER && obj->integer.value == 0) in acpi_pci_root_create()
934 host_bridge->preserve_config = 1; in acpi_pci_root_create()
941 dev_printk(KERN_DEBUG, &bus->dev, "on NUMA node %d\n", node); in acpi_pci_root_create()