Commit 3aa8f652 authored by Bjorn Helgaas's avatar Bjorn Helgaas
Browse files

Merge branch 'pci/pm'

- Avoid D3 for Root Ports on TUXEDO Sirius Gen1 with old BIOS because the
  system can't wake up from suspend (Werner Sembach)

* pci/pm:
  PCI: Avoid putting some root ports into D3 on TUXEDO Sirius Gen1
parents 60b5cd4f b1049f2d
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -1010,4 +1010,34 @@ DECLARE_PCI_FIXUP_SUSPEND(PCI_VENDOR_ID_AMD, 0x1668, amd_rp_pme_suspend);
DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, 0x1668, amd_rp_pme_resume);
DECLARE_PCI_FIXUP_SUSPEND(PCI_VENDOR_ID_AMD, 0x1669, amd_rp_pme_suspend);
DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, 0x1669, amd_rp_pme_resume);

/*
 * Putting PCIe root ports on Ryzen SoCs with USB4 controllers into D3hot
 * may cause problems when the system attempts wake up from s2idle.
 *
 * On the TUXEDO Sirius 16 Gen 1 with a specific old BIOS this manifests as
 * a system hang.
 */
static const struct dmi_system_id quirk_tuxeo_rp_d3_dmi_table[] = {
	{
		.matches = {
			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
			DMI_EXACT_MATCH(DMI_BOARD_NAME, "APX958"),
			DMI_EXACT_MATCH(DMI_BIOS_VERSION, "V1.00A00_20240108"),
		},
	},
	{}
};

static void quirk_tuxeo_rp_d3(struct pci_dev *pdev)
{
	struct pci_dev *root_pdev;

	if (dmi_check_system(quirk_tuxeo_rp_d3_dmi_table)) {
		root_pdev = pcie_find_root_port(pdev);
		if (root_pdev)
			root_pdev->dev_flags |= PCI_DEV_FLAGS_NO_D3;
	}
}
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x1502, quirk_tuxeo_rp_d3);
#endif /* CONFIG_SUSPEND */