Lines Matching +full:secondary +full:- +full:device
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>
29 static int acpi_pci_root_add(struct acpi_device *device,
31 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
68 struct acpi_device *device = acpi_fetch_acpi_dev(handle); in acpi_is_root_bridge() local
71 if (!device) in acpi_is_root_bridge()
74 ret = acpi_match_device_ids(device, root_device_ids); in acpi_is_root_bridge()
95 res->start = address.address.minimum; in get_root_bridge_busnr_callback()
96 res->end = address.address.minimum + address.address.address_length - 1; in get_root_bridge_busnr_callback()
107 res->start = -1; in try_get_root_bridge_busnr()
113 if (res->start == -1) in try_get_root_bridge_busnr()
130 { OSC_PCI_HPX_TYPE_3_SUPPORT, "HPX-Type3" },
163 if (word & entry->bit) in decode_osc_bits()
164 len += scnprintf(buf + len, sizeof(buf) - len, "%s%s", in decode_osc_bits()
165 len ? " " : "", entry->desc); in decode_osc_bits()
167 dev_info(&root->device->dev, "_OSC: %s [%s]\n", msg, buf); in decode_osc_bits()
196 return root->bridge_type == ACPI_BRIDGE_TYPE_PCIE; in is_pcie()
201 return root->bridge_type == ACPI_BRIDGE_TYPE_CXL; in is_cxl()
204 static u8 pci_osc_uuid_str[] = "33DB4D5B-1FF7-401C-9657-7441C03DD766";
205 static u8 cxl_osc_uuid_str[] = "68F2D50B-C469-4d8A-BD3D-941A103FD3FC";
233 status = acpi_run_osc(root->device->handle, &context); in acpi_pci_run_osc()
250 support |= root->osc_support_set; in acpi_pci_query_osc()
254 capbuf[OSC_CONTROL_DWORD] = *control | root->osc_control_set; in acpi_pci_query_osc()
257 cxl_support |= root->osc_ext_support_set; in acpi_pci_query_osc()
259 capbuf[OSC_EXT_CONTROL_DWORD] = *cxl_control | root->osc_ext_control_set; in acpi_pci_query_osc()
265 root->osc_support_set = support; in acpi_pci_query_osc()
268 root->osc_ext_support_set = cxl_support; in acpi_pci_query_osc()
276 root->bridge_type = ACPI_BRIDGE_TYPE_PCIE; in acpi_pci_query_osc()
284 struct acpi_device *device = acpi_fetch_acpi_dev(handle); in acpi_pci_find_root() local
287 if (!device || acpi_match_device_ids(device, root_device_ids)) in acpi_pci_find_root()
290 root = acpi_driver_data(device); in acpi_pci_find_root()
297 * acpi_get_pci_dev - convert ACPI CA handle to struct pci_dev
300 * Given an ACPI CA handle, the desired PCI device is located in the
303 * If the device is found, its reference count is increased and this
306 * If no device is found, %NULL is returned.
317 mutex_lock(&adev->physical_node_lock); in acpi_get_pci_dev()
319 list_for_each_entry(pn, &adev->physical_node_list, node) { in acpi_get_pci_dev()
320 if (dev_is_pci(pn->dev)) { in acpi_get_pci_dev()
321 get_device(pn->dev); in acpi_get_pci_dev()
322 pci_dev = to_pci_dev(pn->dev); in acpi_get_pci_dev()
327 mutex_unlock(&adev->physical_node_lock); in acpi_get_pci_dev()
334 * acpi_pci_osc_control_set - Request control of PCI root _OSC features.
367 *mask |= root->osc_control_set; in acpi_pci_osc_control_set()
371 *cxl_mask |= root->osc_ext_control_set; in acpi_pci_osc_control_set()
403 if ((root->osc_control_set & ctrl) == ctrl && in acpi_pci_osc_control_set()
404 (root->osc_ext_control_set & cxl_ctrl) == cxl_ctrl) in acpi_pci_osc_control_set()
414 capbuf[OSC_SUPPORT_DWORD] = root->osc_support_set; in acpi_pci_osc_control_set()
417 capbuf[OSC_EXT_SUPPORT_DWORD] = root->osc_ext_support_set; in acpi_pci_osc_control_set()
425 root->osc_control_set = *mask; in acpi_pci_osc_control_set()
426 root->osc_ext_control_set = *cxl_mask; in acpi_pci_osc_control_set()
461 * otherwise had some coordination for the driver of a PCI device
467 * device. So the question here is not whether hotplug is enabled, it's
472 * not support blocking hotplug, is to require the memory device to be
484 * [1]: https://lore.kernel.org/all/20201122014203.4706-1-ashok.raj@intel.com/
521 * the PCI Firmware Spec, r3.2, sec 4.5.1, table 4-5, in calculate_control()
543 struct acpi_device *device = root->device; in os_control_query_checks() local
546 dev_info(&device->dev, "PCIe port services disabled; not requesting _OSC control\n"); in os_control_query_checks()
564 struct acpi_device *device = root->device; in negotiate_os_control() local
565 acpi_handle handle = device->handle; in negotiate_os_control()
573 root->osc_control_set = ~OSC_PCI_EXPRESS_PME_CONTROL; in negotiate_os_control()
575 root->osc_control_set); in negotiate_os_control()
607 dev_info(&device->dev, "FADT indicates ASPM is unsupported, using BIOS configuration\n"); in negotiate_os_control()
634 dev_info(&device->dev, "_OSC: platform retains control of PCIe features (%s)\n", in negotiate_os_control()
639 static int acpi_pci_root_add(struct acpi_device *device, in acpi_pci_root_add() argument
646 acpi_handle handle = device->handle; in acpi_pci_root_add()
653 return -ENOMEM; in acpi_pci_root_add()
659 dev_err(&device->dev, "can't evaluate _SEG\n"); in acpi_pci_root_add()
660 result = -ENODEV; in acpi_pci_root_add()
665 root->secondary.flags = IORESOURCE_BUS; in acpi_pci_root_add()
666 status = try_get_root_bridge_busnr(handle, &root->secondary); in acpi_pci_root_add()
672 * can do is assume [_BBN-0xFF] or [0-0xFF]. in acpi_pci_root_add()
674 root->secondary.end = 0xFF; in acpi_pci_root_add()
675 dev_warn(&device->dev, in acpi_pci_root_add()
676 FW_BUG "no secondary bus range in _CRS\n"); in acpi_pci_root_add()
680 root->secondary.start = bus; in acpi_pci_root_add()
682 root->secondary.start = 0; in acpi_pci_root_add()
684 dev_err(&device->dev, "can't evaluate _BBN\n"); in acpi_pci_root_add()
685 result = -ENODEV; in acpi_pci_root_add()
690 root->device = device; in acpi_pci_root_add()
691 root->segment = segment & 0xFFFF; in acpi_pci_root_add()
692 strscpy(acpi_device_name(device), ACPI_PCI_ROOT_DEVICE_NAME); in acpi_pci_root_add()
693 strscpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS); in acpi_pci_root_add()
694 device->driver_data = root; in acpi_pci_root_add()
697 result = -ENXIO; in acpi_pci_root_add()
702 acpi_device_name(device), acpi_device_bid(device), in acpi_pci_root_add()
703 root->segment, &root->secondary); in acpi_pci_root_add()
705 root->mcfg_addr = acpi_pci_root_get_mcfg_addr(handle); in acpi_pci_root_add()
707 acpi_hid = acpi_device_hid(root->device); in acpi_pci_root_add()
709 root->bridge_type = ACPI_BRIDGE_TYPE_PCIE; in acpi_pci_root_add()
711 root->bridge_type = ACPI_BRIDGE_TYPE_CXL; in acpi_pci_root_add()
713 dev_dbg(&device->dev, "Assuming non-PCIe host bridge\n"); in acpi_pci_root_add()
723 * -------------------- in acpi_pci_root_add()
724 * Must do this prior to any attempt to bind the root device, as the in acpi_pci_root_add()
728 root->bus = pci_acpi_scan_root(root); in acpi_pci_root_add()
729 if (!root->bus) { in acpi_pci_root_add()
730 dev_err(&device->dev, in acpi_pci_root_add()
732 root->segment, (unsigned int)root->secondary.start); in acpi_pci_root_add()
733 device->driver_data = NULL; in acpi_pci_root_add()
734 result = -ENODEV; in acpi_pci_root_add()
741 pci_acpi_add_bus_pm_notifier(device); in acpi_pci_root_add()
742 device_set_wakeup_capable(root->bus->bridge, device->wakeup.flags.valid); in acpi_pci_root_add()
745 pcibios_resource_survey_bus(root->bus); in acpi_pci_root_add()
746 pci_assign_unassigned_root_bus_resources(root->bus); in acpi_pci_root_add()
748 * This is only called for the hotadd case. For the boot-time in acpi_pci_root_add()
752 * This is currently x86-specific, because acpi_ioapic_add() in acpi_pci_root_add()
757 acpi_ioapic_add(root->device->handle); in acpi_pci_root_add()
761 pci_bus_add_devices(root->bus); in acpi_pci_root_add()
773 static void acpi_pci_root_remove(struct acpi_device *device) in acpi_pci_root_remove() argument
775 struct acpi_pci_root *root = acpi_driver_data(device); in acpi_pci_root_remove()
779 pci_stop_root_bus(root->bus); in acpi_pci_root_remove()
782 device_set_wakeup_capable(root->bus->bridge, false); in acpi_pci_root_remove()
783 pci_acpi_remove_bus_pm_notifier(device); in acpi_pci_root_remove()
785 pci_remove_root_bus(root->bus); in acpi_pci_root_remove()
788 dmar_device_remove(device->handle); in acpi_pci_root_remove()
800 static void acpi_pci_root_validate_resources(struct device *dev, in acpi_pci_root_validate_resources()
816 res1 = entry->res; in acpi_pci_root_validate_resources()
817 if (!(res1->flags & type)) in acpi_pci_root_validate_resources()
820 /* Exclude non-addressable range or non-addressable portion */ in acpi_pci_root_validate_resources()
821 end = min(res1->end, root->end); in acpi_pci_root_validate_resources()
822 if (end <= res1->start) { in acpi_pci_root_validate_resources()
827 } else if (res1->end != end) { in acpi_pci_root_validate_resources()
828 dev_info(dev, "host bridge window %pR ([%#llx-%#llx] ignored, not CPU addressable)\n", in acpi_pci_root_validate_resources()
830 (unsigned long long)res1->end); in acpi_pci_root_validate_resources()
831 res1->end = end; in acpi_pci_root_validate_resources()
835 res2 = entry2->res; in acpi_pci_root_validate_resources()
836 if (!(res2->flags & type)) in acpi_pci_root_validate_resources()
865 struct resource *res = entry->res; in acpi_pci_root_remap_iospace()
866 resource_size_t cpu_addr = res->start; in acpi_pci_root_remap_iospace()
867 resource_size_t pci_addr = cpu_addr - entry->offset; in acpi_pci_root_remap_iospace()
875 if (port == (unsigned long)-1) in acpi_pci_root_remap_iospace()
878 res->start = port; in acpi_pci_root_remap_iospace()
879 res->end = port + length - 1; in acpi_pci_root_remap_iospace()
880 entry->offset = port - pci_addr; in acpi_pci_root_remap_iospace()
888 res->flags |= IORESOURCE_DISABLED; in acpi_pci_root_remap_iospace()
895 struct list_head *list = &info->resources; in acpi_pci_probe_root_resources()
896 struct acpi_device *device = info->bridge; in acpi_pci_probe_root_resources() local
901 ret = acpi_dev_get_resources(device, list, in acpi_pci_probe_root_resources()
905 dev_warn(&device->dev, in acpi_pci_probe_root_resources()
908 dev_dbg(&device->dev, in acpi_pci_probe_root_resources()
912 if (entry->res->flags & IORESOURCE_IO) in acpi_pci_probe_root_resources()
913 acpi_pci_root_remap_iospace(&device->fwnode, in acpi_pci_probe_root_resources()
916 if (entry->res->flags & IORESOURCE_DISABLED) in acpi_pci_probe_root_resources()
919 entry->res->name = info->name; in acpi_pci_probe_root_resources()
921 acpi_pci_root_validate_resources(&device->dev, list, in acpi_pci_probe_root_resources()
923 acpi_pci_root_validate_resources(&device->dev, list, in acpi_pci_probe_root_resources()
935 resource_list_for_each_entry_safe(entry, tmp, &info->resources) { in pci_acpi_root_add_resources()
936 res = entry->res; in pci_acpi_root_add_resources()
937 if (res->flags & IORESOURCE_MEM) in pci_acpi_root_add_resources()
939 else if (res->flags & IORESOURCE_IO) in pci_acpi_root_add_resources()
953 dev_info(&info->bridge->dev, in pci_acpi_root_add_resources()
955 res, conflict->name, conflict); in pci_acpi_root_add_resources()
969 resource_list_for_each_entry_safe(entry, tmp, &info->resources) { in __acpi_pci_root_release_info()
970 res = entry->res; in __acpi_pci_root_release_info()
971 if (res->parent && in __acpi_pci_root_release_info()
972 (res->flags & (IORESOURCE_MEM | IORESOURCE_IO))) in __acpi_pci_root_release_info()
977 info->ops->release_info(info); in __acpi_pci_root_release_info()
985 resource_list_for_each_entry(entry, &bridge->windows) { in acpi_pci_root_release_info()
986 res = entry->res; in acpi_pci_root_release_info()
987 if (res->flags & IORESOURCE_IO) in acpi_pci_root_release_info()
989 if (res->parent && in acpi_pci_root_release_info()
990 (res->flags & (IORESOURCE_MEM | IORESOURCE_IO))) in acpi_pci_root_release_info()
993 __acpi_pci_root_release_info(bridge->release_data); in acpi_pci_root_release_info()
1001 int ret, busnum = root->secondary.start; in acpi_pci_root_create()
1002 struct acpi_device *device = root->device; in acpi_pci_root_create() local
1003 int node = acpi_get_node(device->handle); in acpi_pci_root_create()
1007 info->root = root; in acpi_pci_root_create()
1008 info->bridge = device; in acpi_pci_root_create()
1009 info->ops = ops; in acpi_pci_root_create()
1010 INIT_LIST_HEAD(&info->resources); in acpi_pci_root_create()
1011 snprintf(info->name, sizeof(info->name), "PCI Bus %04x:%02x", in acpi_pci_root_create()
1012 root->segment, busnum); in acpi_pci_root_create()
1014 if (ops->init_info && ops->init_info(info)) in acpi_pci_root_create()
1016 if (ops->prepare_resources) in acpi_pci_root_create()
1017 ret = ops->prepare_resources(info); in acpi_pci_root_create()
1024 pci_add_resource(&info->resources, &root->secondary); in acpi_pci_root_create()
1025 bus = pci_create_root_bus(NULL, busnum, ops->pci_ops, in acpi_pci_root_create()
1026 sysdata, &info->resources); in acpi_pci_root_create()
1030 host_bridge = to_pci_host_bridge(bus->bridge); in acpi_pci_root_create()
1031 if (!(root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL)) in acpi_pci_root_create()
1032 host_bridge->native_pcie_hotplug = 0; in acpi_pci_root_create()
1033 if (!(root->osc_control_set & OSC_PCI_SHPC_NATIVE_HP_CONTROL)) in acpi_pci_root_create()
1034 host_bridge->native_shpc_hotplug = 0; in acpi_pci_root_create()
1035 if (!(root->osc_control_set & OSC_PCI_EXPRESS_AER_CONTROL)) in acpi_pci_root_create()
1036 host_bridge->native_aer = 0; in acpi_pci_root_create()
1037 if (!(root->osc_control_set & OSC_PCI_EXPRESS_PME_CONTROL)) in acpi_pci_root_create()
1038 host_bridge->native_pme = 0; in acpi_pci_root_create()
1039 if (!(root->osc_control_set & OSC_PCI_EXPRESS_LTR_CONTROL)) in acpi_pci_root_create()
1040 host_bridge->native_ltr = 0; in acpi_pci_root_create()
1041 if (!(root->osc_control_set & OSC_PCI_EXPRESS_DPC_CONTROL)) in acpi_pci_root_create()
1042 host_bridge->native_dpc = 0; in acpi_pci_root_create()
1044 if (!(root->osc_ext_control_set & OSC_CXL_ERROR_REPORTING_CONTROL)) in acpi_pci_root_create()
1045 host_bridge->native_cxl_error = 0; in acpi_pci_root_create()
1047 acpi_dev_power_up_children_with_adr(device); in acpi_pci_root_create()
1053 dev_printk(KERN_DEBUG, &bus->dev, "on NUMA node %d\n", node); in acpi_pci_root_create()