summarylogtreecommitdiffstats
path: root/suspend.patch
diff options
context:
space:
mode:
Diffstat (limited to 'suspend.patch')
-rw-r--r--suspend.patch429
1 files changed, 0 insertions, 429 deletions
diff --git a/suspend.patch b/suspend.patch
deleted file mode 100644
index b5af32b058c9..000000000000
--- a/suspend.patch
+++ /dev/null
@@ -1,429 +0,0 @@
-From 65ea8f2c6e230bdf71fed0137cf9e9d1b307db32 Mon Sep 17 00:00:00 2001
-From: Mario Limonciello <mario.limonciello@amd.com>
-Date: Wed, 12 May 2021 17:15:14 -0500
-Subject: ACPI: processor idle: Fix up C-state latency if not ordered
-
-Generally, the C-state latency is provided by the _CST method or
-FADT, but some OEM platforms using AMD Picasso, Renoir, Van Gogh,
-and Cezanne set the C2 latency greater than C3's which causes the
-C2 state to be skipped.
-
-That will block the core entering PC6, which prevents S0ix working
-properly on Linux systems.
-
-In other operating systems, the latency values are not validated and
-this does not cause problems by skipping states.
-
-To avoid this issue on Linux, detect when latencies are not an
-arithmetic progression and sort them.
-
-Link: https://gitlab.freedesktop.org/agd5f/linux/-/commit/026d186e4592c1ee9c1cb44295912d0294508725
-Link: https://gitlab.freedesktop.org/drm/amd/-/issues/1230#note_712174
-Suggested-by: Prike Liang <Prike.Liang@amd.com>
-Suggested-by: Alex Deucher <alexander.deucher@amd.com>
-Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
-[ rjw: Subject and changelog edits ]
-Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
----
- drivers/acpi/processor_idle.c | 40 ++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 40 insertions(+)
-
-diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
-index 45a019619e4a5..095c8aca141eb 100644
---- a/drivers/acpi/processor_idle.c
-+++ b/drivers/acpi/processor_idle.c
-@@ -16,6 +16,7 @@
- #include <linux/acpi.h>
- #include <linux/dmi.h>
- #include <linux/sched.h> /* need_resched() */
-+#include <linux/sort.h>
- #include <linux/tick.h>
- #include <linux/cpuidle.h>
- #include <linux/cpu.h>
-@@ -384,10 +385,37 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr,
- return;
- }
-
-+static int acpi_cst_latency_cmp(const void *a, const void *b)
-+{
-+ const struct acpi_processor_cx *x = a, *y = b;
-+
-+ if (!(x->valid && y->valid))
-+ return 0;
-+ if (x->latency > y->latency)
-+ return 1;
-+ if (x->latency < y->latency)
-+ return -1;
-+ return 0;
-+}
-+static void acpi_cst_latency_swap(void *a, void *b, int n)
-+{
-+ struct acpi_processor_cx *x = a, *y = b;
-+ u32 tmp;
-+
-+ if (!(x->valid && y->valid))
-+ return;
-+ tmp = x->latency;
-+ x->latency = y->latency;
-+ y->latency = tmp;
-+}
-+
- static int acpi_processor_power_verify(struct acpi_processor *pr)
- {
- unsigned int i;
- unsigned int working = 0;
-+ unsigned int last_latency = 0;
-+ unsigned int last_type = 0;
-+ bool buggy_latency = false;
-
- pr->power.timer_broadcast_on_state = INT_MAX;
-
-@@ -411,12 +439,24 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
- }
- if (!cx->valid)
- continue;
-+ if (cx->type >= last_type && cx->latency < last_latency)
-+ buggy_latency = true;
-+ last_latency = cx->latency;
-+ last_type = cx->type;
-
- lapic_timer_check_state(i, pr, cx);
- tsc_check_state(cx->type);
- working++;
- }
-
-+ if (buggy_latency) {
-+ pr_notice("FW issue: working around C-state latencies out of order\n");
-+ sort(&pr->power.states[1], max_cstate,
-+ sizeof(struct acpi_processor_cx),
-+ acpi_cst_latency_cmp,
-+ acpi_cst_latency_swap);
-+ }
-+
- lapic_timer_propagate_broadcast(pr);
-
- return (working);
---
-cgit 1.2.3-1.el7
-
-diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
-index 7bc18cf8042c..18c2bbddf080 100644
---- a/drivers/usb/host/xhci-pci.c
-+++ b/drivers/usb/host/xhci-pci.c
-@@ -59,6 +59,7 @@
- #define PCI_DEVICE_ID_INTEL_MAPLE_RIDGE_XHCI 0x1138
- #define PCI_DEVICE_ID_INTEL_ALDER_LAKE_XHCI 0x461e
-
-+#define PCI_DEVICE_ID_AMD_RENOIR_XHCI 0x1639
- #define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9
- #define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba
- #define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb
-@@ -182,6 +183,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
- (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_1)))
- xhci->quirks |= XHCI_U2_DISABLE_WAKE;
-
-+ if (pdev->vendor == PCI_VENDOR_ID_AMD &&
-+ pdev->device == PCI_DEVICE_ID_AMD_RENOIR_XHCI)
-+ xhci->quirks |= XHCI_BROKEN_D3COLD;
-+
- if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
- xhci->quirks |= XHCI_LPM_SUPPORT;
- xhci->quirks |= XHCI_INTEL_HOST;
-@@ -539,7 +544,7 @@ static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup)
- * Systems with the TI redriver that loses port status change events
- * need to have the registers polled during D3, so avoid D3cold.
- */
-- if (xhci->quirks & XHCI_COMP_MODE_QUIRK)
-+ if (xhci->quirks & (XHCI_COMP_MODE_QUIRK | XHCI_BROKEN_D3COLD))
- pci_d3cold_disable(pdev);
-
- if (xhci->quirks & XHCI_PME_STUCK_QUIRK)
-diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
-index 2595a8f057c4..e417f5ce13d1 100644
---- a/drivers/usb/host/xhci.h
-+++ b/drivers/usb/host/xhci.h
-@@ -1892,6 +1892,7 @@ struct xhci_hcd {
- #define XHCI_DISABLE_SPARSE BIT_ULL(38)
- #define XHCI_SG_TRB_CACHE_SIZE_QUIRK BIT_ULL(39)
- #define XHCI_NO_SOFT_RETRY BIT_ULL(40)
-+#define XHCI_BROKEN_D3COLD BIT_ULL(41)
-
- unsigned int num_active_eps;
- unsigned int limit_active_eps;
-diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
-index 653660e3ba9e..36e5ec670fae 100644
---- a/drivers/pci/quirks.c
-+++ b/drivers/pci/quirks.c
-@@ -1904,6 +1904,9 @@ static void quirk_ryzen_xhci_d3hot(struct pci_dev *dev)
- }
- DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x15e0, quirk_ryzen_xhci_d3hot);
- DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x15e1, quirk_ryzen_xhci_d3hot);
-+/* Renoir XHCI requires longer delay when transitioning from D0 to
-+ * D3hot */
-+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x1639, quirk_ryzen_xhci_d3hot);
-
- #ifdef CONFIG_X86_IO_APIC
- static int dmi_disable_ioapicreroute(const struct dmi_system_id *d)
-X-Git-Url: http://git.infradead.org/nvme.git/blobdiff_plain/ebd8a93aa4f50e9e013e6aa7fe601b4ce7565c28..e21e0243e7b0f1c2a21d21f4d115f7b37175772a:/drivers/nvme/host/pci.c
-
-diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
-index a29b170701fc..3aa7245a505f 100644
---- a/drivers/nvme/host/pci.c
-+++ b/drivers/nvme/host/pci.c
-@@ -2831,10 +2831,7 @@ static unsigned long check_vendor_combination_bug(struct pci_dev *pdev)
- #ifdef CONFIG_ACPI
- static bool nvme_acpi_storage_d3(struct pci_dev *dev)
- {
-- struct acpi_device *adev;
-- struct pci_dev *root;
-- acpi_handle handle;
-- acpi_status status;
-+ struct acpi_device *adev = ACPI_COMPANION(&dev->dev);
- u8 val;
-
- /*
-@@ -2842,28 +2839,9 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev)
- * must use D3 to support deep platform power savings during
- * suspend-to-idle.
- */
-- root = pcie_find_root_port(dev);
-- if (!root)
-- return false;
-
-- adev = ACPI_COMPANION(&root->dev);
- if (!adev)
- return false;
--
-- /*
-- * The property is defined in the PXSX device for South complex ports
-- * and in the PEGP device for North complex ports.
-- */
-- status = acpi_get_handle(adev->handle, "PXSX", &handle);
-- if (ACPI_FAILURE(status)) {
-- status = acpi_get_handle(adev->handle, "PEGP", &handle);
-- if (ACPI_FAILURE(status))
-- return false;
-- }
--
-- if (acpi_bus_get_device(handle, &adev))
-- return false;
--
- if (fwnode_property_read_u8(acpi_fwnode_handle(adev), "StorageD3Enable",
- &val))
- return false;
-diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c
-index d260bc1f3e6e..1edb68d00b8e 100644
---- a/drivers/acpi/device_pm.c
-+++ b/drivers/acpi/device_pm.c
-@@ -1340,4 +1340,29 @@ int acpi_dev_pm_attach(struct device *dev, bool power_on)
- return 1;
- }
- EXPORT_SYMBOL_GPL(acpi_dev_pm_attach);
-+
-+/**
-+ * acpi_storage_d3 - Check if a storage device should use D3.
-+ * @dev: Device to check
-+ *
-+ * Returns %true if @dev should be put into D3 when the ->suspend method is
-+ * called, else %false. The name of this function is somewhat misleading
-+ * as it has nothing to do with storage except for the name of the ACPI
-+ * property. On some platforms resume will not work if this hint is ignored.
-+ *
-+ */
-+bool acpi_storage_d3(struct device *dev)
-+{
-+ struct acpi_device *adev = ACPI_COMPANION(dev);
-+ u8 val;
-+
-+ if (!adev)
-+ return false;
-+ if (fwnode_property_read_u8(acpi_fwnode_handle(adev), "StorageD3Enable",
-+ &val))
-+ return false;
-+ return val == 1;
-+}
-+EXPORT_SYMBOL_GPL(acpi_storage_d3);
-+
- #endif /* CONFIG_PM */
-diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
-index 3aa7245a505f..8fbc4c87a0d8 100644
---- a/drivers/nvme/host/pci.c
-+++ b/drivers/nvme/host/pci.c
-@@ -2828,32 +2828,6 @@ static unsigned long check_vendor_combination_bug(struct pci_dev *pdev)
- return 0;
- }
-
--#ifdef CONFIG_ACPI
--static bool nvme_acpi_storage_d3(struct pci_dev *dev)
--{
-- struct acpi_device *adev = ACPI_COMPANION(&dev->dev);
-- u8 val;
--
-- /*
-- * Look for _DSD property specifying that the storage device on the port
-- * must use D3 to support deep platform power savings during
-- * suspend-to-idle.
-- */
--
-- if (!adev)
-- return false;
-- if (fwnode_property_read_u8(acpi_fwnode_handle(adev), "StorageD3Enable",
-- &val))
-- return false;
-- return val == 1;
--}
--#else
--static inline bool nvme_acpi_storage_d3(struct pci_dev *dev)
--{
-- return false;
--}
--#endif /* CONFIG_ACPI */
--
- static void nvme_async_probe(void *data, async_cookie_t cookie)
- {
- struct nvme_dev *dev = data;
-@@ -2903,7 +2877,7 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)
-
- quirks |= check_vendor_combination_bug(pdev);
-
-- if (!noacpi && nvme_acpi_storage_d3(pdev)) {
-+ if (!noacpi && acpi_storage_d3(&pdev->dev)) {
- /*
- * Some systems use a bios work around to ask for D3 on
- * platforms that support kernel managed suspend.
-diff --git a/include/linux/acpi.h b/include/linux/acpi.h
-index c60745f657e9..dd0dafd21e33 100644
---- a/include/linux/acpi.h
-+++ b/include/linux/acpi.h
-@@ -1004,6 +1004,7 @@ int acpi_dev_resume(struct device *dev);
- int acpi_subsys_runtime_suspend(struct device *dev);
- int acpi_subsys_runtime_resume(struct device *dev);
- int acpi_dev_pm_attach(struct device *dev, bool power_on);
-+bool acpi_storage_d3(struct device *dev);
- #else
- static inline int acpi_subsys_runtime_suspend(struct device *dev) { return 0; }
- static inline int acpi_subsys_runtime_resume(struct device *dev) { return 0; }
-@@ -1011,6 +1012,10 @@ static inline int acpi_dev_pm_attach(struct device *dev, bool power_on)
- {
- return 0;
- }
-+static inline bool acpi_storage_d3(struct device *dev)
-+{
-+ return false;
-+}
- #endif
-
- #if defined(CONFIG_ACPI) && defined(CONFIG_PM_SLEEP)
-diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c
-index 1edb68d00b8e..8fd2a15bf478 100644
---- a/drivers/acpi/device_pm.c
-+++ b/drivers/acpi/device_pm.c
-@@ -20,6 +20,10 @@
- #include <linux/pm_runtime.h>
- #include <linux/suspend.h>
-
-+#ifdef CONFIG_X86
-+#include <asm/cpu_device_id.h>
-+#endif
-+
- #include "internal.h"
-
- /**
-@@ -1341,6 +1345,15 @@ int acpi_dev_pm_attach(struct device *dev, bool power_on)
- }
- EXPORT_SYMBOL_GPL(acpi_dev_pm_attach);
-
-+
-+#ifdef CONFIG_X86
-+static const struct x86_cpu_id storage_d3_cpu_ids[] = {
-+ X86_MATCH_VENDOR_FAM_MODEL(AMD, 23, 96, NULL), /* Renoir */
-+ X86_MATCH_VENDOR_FAM_MODEL(AMD, 23, 104, NULL), /* Lucienne */
-+ {}
-+};
-+#endif
-+
- /**
- * acpi_storage_d3 - Check if a storage device should use D3.
- * @dev: Device to check
-@@ -1356,6 +1369,12 @@ bool acpi_storage_d3(struct device *dev)
- struct acpi_device *adev = ACPI_COMPANION(dev);
- u8 val;
-
-+#ifdef CONFIG_X86
-+ /* Devices requiring D3, but from before StorageD3Enable was "standardized" */
-+ if (x86_match_cpu(storage_d3_cpu_ids))
-+ return true;
-+#endif
-+
- if (!adev)
- return false;
- if (fwnode_property_read_u8(acpi_fwnode_handle(adev), "StorageD3Enable",
-From f59a905b962c34642e862b5edec35c0eda72d70d Mon Sep 17 00:00:00 2001
-From: Alex Deucher <alexander.deucher@amd.com>
-Date: Wed, 5 May 2021 09:20:32 -0400
-Subject: ACPI: PM: s2idle: Add missing LPS0 functions for AMD
-
-These are supposedly not required for AMD platforms,
-but at least some HP laptops seem to require it to
-properly turn off the keyboard backlight.
-
-Based on a patch from Marcin Bachry <hegel666@gmail.com>.
-
-Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1230
-Reviewed-by: Hans de Goede <hdegoede@redhat.com>
-Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
----
- drivers/acpi/x86/s2idle.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c
-index 2b69536cdccba..2d7ddb8a8cb65 100644
---- a/drivers/acpi/x86/s2idle.c
-+++ b/drivers/acpi/x86/s2idle.c
-@@ -42,6 +42,8 @@ static const struct acpi_device_id lps0_device_ids[] = {
-
- /* AMD */
- #define ACPI_LPS0_DSM_UUID_AMD "e3f32452-febc-43ce-9039-932122d37721"
-+#define ACPI_LPS0_ENTRY_AMD 2
-+#define ACPI_LPS0_EXIT_AMD 3
- #define ACPI_LPS0_SCREEN_OFF_AMD 4
- #define ACPI_LPS0_SCREEN_ON_AMD 5
-
-@@ -408,6 +410,7 @@ int acpi_s2idle_prepare_late(void)
-
- if (acpi_s2idle_vendor_amd()) {
- acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF_AMD);
-+ acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY_AMD);
- } else {
- acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF);
- acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY);
-@@ -422,6 +425,7 @@ void acpi_s2idle_restore_early(void)
- return;
-
- if (acpi_s2idle_vendor_amd()) {
-+ acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT_AMD);
- acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON_AMD);
- } else {
- acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT);
---
-cgit 1.2.3-1.el7
-
-diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c
-index 2d7ddb8a8cb6..482e6b23b21a 100644
---- a/drivers/acpi/x86/s2idle.c
-+++ b/drivers/acpi/x86/s2idle.c
-@@ -368,6 +368,13 @@ static int lps0_device_attach(struct acpi_device *adev,
-
- ACPI_FREE(out_obj);
-
-+ /*
-+ * Some HP laptops require ACPI_LPS0_ENTRY_AMD/ACPI_LPS0_EXIT_AMD for proper
-+ * S0ix, but don't set the function mask correctly. Fix that up here.
-+ */
-+ if (acpi_s2idle_vendor_amd())
-+ lps0_dsm_func_mask |= (1 << ACPI_LPS0_ENTRY_AMD) | (1 << ACPI_LPS0_EXIT_AMD);
-+
- acpi_handle_debug(adev->handle, "_DSM function mask: 0x%x\n",
- lps0_dsm_func_mask);
-