@@ -431,6 +431,54 @@ static inline bool osc_have_support(u32 support, u32 required)
return ((support & required) == required);
}
+static inline u32 osc_get_aspm_control_bits(struct acpi_pci_root *root,
+ u32 support)
+{
+ if (osc_have_support(support, ACPI_PCIE_ASPM_SUPPORT))
+ return OSC_CONTROL_BITS_ASPM;
+
+ return 0;
+}
+
+static inline u32 osc_get_pciehp_control_bits(struct acpi_pci_root *root,
+ u32 support)
+{
+ if (IS_ENABLED(CONFIG_HOTPLUG_PCI_PCIE) &&
+ osc_have_support(support, ACPI_PCIE_REQ_SUPPORT)) {
+ return OSC_PCI_EXPRESS_CAPABILITY_CONTROL |
+ OSC_PCI_EXPRESS_NATIVE_HP_CONTROL;
+ }
+
+ return 0;
+}
+
+static inline u32 osc_get_shpchp_control_bits(struct acpi_pci_root *root,
+ u32 support)
+{
+ if (IS_ENABLED(CONFIG_HOTPLUG_PCI_SHPC) &&
+ osc_have_support(support, ACPI_PCIE_REQ_SUPPORT)) {
+ return OSC_PCI_EXPRESS_CAPABILITY_CONTROL |
+ OSC_PCI_SHPC_NATIVE_HP_CONTROL;
+ }
+
+ return 0;
+}
+
+static inline u32 osc_get_aer_control_bits(struct acpi_pci_root *root,
+ u32 support)
+{
+ if (!pci_aer_available() ||
+ !osc_have_support(support, ACPI_PCIE_REQ_SUPPORT))
+ return 0;
+
+ if (aer_acpi_firmware_first()) {
+ dev_info(&root->device->dev, "PCIe AER handled by firmware\n");
+ return 0;
+ }
+
+ return OSC_PCI_EXPRESS_CAPABILITY_CONTROL | OSC_PCI_EXPRESS_AER_CONTROL;
+}
+
static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm,
bool is_pcie)
{
@@ -494,29 +542,16 @@ static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm,
return;
}
- control = 0;
-
- if (osc_have_support(support, ACPI_PCIE_ASPM_SUPPORT))
- control |= OSC_CONTROL_BITS_ASPM;
-
+ control = osc_get_aspm_control_bits(root, support);
if (!control)
*no_aspm = 1;
- if (IS_ENABLED(CONFIG_HOTPLUG_PCI_PCIE))
- control |= OSC_PCI_EXPRESS_CAPABILITY_CONTROL |
- OSC_PCI_EXPRESS_NATIVE_HP_CONTROL;
-
- if (IS_ENABLED(CONFIG_HOTPLUG_PCI_SHPC))
- control |= OSC_PCI_EXPRESS_CAPABILITY_CONTROL |
- OSC_PCI_SHPC_NATIVE_HP_CONTROL;
-
- if (pci_aer_available()) {
- if (aer_acpi_firmware_first())
- dev_info(&device->dev,
- "PCIe AER handled by firmware\n");
- else
- control |= OSC_PCI_EXPRESS_CAPABILITY_CONTROL |
- OSC_PCI_EXPRESS_AER_CONTROL;
+ control |= osc_get_pciehp_control_bits(root, support);
+ control |= osc_get_shpchp_control_bits(root, support);
+ control |= osc_get_aer_control_bits(root, support);
+ if (!control) {
+ dev_info(&device->dev, "_OSC: not requesting OS control\n");
+ return;
}
requested = control;
Provide an inline function for each feature (ASPM, PCIe hotplug, SHPC hotplug, and AER) to set its _OSC requests after performing any sanity checks that it needs. This is intended to improve readability/maintenance. Signed-off-by: Aaron Sierra <asierra@xes-inc.com> --- drivers/acpi/pci_root.c | 75 ++++++++++++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 20 deletions(-)