Lines Matching full:root

3  *  pci_root.c - ACPI PCI Root Bridge Driver ($Revision: 40 $)
28 #define ACPI_PCI_ROOT_DEVICE_NAME "PCI Root Bridge"
60 * acpi_is_root_bridge - determine whether an ACPI CA node is a PCI root bridge
154 static void decode_osc_bits(struct acpi_pci_root *root, char *msg, u32 word, in decode_osc_bits() argument
167 dev_info(&root->device->dev, "_OSC: %s [%s]\n", msg, buf); in decode_osc_bits()
170 static void decode_osc_support(struct acpi_pci_root *root, char *msg, u32 word) in decode_osc_support() argument
172 decode_osc_bits(root, msg, word, pci_osc_support_bit, in decode_osc_support()
176 static void decode_osc_control(struct acpi_pci_root *root, char *msg, u32 word) in decode_osc_control() argument
178 decode_osc_bits(root, msg, word, pci_osc_control_bit, in decode_osc_control()
182 static void decode_cxl_osc_support(struct acpi_pci_root *root, char *msg, u32 word) in decode_cxl_osc_support() argument
184 decode_osc_bits(root, msg, word, cxl_osc_support_bit, in decode_cxl_osc_support()
188 static void decode_cxl_osc_control(struct acpi_pci_root *root, char *msg, u32 word) in decode_cxl_osc_control() argument
190 decode_osc_bits(root, msg, word, cxl_osc_control_bit, in decode_cxl_osc_control()
194 static inline bool is_pcie(struct acpi_pci_root *root) in is_pcie() argument
196 return root->bridge_type == ACPI_BRIDGE_TYPE_PCIE; in is_pcie()
199 static inline bool is_cxl(struct acpi_pci_root *root) in is_cxl() argument
201 return root->bridge_type == ACPI_BRIDGE_TYPE_CXL; in is_cxl()
207 static char *to_uuid(struct acpi_pci_root *root) in to_uuid() argument
209 if (is_cxl(root)) in to_uuid()
214 static int cap_length(struct acpi_pci_root *root) in cap_length() argument
216 if (is_cxl(root)) in cap_length()
221 static acpi_status acpi_pci_run_osc(struct acpi_pci_root *root, in acpi_pci_run_osc() argument
226 .uuid_str = to_uuid(root), in acpi_pci_run_osc()
228 .cap.length = cap_length(root), in acpi_pci_run_osc()
233 status = acpi_run_osc(root->device->handle, &context); in acpi_pci_run_osc()
236 if (is_cxl(root)) in acpi_pci_run_osc()
243 static acpi_status acpi_pci_query_osc(struct acpi_pci_root *root, u32 support, in acpi_pci_query_osc() argument
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()
256 if (is_cxl(root)) { 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()
263 status = acpi_pci_run_osc(root, capbuf, &pci_result, &cxl_result); in acpi_pci_query_osc()
265 root->osc_support_set = support; in acpi_pci_query_osc()
267 if (is_cxl(root)) { in acpi_pci_query_osc()
268 root->osc_ext_support_set = cxl_support; in acpi_pci_query_osc()
271 } else if (is_cxl(root)) { in acpi_pci_query_osc()
276 root->bridge_type = ACPI_BRIDGE_TYPE_PCIE; in acpi_pci_query_osc()
285 struct acpi_pci_root *root; in acpi_pci_find_root() local
290 root = acpi_driver_data(device); in acpi_pci_find_root()
292 return root; in acpi_pci_find_root()
334 * acpi_pci_osc_control_set - Request control of PCI root _OSC features.
335 * @handle: ACPI handle of a PCI root bridge (or PCIe Root Complex).
355 struct acpi_pci_root *root; in acpi_pci_osc_control_set() local
362 root = acpi_pci_find_root(handle); in acpi_pci_osc_control_set()
363 if (!root) in acpi_pci_osc_control_set()
367 *mask |= root->osc_control_set; in acpi_pci_osc_control_set()
369 if (is_cxl(root)) { in acpi_pci_osc_control_set()
371 *cxl_mask |= root->osc_ext_control_set; in acpi_pci_osc_control_set()
378 status = acpi_pci_query_osc(root, support, mask, cxl_support, in acpi_pci_osc_control_set()
382 if (is_cxl(root)) { in acpi_pci_osc_control_set()
393 decode_osc_control(root, "platform does not support", in acpi_pci_osc_control_set()
396 decode_cxl_osc_control(root, "CXL platform does not support", 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()
408 decode_osc_control(root, "not requesting control; platform does not support", in acpi_pci_osc_control_set()
414 capbuf[OSC_SUPPORT_DWORD] = root->osc_support_set; in acpi_pci_osc_control_set()
416 if (is_cxl(root)) { in acpi_pci_osc_control_set()
417 capbuf[OSC_EXT_SUPPORT_DWORD] = root->osc_ext_support_set; in acpi_pci_osc_control_set()
421 status = acpi_pci_run_osc(root, capbuf, mask, cxl_mask); 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()
541 static bool os_control_query_checks(struct acpi_pci_root *root, u32 support) in os_control_query_checks() argument
543 struct acpi_device *device = root->device; in os_control_query_checks()
551 decode_osc_support(root, "not requesting OS control; OS requires", in os_control_query_checks()
559 static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm) in negotiate_os_control() argument
564 struct acpi_device *device = root->device; in negotiate_os_control()
573 root->osc_control_set = ~OSC_PCI_EXPRESS_PME_CONTROL; in negotiate_os_control()
574 decode_osc_control(root, "OS assumes control of", in negotiate_os_control()
575 root->osc_control_set); in negotiate_os_control()
581 decode_osc_support(root, "OS supports", support); in negotiate_os_control()
583 if (os_control_query_checks(root, support)) in negotiate_os_control()
586 if (is_cxl(root)) { in negotiate_os_control()
588 decode_cxl_osc_support(root, "OS supports", cxl_support); in negotiate_os_control()
596 decode_osc_control(root, "OS now controls", control); in negotiate_os_control()
598 decode_cxl_osc_control(root, "OS now controls", in negotiate_os_control()
616 * root scan. in negotiate_os_control()
621 if (status == AE_NOT_FOUND && !is_pcie(root)) in negotiate_os_control()
625 decode_osc_control(root, "OS requested", requested); in negotiate_os_control()
626 decode_osc_control(root, "platform willing to grant", control); in negotiate_os_control()
629 decode_cxl_osc_control(root, "OS requested", cxl_requested); in negotiate_os_control()
630 decode_cxl_osc_control(root, "platform willing to grant", in negotiate_os_control()
645 struct acpi_pci_root *root; in acpi_pci_root_add() local
651 root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL); in acpi_pci_root_add()
652 if (!root) 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()
674 root->secondary.end = 0xFF; 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()
690 root->device = device; in acpi_pci_root_add()
691 root->segment = segment & 0xFFFF; in acpi_pci_root_add()
694 device->driver_data = root; 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()
715 negotiate_os_control(root, &no_aspm); in acpi_pci_root_add()
722 * Scan the Root Bridge 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()
726 * thus the root bridge's pci_dev does not exist). 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()
732 root->segment, (unsigned int)root->secondary.start); 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()
757 acpi_ioapic_add(root->device->handle); in acpi_pci_root_add()
761 pci_bus_add_devices(root->bus); in acpi_pci_root_add()
769 kfree(root); in acpi_pci_root_add()
775 struct acpi_pci_root *root = acpi_driver_data(device); in acpi_pci_root_remove() local
779 pci_stop_root_bus(root->bus); in acpi_pci_root_remove()
781 pci_ioapic_remove(root); in acpi_pci_root_remove()
782 device_set_wakeup_capable(root->bus->bridge, false); in acpi_pci_root_remove()
785 pci_remove_root_bus(root->bus); in acpi_pci_root_remove()
786 WARN_ON(acpi_ioapic_remove(root)); in acpi_pci_root_remove()
792 kfree(root); in acpi_pci_root_remove()
805 struct resource *res1, *res2, *root = NULL; in acpi_pci_root_validate_resources() local
809 root = (type & IORESOURCE_MEM) ? &iomem_resource : &ioport_resource; in acpi_pci_root_validate_resources()
821 end = min(res1->end, root->end); in acpi_pci_root_validate_resources()
933 struct resource *res, *conflict, *root = NULL; in pci_acpi_root_add_resources() local
938 root = &iomem_resource; in pci_acpi_root_add_resources()
940 root = &ioport_resource; in pci_acpi_root_add_resources()
948 if (res == root) in pci_acpi_root_add_resources()
951 conflict = insert_resource_conflict(root, res); in pci_acpi_root_add_resources()
996 struct pci_bus *acpi_pci_root_create(struct acpi_pci_root *root, in acpi_pci_root_create() argument
1001 int ret, busnum = root->secondary.start; in acpi_pci_root_create()
1002 struct acpi_device *device = root->device; in acpi_pci_root_create()
1007 info->root = root; in acpi_pci_root_create()
1012 root->segment, busnum); in acpi_pci_root_create()
1024 pci_add_resource(&info->resources, &root->secondary); in acpi_pci_root_create()
1031 if (!(root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL)) in acpi_pci_root_create()
1033 if (!(root->osc_control_set & OSC_PCI_SHPC_NATIVE_HP_CONTROL)) in acpi_pci_root_create()
1035 if (!(root->osc_control_set & OSC_PCI_EXPRESS_AER_CONTROL)) in acpi_pci_root_create()
1037 if (!(root->osc_control_set & OSC_PCI_EXPRESS_PME_CONTROL)) in acpi_pci_root_create()
1039 if (!(root->osc_control_set & OSC_PCI_EXPRESS_LTR_CONTROL)) in acpi_pci_root_create()
1041 if (!(root->osc_control_set & OSC_PCI_EXPRESS_DPC_CONTROL)) in acpi_pci_root_create()
1044 if (!(root->osc_ext_control_set & OSC_CXL_ERROR_REPORTING_CONTROL)) in acpi_pci_root_create()