Lines Matching +full:integer +full:- +full:n

1 // SPDX-License-Identifier: GPL-2.0
17 #include <linux/pci-acpi.h>
25 * here to PCI-SIG members:
26 * https://members.pcisig.com/wg/PCI-SIG/document/15350
35 struct device *dev = &adev->dev; in acpi_get_rc_addr()
47 dev_err(dev, "failed to parse _CRS method, error code %d\n", in acpi_get_rc_addr()
53 dev_err(dev, "no IO and memory resources present in _CRS\n"); in acpi_get_rc_addr()
54 return -EINVAL; in acpi_get_rc_addr()
58 *res = *entry->res; in acpi_get_rc_addr()
88 dev_err(dev, "can't find _HID %s device to locate resources\n", in acpi_get_rc_resources()
90 return -ENODEV; in acpi_get_rc_resources()
95 return -ENODEV; in acpi_get_rc_resources()
99 dev_err(dev, "can't get resource from %s\n", in acpi_get_rc_resources()
100 dev_name(&adev->dev)); in acpi_get_rc_resources()
146 if (hpx->revision > 1) { in program_hpx_type0()
147 pci_warn(dev, "PCI settings rev %d not supported; using defaults\n", in program_hpx_type0()
148 hpx->revision); in program_hpx_type0()
152 pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, hpx->cache_line_size); in program_hpx_type0()
153 pci_write_config_byte(dev, PCI_LATENCY_TIMER, hpx->latency_timer); in program_hpx_type0()
155 if (hpx->enable_serr) in program_hpx_type0()
157 if (hpx->enable_perr) in program_hpx_type0()
162 if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { in program_hpx_type0()
164 hpx->latency_timer); in program_hpx_type0()
166 if (hpx->enable_perr) in program_hpx_type0()
176 union acpi_object *fields = record->package.elements; in decode_type0_hpx_record()
177 u32 revision = fields[1].integer.value; in decode_type0_hpx_record()
181 if (record->package.count != 6) in decode_type0_hpx_record()
186 hpx0->revision = revision; in decode_type0_hpx_record()
187 hpx0->cache_line_size = fields[2].integer.value; in decode_type0_hpx_record()
188 hpx0->latency_timer = fields[3].integer.value; in decode_type0_hpx_record()
189 hpx0->enable_serr = fields[4].integer.value; in decode_type0_hpx_record()
190 hpx0->enable_perr = fields[5].integer.value; in decode_type0_hpx_record()
193 pr_warn("%s: Type 0 Revision %d record not supported\n", in decode_type0_hpx_record()
200 /* _HPX PCI-X Setting Record (Type 1) */
219 pci_warn(dev, "PCI-X settings not supported\n"); in program_hpx_type1()
226 union acpi_object *fields = record->package.elements; in decode_type1_hpx_record()
227 u32 revision = fields[1].integer.value; in decode_type1_hpx_record()
231 if (record->package.count != 5) in decode_type1_hpx_record()
236 hpx1->revision = revision; in decode_type1_hpx_record()
237 hpx1->max_mem_read = fields[2].integer.value; in decode_type1_hpx_record()
238 hpx1->avg_max_split = fields[3].integer.value; in decode_type1_hpx_record()
239 hpx1->tot_max_split = fields[4].integer.value; in decode_type1_hpx_record()
242 pr_warn("%s: Type 1 Revision %d record not supported\n", in decode_type1_hpx_record()
296 if (hpx->revision > 1) { in program_hpx_type2()
297 pci_warn(dev, "PCIe settings rev %d not supported\n", in program_hpx_type2()
298 hpx->revision); in program_hpx_type2()
307 hpx->pci_exp_devctl_and |= PCI_EXP_DEVCTL_PAYLOAD | in program_hpx_type2()
309 hpx->pci_exp_devctl_or &= ~(PCI_EXP_DEVCTL_PAYLOAD | in program_hpx_type2()
314 ~hpx->pci_exp_devctl_and, hpx->pci_exp_devctl_or); in program_hpx_type2()
323 hpx->pci_exp_lnkctl_and |= PCI_EXP_LNKCTL_RCB; in program_hpx_type2()
324 hpx->pci_exp_lnkctl_or &= ~PCI_EXP_LNKCTL_RCB; in program_hpx_type2()
326 hpx->pci_exp_lnkctl_or |= PCI_EXP_LNKCTL_RCB; in program_hpx_type2()
329 ~hpx->pci_exp_lnkctl_and, hpx->pci_exp_lnkctl_or); in program_hpx_type2()
339 reg32 = (reg32 & hpx->unc_err_mask_and) | hpx->unc_err_mask_or; in program_hpx_type2()
344 reg32 = (reg32 & hpx->unc_err_sever_and) | hpx->unc_err_sever_or; in program_hpx_type2()
349 reg32 = (reg32 & hpx->cor_err_mask_and) | hpx->cor_err_mask_or; in program_hpx_type2()
354 reg32 = (reg32 & hpx->adv_err_cap_and) | hpx->adv_err_cap_or; in program_hpx_type2()
375 union acpi_object *fields = record->package.elements; in decode_type2_hpx_record()
376 u32 revision = fields[1].integer.value; in decode_type2_hpx_record()
380 if (record->package.count != 18) in decode_type2_hpx_record()
385 hpx2->revision = revision; in decode_type2_hpx_record()
386 hpx2->unc_err_mask_and = fields[2].integer.value; in decode_type2_hpx_record()
387 hpx2->unc_err_mask_or = fields[3].integer.value; in decode_type2_hpx_record()
388 hpx2->unc_err_sever_and = fields[4].integer.value; in decode_type2_hpx_record()
389 hpx2->unc_err_sever_or = fields[5].integer.value; in decode_type2_hpx_record()
390 hpx2->cor_err_mask_and = fields[6].integer.value; in decode_type2_hpx_record()
391 hpx2->cor_err_mask_or = fields[7].integer.value; in decode_type2_hpx_record()
392 hpx2->adv_err_cap_and = fields[8].integer.value; in decode_type2_hpx_record()
393 hpx2->adv_err_cap_or = fields[9].integer.value; in decode_type2_hpx_record()
394 hpx2->pci_exp_devctl_and = fields[10].integer.value; in decode_type2_hpx_record()
395 hpx2->pci_exp_devctl_or = fields[11].integer.value; in decode_type2_hpx_record()
396 hpx2->pci_exp_lnkctl_and = fields[12].integer.value; in decode_type2_hpx_record()
397 hpx2->pci_exp_lnkctl_or = fields[13].integer.value; in decode_type2_hpx_record()
398 hpx2->sec_unc_err_sever_and = fields[14].integer.value; in decode_type2_hpx_record()
399 hpx2->sec_unc_err_sever_or = fields[15].integer.value; in decode_type2_hpx_record()
400 hpx2->sec_unc_err_mask_and = fields[16].integer.value; in decode_type2_hpx_record()
401 hpx2->sec_unc_err_mask_or = fields[17].integer.value; in decode_type2_hpx_record()
404 pr_warn("%s: Type 2 Revision %d record not supported\n", in decode_type2_hpx_record()
470 if (dev->is_virtfn) in hpx3_function_type()
505 if (!(hpx3_device_type(dev) & reg->device_type)) in program_hpx_type3_register()
508 if (!(hpx3_function_type(dev) & reg->function_type)) in program_hpx_type3_register()
511 switch (reg->config_space_location) { in program_hpx_type3_register()
516 pos = pci_find_capability(dev, reg->pci_exp_cap_id); in program_hpx_type3_register()
522 pos = pci_find_ext_capability(dev, reg->pci_exp_cap_id); in program_hpx_type3_register()
528 reg->pci_exp_cap_ver)) in program_hpx_type3_register()
539 pci_read_config_dword(dev, pos + reg->match_offset, &match_reg); in program_hpx_type3_register()
541 if ((match_reg & reg->match_mask_and) != reg->match_value) in program_hpx_type3_register()
544 pci_read_config_dword(dev, pos + reg->reg_offset, &write_reg); in program_hpx_type3_register()
546 write_reg &= reg->reg_mask_and; in program_hpx_type3_register()
547 write_reg |= reg->reg_mask_or; in program_hpx_type3_register()
552 pci_write_config_dword(dev, pos + reg->reg_offset, write_reg); in program_hpx_type3_register()
554 pci_dbg(dev, "Applied _HPX3 at [0x%x]: 0x%08x -> 0x%08x", in program_hpx_type3_register()
572 hpx3_reg->device_type = reg_fields[0].integer.value; in parse_hpx3_register()
573 hpx3_reg->function_type = reg_fields[1].integer.value; in parse_hpx3_register()
574 hpx3_reg->config_space_location = reg_fields[2].integer.value; in parse_hpx3_register()
575 hpx3_reg->pci_exp_cap_id = reg_fields[3].integer.value; in parse_hpx3_register()
576 hpx3_reg->pci_exp_cap_ver = reg_fields[4].integer.value; in parse_hpx3_register()
577 hpx3_reg->pci_exp_vendor_id = reg_fields[5].integer.value; in parse_hpx3_register()
578 hpx3_reg->dvsec_id = reg_fields[6].integer.value; in parse_hpx3_register()
579 hpx3_reg->dvsec_rev = reg_fields[7].integer.value; in parse_hpx3_register()
580 hpx3_reg->match_offset = reg_fields[8].integer.value; in parse_hpx3_register()
581 hpx3_reg->match_mask_and = reg_fields[9].integer.value; in parse_hpx3_register()
582 hpx3_reg->match_value = reg_fields[10].integer.value; in parse_hpx3_register()
583 hpx3_reg->reg_offset = reg_fields[11].integer.value; in parse_hpx3_register()
584 hpx3_reg->reg_mask_and = reg_fields[12].integer.value; in parse_hpx3_register()
585 hpx3_reg->reg_mask_or = reg_fields[13].integer.value; in parse_hpx3_register()
591 union acpi_object *fields = record->package.elements; in program_type3_hpx_record()
597 revision = fields[1].integer.value; in program_type3_hpx_record()
600 desc_count = fields[2].integer.value; in program_type3_hpx_record()
603 if (record->package.count != expected_length) in program_type3_hpx_record()
619 "%s: Type 3 Revision %d record not supported\n", in program_type3_hpx_record()
642 if (package->type != ACPI_TYPE_PACKAGE) { in acpi_run_hpx()
647 for (i = 0; i < package->package.count; i++) { in acpi_run_hpx()
648 record = &package->package.elements[i]; in acpi_run_hpx()
649 if (record->type != ACPI_TYPE_PACKAGE) { in acpi_run_hpx()
654 fields = record->package.elements; in acpi_run_hpx()
661 type = fields[0].integer.value; in acpi_run_hpx()
690 pr_err("%s: Type %d record not supported\n", in acpi_run_hpx()
716 if (package->type != ACPI_TYPE_PACKAGE || in acpi_run_hpp()
717 package->package.count != 4) { in acpi_run_hpp()
722 fields = package->package.elements; in acpi_run_hpp()
731 hpx0.cache_line_size = fields[0].integer.value; in acpi_run_hpp()
732 hpx0.latency_timer = fields[1].integer.value; in acpi_run_hpp()
733 hpx0.enable_serr = fields[2].integer.value; in acpi_run_hpp()
734 hpx0.enable_perr = fields[3].integer.value; in acpi_run_hpp()
745 * @dev - the pci_dev for which we want parameters
754 return -ENODEV; in pci_acpi_program_hp_params()
757 for (pbus = dev->bus; pbus; pbus = pbus->parent) { in pci_acpi_program_hp_params()
783 return -ENODEV; in pci_acpi_program_hp_params()
787 * pciehp_is_native - Check whether a hotplug port is handled by the OS
808 host = pci_find_host_bridge(bridge->bus); in pciehp_is_native()
809 return host->native_pcie_hotplug; in pciehp_is_native()
813 * shpchp_is_native - Check whether a hotplug port is handled by the OS
821 return bridge->shpc_managed; in shpchp_is_native()
825 * pci_acpi_wake_bus - Root bus wakeup notification fork function.
835 pci_pme_wakeup_bus(root->bus); in pci_acpi_wake_bus()
839 * pci_acpi_wake_dev - PCI device wakeup notification work function.
846 pci_dev = to_pci_dev(context->dev); in pci_acpi_wake_dev()
848 if (pci_dev->pme_poll) in pci_acpi_wake_dev()
849 pci_dev->pme_poll = false; in pci_acpi_wake_dev()
851 if (pci_dev->current_state == PCI_D3cold) { in pci_acpi_wake_dev()
853 pm_request_resume(&pci_dev->dev); in pci_acpi_wake_dev()
858 if (pci_dev->pme_support) in pci_acpi_wake_dev()
862 pm_request_resume(&pci_dev->dev); in pci_acpi_wake_dev()
864 pci_pme_wakeup_bus(pci_dev->subordinate); in pci_acpi_wake_dev()
868 * pci_acpi_add_bus_pm_notifier - Register PM notifier for root PCI bus.
877 * pci_acpi_add_pm_notifier - Register PM notifier for given PCI device.
884 return acpi_add_pm_notifier(dev, &pci_dev->dev, pci_acpi_wake_dev); in pci_acpi_add_pm_notifier()
888 * _SxD returns the D-state with the highest power
889 * (lowest D-state number) supported in the S-state "x".
894 * D-state) than the return value from _SxD.
896 * But if _PRW is enabled at S-state "x", the OS
897 * must not choose a power lower than _SxD --
899 * the lowest power (highest D-state number) the device
904 * if (_PRW at S-state x)
906 * else // no _PRW at S-state x
914 if (pdev->no_d3cold || !pdev->d3cold_allowed) in acpi_pci_choose_state()
918 acpi_state = acpi_pm_device_sleep_state(&pdev->dev, NULL, d_max); in acpi_pci_choose_state()
941 if (!dev_fwnode(&dev->dev) && !pci_dev_is_added(dev)) in pci_set_acpi_fwnode()
942 ACPI_COMPANION_SET(&dev->dev, in pci_set_acpi_fwnode()
943 acpi_pci_find_companion(&dev->dev)); in pci_set_acpi_fwnode()
947 * pci_dev_acpi_reset - do a function level reset using _RST method
953 acpi_handle handle = ACPI_HANDLE(&dev->dev); in pci_dev_acpi_reset()
956 return -ENOTTY; in pci_dev_acpi_reset()
962 pci_warn(dev, "ACPI _RST failed\n"); in pci_dev_acpi_reset()
963 return -ENOTTY; in pci_dev_acpi_reset()
971 struct acpi_device *adev = ACPI_COMPANION(&dev->dev); in acpi_pci_power_manageable()
982 if (acpi_pci_disabled || !dev->is_hotplug_bridge) in acpi_pci_bridge_d3()
985 adev = ACPI_COMPANION(&dev->dev); in acpi_pci_bridge_d3()
998 * is power-manageable via ACPI. in acpi_pci_bridge_d3()
1011 rpadev = ACPI_COMPANION(&rpdev->dev); in acpi_pci_bridge_d3()
1019 * events from low-power states including D3hot and D3cold. in acpi_pci_bridge_d3()
1021 if (!rpadev->wakeup.flags.valid) in acpi_pci_bridge_d3()
1025 * In the bridge-below-a-Root-Port case, evaluate _S0W for the Root Port in acpi_pci_bridge_d3()
1040 obj->integer.value == 1) in acpi_pci_bridge_d3()
1049 int ret = acpi_evaluate_reg(ACPI_HANDLE(&dev->dev), in acpi_pci_config_space_access()
1052 pci_dbg(dev, "ACPI _REG %s evaluation failed (%d)\n", in acpi_pci_config_space_access()
1058 struct acpi_device *adev = ACPI_COMPANION(&dev->dev); in acpi_pci_set_power_state()
1069 if (!adev || acpi_has_method(adev->handle, "_EJ0")) in acpi_pci_set_power_state()
1070 return -ENODEV; in acpi_pci_set_power_state()
1080 return -EINVAL; in acpi_pci_set_power_state()
1084 if (dev_pm_qos_flags(&dev->dev, PM_QOS_FLAG_NO_POWER_OFF) == in acpi_pci_set_power_state()
1086 return -EBUSY; in acpi_pci_set_power_state()
1096 pci_dbg(dev, "power state changed by ACPI to %s\n", in acpi_pci_set_power_state()
1097 acpi_power_state_string(adev->power.state)); in acpi_pci_set_power_state()
1113 struct acpi_device *adev = ACPI_COMPANION(&dev->dev); in acpi_pci_get_power_state()
1126 state = adev->power.state; in acpi_pci_get_power_state()
1135 struct acpi_device *adev = ACPI_COMPANION(&dev->dev); in acpi_pci_refresh_power_state()
1143 while (bus->parent) { in acpi_pci_propagate_wakeup()
1144 if (acpi_pm_device_can_wakeup(&bus->self->dev)) in acpi_pci_propagate_wakeup()
1145 return acpi_pm_set_device_wakeup(&bus->self->dev, enable); in acpi_pci_propagate_wakeup()
1147 bus = bus->parent; in acpi_pci_propagate_wakeup()
1151 if (bus->bridge) { in acpi_pci_propagate_wakeup()
1152 if (acpi_pm_device_can_wakeup(bus->bridge)) in acpi_pci_propagate_wakeup()
1153 return acpi_pm_set_device_wakeup(bus->bridge, enable); in acpi_pci_propagate_wakeup()
1163 if (acpi_pm_device_can_wakeup(&dev->dev)) in acpi_pci_wakeup()
1164 return acpi_pm_set_device_wakeup(&dev->dev, enable); in acpi_pci_wakeup()
1166 return acpi_pci_propagate_wakeup(dev->bus, enable); in acpi_pci_wakeup()
1178 * system-wide suspend/resume confuses the platform firmware, so avoid in acpi_pci_need_resume()
1186 adev = ACPI_COMPANION(&dev->dev); in acpi_pci_need_resume()
1190 if (adev->wakeup.flags.valid && in acpi_pci_need_resume()
1191 device_may_wakeup(&dev->dev) != !!adev->wakeup.prepare_count) in acpi_pci_need_resume()
1197 return !!adev->power.flags.dsw_present; in acpi_pci_need_resume()
1205 if (acpi_pci_disabled || !bus->bridge || !ACPI_HANDLE(bus->bridge)) in acpi_pci_add_bus()
1218 obj = acpi_evaluate_dsm(ACPI_HANDLE(bus->bridge), &pci_acpi_dsm_guid, 3, in acpi_pci_add_bus()
1223 if (obj->type == ACPI_TYPE_INTEGER && obj->integer.value == 1) { in acpi_pci_add_bus()
1225 bridge->ignore_reset_delay = 1; in acpi_pci_add_bus()
1232 if (acpi_pci_disabled || !bus->bridge) in acpi_pci_remove_bus()
1246 * pci_acpi_set_companion_lookup_hook - Set ACPI companion lookup callback.
1250 * objects in the ACPI namespace have _ADR with non-standard bus-device-function
1265 return -EINVAL; in pci_acpi_set_companion_lookup_hook()
1270 ret = -EBUSY; in pci_acpi_set_companion_lookup_hook()
1283 * pci_acpi_clear_companion_lookup_hook - Clear ACPI companion lookup callback.
1310 if (!dev->parent) in acpi_pci_find_companion()
1325 addr = (PCI_SLOT(pci_dev->devfn) << 16) | PCI_FUNC(pci_dev->devfn); in acpi_pci_find_companion()
1326 adev = acpi_find_child_device(ACPI_COMPANION(dev->parent), addr, in acpi_pci_find_companion()
1342 if (adev && adev->pnp.type.platform_id && !addr && in acpi_pci_find_companion()
1343 pci_is_root_bus(pci_dev->bus)) in acpi_pci_find_companion()
1350 * pci_acpi_optimize_delay - optimize PCI D3 and D3cold delay from ACPI
1359 * the hierarchy have already completed power-on reset delays.
1372 struct pci_host_bridge *bridge = pci_find_host_bridge(pdev->bus); in pci_acpi_optimize_delay()
1376 if (bridge->ignore_reset_delay) in pci_acpi_optimize_delay()
1377 pdev->d3cold_delay = 0; in pci_acpi_optimize_delay()
1384 if (obj->type == ACPI_TYPE_PACKAGE && obj->package.count == 5) { in pci_acpi_optimize_delay()
1385 elements = obj->package.elements; in pci_acpi_optimize_delay()
1387 value = (int)elements[0].integer.value / 1000; in pci_acpi_optimize_delay()
1389 pdev->d3cold_delay = value; in pci_acpi_optimize_delay()
1392 value = (int)elements[3].integer.value / 1000; in pci_acpi_optimize_delay()
1394 pdev->d3hot_delay = value; in pci_acpi_optimize_delay()
1406 if (device_property_read_u8(&dev->dev, "ExternalFacingPort", &val)) in pci_acpi_set_external_facing()
1414 dev->external_facing = 1; in pci_acpi_set_external_facing()
1421 pci_acpi_optimize_delay(pci_dev, adev->handle); in pci_acpi_setup()
1426 if (!adev->wakeup.flags.valid) in pci_acpi_setup()
1436 if (pci_dev->bridge_d3) in pci_acpi_setup()
1452 if (adev->wakeup.flags.valid) { in pci_acpi_cleanup()
1454 if (pci_dev->bridge_d3) in pci_acpi_cleanup()
1464 * pci_msi_register_fwnode_provider - Register callback to retrieve fwnode
1478 * pci_host_bridge_acpi_msi_domain - Retrieve MSI domain of a PCI host bridge
1493 fwnode = pci_msi_get_fwnode_cb(&bus->dev); in pci_host_bridge_acpi_msi_domain()
1503 pr_info("ACPI FADT declares the system doesn't support MSI, so disable it\n"); in acpi_pci_init()
1508 pr_info("ACPI FADT declares the system doesn't support PCIe ASPM, so disable it\n"); in acpi_pci_init()