]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - drivers/acpi/pci_root.c
Merge tag 'pci-v5.7-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci
[thirdparty/linux.git] / drivers / acpi / pci_root.c
index f92df2533e7ec8331dc7875efccdd9bef00b3a9f..ac8ad6cb82aa3ae538ab89341a649b9e8bc974b7 100644 (file)
@@ -131,6 +131,7 @@ static struct pci_osc_bit_struct pci_osc_support_bit[] = {
        { OSC_PCI_CLOCK_PM_SUPPORT, "ClockPM" },
        { OSC_PCI_SEGMENT_GROUPS_SUPPORT, "Segments" },
        { OSC_PCI_MSI_SUPPORT, "MSI" },
+       { OSC_PCI_EDR_SUPPORT, "EDR" },
        { OSC_PCI_HPX_TYPE_3_SUPPORT, "HPX-Type3" },
 };
 
@@ -141,6 +142,7 @@ static struct pci_osc_bit_struct pci_osc_control_bit[] = {
        { OSC_PCI_EXPRESS_AER_CONTROL, "AER" },
        { OSC_PCI_EXPRESS_CAPABILITY_CONTROL, "PCIeCapability" },
        { OSC_PCI_EXPRESS_LTR_CONTROL, "LTR" },
+       { OSC_PCI_EXPRESS_DPC_CONTROL, "DPC" },
 };
 
 static void decode_osc_bits(struct acpi_pci_root *root, char *msg, u32 word,
@@ -440,6 +442,8 @@ static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm,
                support |= OSC_PCI_ASPM_SUPPORT | OSC_PCI_CLOCK_PM_SUPPORT;
        if (pci_msi_enabled())
                support |= OSC_PCI_MSI_SUPPORT;
+       if (IS_ENABLED(CONFIG_PCIE_EDR))
+               support |= OSC_PCI_EDR_SUPPORT;
 
        decode_osc_support(root, "OS supports", support);
        status = acpi_pci_osc_support(root, support);
@@ -487,6 +491,15 @@ static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm,
                        control |= OSC_PCI_EXPRESS_AER_CONTROL;
        }
 
+       /*
+        * Per the Downstream Port Containment Related Enhancements ECN to
+        * the PCI Firmware Spec, r3.2, sec 4.5.1, table 4-5,
+        * OSC_PCI_EXPRESS_DPC_CONTROL indicates the OS supports both DPC
+        * and EDR.
+        */
+       if (IS_ENABLED(CONFIG_PCIE_DPC) && IS_ENABLED(CONFIG_PCIE_EDR))
+               control |= OSC_PCI_EXPRESS_DPC_CONTROL;
+
        requested = control;
        status = acpi_pci_osc_control_set(handle, &control,
                                          OSC_PCI_EXPRESS_CAPABILITY_CONTROL);
@@ -916,6 +929,8 @@ struct pci_bus *acpi_pci_root_create(struct acpi_pci_root *root,
                host_bridge->native_pme = 0;
        if (!(root->osc_control_set & OSC_PCI_EXPRESS_LTR_CONTROL))
                host_bridge->native_ltr = 0;
+       if (!(root->osc_control_set & OSC_PCI_EXPRESS_DPC_CONTROL))
+               host_bridge->native_dpc = 0;
 
        /*
         * Evaluate the "PCI Boot Configuration" _DSM Function.  If it