]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
PCI: Allow PCI bridges to go to D3Hot on all non-x86
authorManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Thu, 20 Mar 2025 18:06:04 +0000 (11:06 -0700)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 20 Mar 2025 21:33:33 +0000 (16:33 -0500)
Currently, pci_bridge_d3_possible() encodes a variety of decision factors
when deciding whether a given bridge can be put into D3. A particular one
of note is for "recent enough PCIe ports." Per Rafael [0]:

  "There were hardware issues related to PM on x86 platforms predating
   the introduction of Connected Standby in Windows.  For instance,
   programming a port into D3hot by writing to its PMCSR might cause the
   PCIe link behind it to go down and the only way to revive it was to
   power cycle the Root Complex.  And similar."

Thus, this function contains a DMI-based check for post-2015 BIOS.

The above factors (Windows, x86) don't really apply to non-x86 systems, and
also, many such systems don't have BIOS or DMI. However, we'd like to be
able to suspend bridges on non-x86 systems too.

Restrict the "recent enough" check to x86. If we find further
incompatibilities, it probably makes sense to expand on the deny-list
approach (i.e., bridge_d3_blacklist or similar).

Link: https://lore.kernel.org/r/20250320110604.v6.1.Id0a0e78ab0421b6bce51c4b0b87e6aebdfc69ec7@changeid
Link: https://lore.kernel.org/linux-pci/CAJZ5v0j_6jeMAQ7eFkZBe5Yi+USGzysxAgfemYh=-zq4h5W+Qg@mail.gmail.com/
Link: https://lore.kernel.org/linux-pci/20240227225442.GA249898@bhelgaas/
Link: https://lore.kernel.org/linux-pci/20240828210705.GA37859@bhelgaas/
[Brian: rewrite to !X86 based on Rafael's suggestions]
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Brian Norris <briannorris@chromium.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/pci.c

index 869d204a70a372d240b1a6988a2159a79999e1ca..2b53219fda3b229ad55ecd95cb5b1f04d1a78e24 100644 (file)
@@ -3023,7 +3023,7 @@ static const struct dmi_system_id bridge_d3_blacklist[] = {
  * @bridge: Bridge to check
  *
  * This function checks if it is possible to move the bridge to D3.
- * Currently we only allow D3 for recent enough PCIe ports and Thunderbolt.
+ * Currently we only allow D3 for some PCIe ports and for Thunderbolt.
  */
 bool pci_bridge_d3_possible(struct pci_dev *bridge)
 {
@@ -3067,10 +3067,10 @@ bool pci_bridge_d3_possible(struct pci_dev *bridge)
                        return false;
 
                /*
-                * It should be safe to put PCIe ports from 2015 or newer
-                * to D3.
+                * Out of caution, we only allow PCIe ports from 2015 or newer
+                * into D3 on x86.
                 */
-               if (dmi_get_bios_year() >= 2015)
+               if (!IS_ENABLED(CONFIG_X86) || dmi_get_bios_year() >= 2015)
                        return true;
                break;
        }