2021-07-02 12:50:26 +00:00
|
|
|
From 3a7422993f0471af14c1a92493659fe2196e1619 Mon Sep 17 00:00:00 2001
|
2021-06-19 19:58:38 +00:00
|
|
|
From: Mario Limonciello <mario.limonciello@amd.com>
|
|
|
|
Date: Wed, 12 May 2021 17:15:14 -0500
|
|
|
|
Subject: [PATCH] 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>
|
|
|
|
Patchset: s0ix-amd
|
|
|
|
---
|
|
|
|
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 4e2d76b8b697..6790df5a2462 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>
|
|
|
|
@@ -388,10 +389,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;
|
|
|
|
|
|
|
|
@@ -415,12 +443,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);
|
|
|
|
--
|
|
|
|
2.32.0
|
|
|
|
|
2021-07-02 12:50:26 +00:00
|
|
|
From 07ee2c4f1c48d74d7971dd017df43edd95582898 Mon Sep 17 00:00:00 2001
|
2021-06-19 19:58:38 +00:00
|
|
|
From: Marcin Bachry <hegel666@gmail.com>
|
|
|
|
Date: Tue, 16 Mar 2021 15:28:51 -0400
|
|
|
|
Subject: [PATCH] PCI: quirks: Quirk PCI d3hot delay for AMD xhci
|
|
|
|
|
|
|
|
Renoir needs a similar delay.
|
|
|
|
|
|
|
|
Signed-off-by: Marcin Bachry <hegel666@gmail.com>
|
|
|
|
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
|
|
|
Patchset: s0ix-amd
|
|
|
|
---
|
|
|
|
drivers/pci/quirks.c | 3 +++
|
|
|
|
1 file changed, 3 insertions(+)
|
|
|
|
|
|
|
|
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
|
2021-06-29 12:47:26 +00:00
|
|
|
index 7bf76bca888d..8e70605666d4 100644
|
2021-06-19 19:58:38 +00:00
|
|
|
--- 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)
|
|
|
|
--
|
|
|
|
2.32.0
|
|
|
|
|
2021-07-02 12:50:26 +00:00
|
|
|
From 5dd9cee2331182d21222220425e1f4d354f4342f Mon Sep 17 00:00:00 2001
|
2021-06-19 19:58:38 +00:00
|
|
|
From: Mario Limonciello <mario.limonciello@amd.com>
|
|
|
|
Date: Fri, 28 May 2021 11:02:34 -0500
|
|
|
|
Subject: [PATCH] nvme-pci: look for StorageD3Enable on companion ACPI device
|
|
|
|
instead
|
|
|
|
|
|
|
|
The documentation around the StorageD3Enable property hints that it
|
|
|
|
should be made on the PCI device. This is where newer AMD systems set
|
|
|
|
the property and it's required for S0i3 support.
|
|
|
|
|
|
|
|
So rather than look for nodes of the root port only present on Intel
|
|
|
|
systems, switch to the companion ACPI device for all systems.
|
|
|
|
David Box from Intel indicated this should work on Intel as well.
|
|
|
|
|
|
|
|
Link: https://lore.kernel.org/linux-nvme/YK6gmAWqaRmvpJXb@google.com/T/#m900552229fa455867ee29c33b854845fce80ba70
|
|
|
|
Link: https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/power-management-for-storage-hardware-devices-intro
|
|
|
|
Fixes: df4f9bc4fb9c ("nvme-pci: add support for ACPI StorageD3Enable property")
|
|
|
|
Suggested-by: Liang Prike <Prike.Liang@amd.com>
|
|
|
|
Acked-by: Raul E Rangel <rrangel@chromium.org>
|
|
|
|
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
|
|
|
|
Reviewed-by: David E. Box <david.e.box@linux.intel.com>
|
|
|
|
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
|
|
|
Patchset: s0ix-amd
|
|
|
|
---
|
|
|
|
drivers/nvme/host/pci.c | 24 +-----------------------
|
|
|
|
1 file changed, 1 insertion(+), 23 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
|
|
|
|
index c92a15c3fbc5..60c1c83e03fa 100644
|
|
|
|
--- a/drivers/nvme/host/pci.c
|
|
|
|
+++ b/drivers/nvme/host/pci.c
|
|
|
|
@@ -2834,10 +2834,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;
|
|
|
|
|
|
|
|
/*
|
|
|
|
@@ -2845,28 +2842,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;
|
|
|
|
--
|
|
|
|
2.32.0
|
|
|
|
|
2021-07-02 12:50:26 +00:00
|
|
|
From c5039db994a0f6de250b3039bd94d2e610f66ab7 Mon Sep 17 00:00:00 2001
|
2021-06-19 19:58:38 +00:00
|
|
|
From: Mario Limonciello <mario.limonciello@amd.com>
|
|
|
|
Date: Wed, 9 Jun 2021 13:40:17 -0500
|
|
|
|
Subject: [PATCH] ACPI: Check StorageD3Enable _DSD property in ACPI code
|
|
|
|
|
|
|
|
Although first implemented for NVME, this check may be usable by
|
|
|
|
other drivers as well. Microsoft's specification explicitly mentions
|
|
|
|
that is may be usable by SATA and AHCI devices. Google also indicates
|
|
|
|
that they have used this with SDHCI in a downstream kernel tree that
|
|
|
|
a user can plug a storage device into.
|
|
|
|
|
|
|
|
Link: https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/power-management-for-storage-hardware-devices-intro
|
|
|
|
Suggested-by: Keith Busch <kbusch@kernel.org>
|
|
|
|
CC: Shyam-sundar S-k <Shyam-sundar.S-k@amd.com>
|
|
|
|
CC: Alexander Deucher <Alexander.Deucher@amd.com>
|
|
|
|
CC: Rafael J. Wysocki <rjw@rjwysocki.net>
|
|
|
|
CC: Prike Liang <prike.liang@amd.com>
|
|
|
|
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
|
|
|
|
Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
|
|
|
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
|
|
|
Patchset: s0ix-amd
|
|
|
|
---
|
|
|
|
drivers/acpi/device_pm.c | 29 +++++++++++++++++++++++++++++
|
|
|
|
drivers/nvme/host/pci.c | 28 +---------------------------
|
|
|
|
include/linux/acpi.h | 5 +++++
|
|
|
|
3 files changed, 35 insertions(+), 27 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c
|
|
|
|
index 58876248b192..1e278785c7db 100644
|
|
|
|
--- a/drivers/acpi/device_pm.c
|
|
|
|
+++ b/drivers/acpi/device_pm.c
|
|
|
|
@@ -1337,4 +1337,33 @@ 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 D3 should be used in the suspend path
|
|
|
|
+ * @dev: Device to check
|
|
|
|
+ *
|
|
|
|
+ * Return %true if the platform firmware wants @dev to be programmed
|
|
|
|
+ * into D3hot or D3cold (if supported) in the suspend path, or %false
|
|
|
|
+ * when there is no specific preference. On some platforms, if this
|
|
|
|
+ * hint is ignored, @dev may remain unresponsive after suspending the
|
|
|
|
+ * platform as a whole.
|
|
|
|
+ *
|
|
|
|
+ * Although the property has storage in the name it actually is
|
|
|
|
+ * applied to the PCIe slot and plugging in a non-storage device the
|
|
|
|
+ * same platform restrictions will likely apply.
|
|
|
|
+ */
|
|
|
|
+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 60c1c83e03fa..8593161d4da0 100644
|
|
|
|
--- a/drivers/nvme/host/pci.c
|
|
|
|
+++ b/drivers/nvme/host/pci.c
|
|
|
|
@@ -2831,32 +2831,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;
|
|
|
|
@@ -2906,7 +2880,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 07a0044397e1..1997fc6589b9 100644
|
|
|
|
--- a/include/linux/acpi.h
|
|
|
|
+++ b/include/linux/acpi.h
|
|
|
|
@@ -1001,6 +1001,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; }
|
|
|
|
@@ -1008,6 +1009,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)
|
|
|
|
--
|
|
|
|
2.32.0
|
|
|
|
|
2021-07-02 12:50:26 +00:00
|
|
|
From f130be1f855c90db03b7926a87a3f53ebcfb9e81 Mon Sep 17 00:00:00 2001
|
2021-06-19 19:58:38 +00:00
|
|
|
From: Mario Limonciello <mario.limonciello@amd.com>
|
|
|
|
Date: Wed, 9 Jun 2021 13:40:18 -0500
|
|
|
|
Subject: [PATCH] ACPI: Add quirks for AMD Renoir/Lucienne CPUs to force the D3
|
|
|
|
hint
|
|
|
|
|
|
|
|
AMD systems from Renoir and Lucienne require that the NVME controller
|
|
|
|
is put into D3 over a Modern Standby / suspend-to-idle
|
|
|
|
cycle. This is "typically" accomplished using the `StorageD3Enable`
|
|
|
|
property in the _DSD, but this property was introduced after many
|
|
|
|
of these systems launched and most OEM systems don't have it in
|
|
|
|
their BIOS.
|
|
|
|
|
|
|
|
On AMD Renoir without these drives going into D3 over suspend-to-idle
|
|
|
|
the resume will fail with the NVME controller being reset and a trace
|
|
|
|
like this in the kernel logs:
|
|
|
|
```
|
|
|
|
[ 83.556118] nvme nvme0: I/O 161 QID 2 timeout, aborting
|
|
|
|
[ 83.556178] nvme nvme0: I/O 162 QID 2 timeout, aborting
|
|
|
|
[ 83.556187] nvme nvme0: I/O 163 QID 2 timeout, aborting
|
|
|
|
[ 83.556196] nvme nvme0: I/O 164 QID 2 timeout, aborting
|
|
|
|
[ 95.332114] nvme nvme0: I/O 25 QID 0 timeout, reset controller
|
|
|
|
[ 95.332843] nvme nvme0: Abort status: 0x371
|
|
|
|
[ 95.332852] nvme nvme0: Abort status: 0x371
|
|
|
|
[ 95.332856] nvme nvme0: Abort status: 0x371
|
|
|
|
[ 95.332859] nvme nvme0: Abort status: 0x371
|
|
|
|
[ 95.332909] PM: dpm_run_callback(): pci_pm_resume+0x0/0xe0 returns -16
|
|
|
|
[ 95.332936] nvme 0000:03:00.0: PM: failed to resume async: error -16
|
|
|
|
```
|
|
|
|
|
|
|
|
The Microsoft documentation for StorageD3Enable mentioned that Windows has
|
|
|
|
a hardcoded allowlist for D3 support, which was used for these platforms.
|
|
|
|
Introduce quirks to hardcode them for Linux as well.
|
|
|
|
|
|
|
|
As this property is now "standardized", OEM systems using AMD Cezanne and
|
|
|
|
newer APU's have adopted this property, and quirks like this should not be
|
|
|
|
necessary.
|
|
|
|
|
|
|
|
CC: Shyam-sundar S-k <Shyam-sundar.S-k@amd.com>
|
|
|
|
CC: Alexander Deucher <Alexander.Deucher@amd.com>
|
|
|
|
CC: Prike Liang <prike.liang@amd.com>
|
|
|
|
Link: https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/power-management-for-storage-hardware-devices-intro
|
|
|
|
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
|
|
|
|
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
|
|
|
Tested-by: Julian Sikorski <belegdol@gmail.com>
|
|
|
|
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
|
|
|
Patchset: s0ix-amd
|
|
|
|
---
|
|
|
|
drivers/acpi/device_pm.c | 3 +++
|
|
|
|
drivers/acpi/internal.h | 9 +++++++++
|
|
|
|
drivers/acpi/x86/utils.c | 25 +++++++++++++++++++++++++
|
|
|
|
3 files changed, 37 insertions(+)
|
|
|
|
|
|
|
|
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c
|
|
|
|
index 1e278785c7db..28f629a3d95c 100644
|
|
|
|
--- a/drivers/acpi/device_pm.c
|
|
|
|
+++ b/drivers/acpi/device_pm.c
|
|
|
|
@@ -1357,6 +1357,9 @@ bool acpi_storage_d3(struct device *dev)
|
|
|
|
struct acpi_device *adev = ACPI_COMPANION(dev);
|
|
|
|
u8 val;
|
|
|
|
|
|
|
|
+ if (force_storage_d3())
|
|
|
|
+ return true;
|
|
|
|
+
|
|
|
|
if (!adev)
|
|
|
|
return false;
|
|
|
|
if (fwnode_property_read_u8(acpi_fwnode_handle(adev), "StorageD3Enable",
|
|
|
|
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
|
|
|
|
index cb8f70842249..96471be3f0c8 100644
|
|
|
|
--- a/drivers/acpi/internal.h
|
|
|
|
+++ b/drivers/acpi/internal.h
|
|
|
|
@@ -236,6 +236,15 @@ static inline int suspend_nvs_save(void) { return 0; }
|
|
|
|
static inline void suspend_nvs_restore(void) {}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
+#ifdef CONFIG_X86
|
|
|
|
+bool force_storage_d3(void);
|
|
|
|
+#else
|
|
|
|
+static inline bool force_storage_d3(void)
|
|
|
|
+{
|
|
|
|
+ return false;
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
Device properties
|
|
|
|
-------------------------------------------------------------------------- */
|
|
|
|
diff --git a/drivers/acpi/x86/utils.c b/drivers/acpi/x86/utils.c
|
|
|
|
index bdc1ba00aee9..5298bb4d81fe 100644
|
|
|
|
--- a/drivers/acpi/x86/utils.c
|
|
|
|
+++ b/drivers/acpi/x86/utils.c
|
|
|
|
@@ -135,3 +135,28 @@ bool acpi_device_always_present(struct acpi_device *adev)
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * AMD systems from Renoir and Lucienne *require* that the NVME controller
|
|
|
|
+ * is put into D3 over a Modern Standby / suspend-to-idle cycle.
|
|
|
|
+ *
|
|
|
|
+ * This is "typically" accomplished using the `StorageD3Enable`
|
|
|
|
+ * property in the _DSD that is checked via the `acpi_storage_d3` function
|
|
|
|
+ * but this property was introduced after many of these systems launched
|
|
|
|
+ * and most OEM systems don't have it in their BIOS.
|
|
|
|
+ *
|
|
|
|
+ * The Microsoft documentation for StorageD3Enable mentioned that Windows has
|
|
|
|
+ * a hardcoded allowlist for D3 support, which was used for these platforms.
|
|
|
|
+ *
|
|
|
|
+ * This allows quirking on Linux in a similar fashion.
|
|
|
|
+ */
|
|
|
|
+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 */
|
|
|
|
+ {}
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+bool force_storage_d3(void)
|
|
|
|
+{
|
|
|
|
+ return x86_match_cpu(storage_d3_cpu_ids);
|
|
|
|
+}
|
|
|
|
--
|
|
|
|
2.32.0
|
|
|
|
|
2021-07-02 12:50:26 +00:00
|
|
|
From 82b63c1e1ee410922d54592397aadc2ba9738915 Mon Sep 17 00:00:00 2001
|
2021-06-19 19:58:38 +00:00
|
|
|
From: Alex Deucher <alexander.deucher@amd.com>
|
|
|
|
Date: Wed, 5 May 2021 09:20:32 -0400
|
|
|
|
Subject: [PATCH] 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>
|
|
|
|
Patchset: s0ix-amd
|
|
|
|
---
|
|
|
|
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 2b69536cdccb..2d7ddb8a8cb6 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);
|
|
|
|
--
|
|
|
|
2.32.0
|
|
|
|
|
2021-07-02 12:50:26 +00:00
|
|
|
From 7d78ab3e4a44be78c5ef67a1b49632084527656f Mon Sep 17 00:00:00 2001
|
2021-06-19 19:58:38 +00:00
|
|
|
From: Alex Deucher <alexander.deucher@amd.com>
|
|
|
|
Date: Wed, 17 Mar 2021 10:38:42 -0400
|
|
|
|
Subject: [PATCH] platform/x86: force LPS0 functions for AMD
|
|
|
|
|
|
|
|
ACPI_LPS0_ENTRY_AMD/ACPI_LPS0_EXIT_AMD are supposedly not
|
|
|
|
required for AMD platforms, and on some platforms they are
|
|
|
|
not even listed in the function mask but at least some HP
|
|
|
|
laptops seem to require it to properly support s0ix.
|
|
|
|
|
|
|
|
Based on a patch from Marcin Bachry <hegel666@gmail.com>.
|
|
|
|
|
|
|
|
Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1230
|
|
|
|
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
|
|
|
Cc: Marcin Bachry <hegel666@gmail.com>
|
|
|
|
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
|
|
|
|
Patchset: s0ix-amd
|
|
|
|
---
|
|
|
|
drivers/acpi/x86/s2idle.c | 7 +++++++
|
|
|
|
1 file changed, 7 insertions(+)
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
--
|
|
|
|
2.32.0
|
|
|
|
|
2021-07-02 12:50:26 +00:00
|
|
|
From 47c6565338ddb199d82a5407f04986eb20e4a28a Mon Sep 17 00:00:00 2001
|
2021-06-19 19:58:38 +00:00
|
|
|
From: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
|
|
|
|
Date: Thu, 17 Jun 2021 17:00:35 +0530
|
|
|
|
Subject: [PATCH] platform/x86: amd-pmc: Fix command completion code
|
|
|
|
|
|
|
|
The protocol to submit a job request to SMU is to wait for
|
|
|
|
AMD_PMC_REGISTER_RESPONSE to return 1,meaning SMU is ready to take
|
|
|
|
requests. PMC driver has to make sure that the response code is always
|
|
|
|
AMD_PMC_RESULT_OK before making any command submissions.
|
|
|
|
|
|
|
|
Also, when we submit a message to SMU, we have to wait until it processes
|
|
|
|
the request. Adding a read_poll_timeout() check as this was missing in
|
|
|
|
the existing code.
|
|
|
|
|
|
|
|
Fixes: 156ec4731cb2 ("platform/x86: amd-pmc: Add AMD platform support for S2Idle")
|
|
|
|
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
|
|
|
|
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
|
|
|
|
Patchset: s0ix-amd
|
|
|
|
---
|
|
|
|
drivers/platform/x86/amd-pmc.c | 10 +++++++++-
|
|
|
|
1 file changed, 9 insertions(+), 1 deletion(-)
|
|
|
|
|
|
|
|
diff --git a/drivers/platform/x86/amd-pmc.c b/drivers/platform/x86/amd-pmc.c
|
|
|
|
index 0b5578a8a449..535e431f98a8 100644
|
|
|
|
--- a/drivers/platform/x86/amd-pmc.c
|
|
|
|
+++ b/drivers/platform/x86/amd-pmc.c
|
|
|
|
@@ -140,7 +140,7 @@ static int amd_pmc_send_cmd(struct amd_pmc_dev *dev, bool set)
|
|
|
|
|
|
|
|
/* Wait until we get a valid response */
|
|
|
|
rc = readx_poll_timeout(ioread32, dev->regbase + AMD_PMC_REGISTER_RESPONSE,
|
|
|
|
- val, val > 0, PMC_MSG_DELAY_MIN_US,
|
|
|
|
+ val, val == AMD_PMC_RESULT_OK, PMC_MSG_DELAY_MIN_US,
|
|
|
|
PMC_MSG_DELAY_MIN_US * RESPONSE_REGISTER_LOOP_MAX);
|
|
|
|
if (rc) {
|
|
|
|
dev_err(dev->dev, "failed to talk to SMU\n");
|
|
|
|
@@ -156,6 +156,14 @@ static int amd_pmc_send_cmd(struct amd_pmc_dev *dev, bool set)
|
|
|
|
/* Write message ID to message ID register */
|
|
|
|
msg = (dev->cpu_id == AMD_CPU_ID_RN) ? MSG_OS_HINT_RN : MSG_OS_HINT_PCO;
|
|
|
|
amd_pmc_reg_write(dev, AMD_PMC_REGISTER_MESSAGE, msg);
|
|
|
|
+ /* Wait until we get a valid response */
|
|
|
|
+ rc = readx_poll_timeout(ioread32, dev->regbase + AMD_PMC_REGISTER_RESPONSE,
|
|
|
|
+ val, val == AMD_PMC_RESULT_OK, PMC_MSG_DELAY_MIN_US,
|
|
|
|
+ PMC_MSG_DELAY_MIN_US * RESPONSE_REGISTER_LOOP_MAX);
|
|
|
|
+ if (rc) {
|
|
|
|
+ dev_err(dev->dev, "SMU response timed out\n");
|
|
|
|
+ return rc;
|
|
|
|
+ }
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
--
|
|
|
|
2.32.0
|
|
|
|
|
2021-07-02 12:50:26 +00:00
|
|
|
From 95350e7ba7dc7866ede307c58f45296d3d8df5c1 Mon Sep 17 00:00:00 2001
|
2021-06-19 19:58:38 +00:00
|
|
|
From: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
|
|
|
|
Date: Thu, 17 Jun 2021 17:00:36 +0530
|
|
|
|
Subject: [PATCH] platform/x86: amd-pmc: Fix SMU firmware reporting mechanism
|
|
|
|
|
|
|
|
It was lately understood that the current mechanism available in the
|
|
|
|
driver to get SMU firmware info works only on internal SMU builds and
|
|
|
|
there is a separate way to get all the SMU logging counters (addressed
|
|
|
|
in the next patch). Hence remove all the smu info shown via debugfs as it
|
|
|
|
is no more useful.
|
|
|
|
|
|
|
|
Also, use dump registers routine only at one place i.e. after the command
|
|
|
|
submission to SMU is done.
|
|
|
|
|
|
|
|
Fixes: 156ec4731cb2 ("platform/x86: amd-pmc: Add AMD platform support for S2Idle")
|
|
|
|
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
|
|
|
|
Patchset: s0ix-amd
|
|
|
|
---
|
|
|
|
drivers/platform/x86/amd-pmc.c | 15 +--------------
|
|
|
|
1 file changed, 1 insertion(+), 14 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/drivers/platform/x86/amd-pmc.c b/drivers/platform/x86/amd-pmc.c
|
|
|
|
index 535e431f98a8..d32f0a0eeb9f 100644
|
|
|
|
--- a/drivers/platform/x86/amd-pmc.c
|
|
|
|
+++ b/drivers/platform/x86/amd-pmc.c
|
|
|
|
@@ -52,7 +52,6 @@
|
|
|
|
#define AMD_CPU_ID_PCO AMD_CPU_ID_RV
|
|
|
|
#define AMD_CPU_ID_CZN AMD_CPU_ID_RN
|
|
|
|
|
|
|
|
-#define AMD_SMU_FW_VERSION 0x0
|
|
|
|
#define PMC_MSG_DELAY_MIN_US 100
|
|
|
|
#define RESPONSE_REGISTER_LOOP_MAX 200
|
|
|
|
|
|
|
|
@@ -88,11 +87,6 @@ static inline void amd_pmc_reg_write(struct amd_pmc_dev *dev, int reg_offset, u3
|
|
|
|
#ifdef CONFIG_DEBUG_FS
|
|
|
|
static int smu_fw_info_show(struct seq_file *s, void *unused)
|
|
|
|
{
|
|
|
|
- struct amd_pmc_dev *dev = s->private;
|
|
|
|
- u32 value;
|
|
|
|
-
|
|
|
|
- value = ioread32(dev->smu_base + AMD_SMU_FW_VERSION);
|
|
|
|
- seq_printf(s, "SMU FW Info: %x\n", value);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
DEFINE_SHOW_ATTRIBUTE(smu_fw_info);
|
|
|
|
@@ -164,6 +158,7 @@ static int amd_pmc_send_cmd(struct amd_pmc_dev *dev, bool set)
|
|
|
|
dev_err(dev->dev, "SMU response timed out\n");
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
+ amd_pmc_dump_registers(dev);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
@@ -176,7 +171,6 @@ static int __maybe_unused amd_pmc_suspend(struct device *dev)
|
|
|
|
if (rc)
|
|
|
|
dev_err(pdev->dev, "suspend failed\n");
|
|
|
|
|
|
|
|
- amd_pmc_dump_registers(pdev);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
@@ -189,7 +183,6 @@ static int __maybe_unused amd_pmc_resume(struct device *dev)
|
|
|
|
if (rc)
|
|
|
|
dev_err(pdev->dev, "resume failed\n");
|
|
|
|
|
|
|
|
- amd_pmc_dump_registers(pdev);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
@@ -256,17 +249,11 @@ static int amd_pmc_probe(struct platform_device *pdev)
|
|
|
|
pci_dev_put(rdev);
|
|
|
|
base_addr = ((u64)base_addr_hi << 32 | base_addr_lo);
|
|
|
|
|
|
|
|
- dev->smu_base = devm_ioremap(dev->dev, base_addr, AMD_PMC_MAPPING_SIZE);
|
|
|
|
- if (!dev->smu_base)
|
|
|
|
- return -ENOMEM;
|
|
|
|
-
|
|
|
|
dev->regbase = devm_ioremap(dev->dev, base_addr + AMD_PMC_BASE_ADDR_OFFSET,
|
|
|
|
AMD_PMC_MAPPING_SIZE);
|
|
|
|
if (!dev->regbase)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
- amd_pmc_dump_registers(dev);
|
|
|
|
-
|
|
|
|
platform_set_drvdata(pdev, dev);
|
|
|
|
amd_pmc_dbgfs_register(dev);
|
|
|
|
return 0;
|
|
|
|
--
|
|
|
|
2.32.0
|
|
|
|
|
2021-07-02 12:50:26 +00:00
|
|
|
From 3c26a54d62e99ed2ce8a87f556d82db14722e80c Mon Sep 17 00:00:00 2001
|
2021-06-19 19:58:38 +00:00
|
|
|
From: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
|
|
|
|
Date: Thu, 17 Jun 2021 17:00:37 +0530
|
|
|
|
Subject: [PATCH] platform/x86: amd-pmc: Add support for logging SMU metrics
|
|
|
|
|
|
|
|
SMU provides a way to dump the s0ix debug statistics in the form of a
|
|
|
|
metrics table via a of set special mailbox commands.
|
|
|
|
|
|
|
|
Add support to the driver which can send these commands to SMU and expose
|
|
|
|
the information received via debugfs. The information contains the s0ix
|
|
|
|
entry/exit, active time of each IP block etc.
|
|
|
|
|
|
|
|
As a side note, SMU subsystem logging is not supported on Picasso based
|
|
|
|
SoC's.
|
|
|
|
|
|
|
|
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
|
|
|
|
Patchset: s0ix-amd
|
|
|
|
---
|
|
|
|
drivers/platform/x86/amd-pmc.c | 148 +++++++++++++++++++++++++++++++--
|
|
|
|
1 file changed, 140 insertions(+), 8 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/drivers/platform/x86/amd-pmc.c b/drivers/platform/x86/amd-pmc.c
|
|
|
|
index d32f0a0eeb9f..b5249fdeb95f 100644
|
|
|
|
--- a/drivers/platform/x86/amd-pmc.c
|
|
|
|
+++ b/drivers/platform/x86/amd-pmc.c
|
|
|
|
@@ -46,6 +46,14 @@
|
|
|
|
#define AMD_PMC_RESULT_CMD_UNKNOWN 0xFE
|
|
|
|
#define AMD_PMC_RESULT_FAILED 0xFF
|
|
|
|
|
|
|
|
+/* SMU Message Definations */
|
|
|
|
+#define SMU_MSG_GETSMUVERSION 0x02
|
|
|
|
+#define SMU_MSG_LOG_GETDRAM_ADDR_HI 0x04
|
|
|
|
+#define SMU_MSG_LOG_GETDRAM_ADDR_LO 0x05
|
|
|
|
+#define SMU_MSG_LOG_START 0x06
|
|
|
|
+#define SMU_MSG_LOG_RESET 0x07
|
|
|
|
+#define SMU_MSG_LOG_DUMP_DATA 0x08
|
|
|
|
+#define SMU_MSG_GET_SUP_CONSTRAINTS 0x09
|
|
|
|
/* List of supported CPU ids */
|
|
|
|
#define AMD_CPU_ID_RV 0x15D0
|
|
|
|
#define AMD_CPU_ID_RN 0x1630
|
|
|
|
@@ -55,17 +63,42 @@
|
|
|
|
#define PMC_MSG_DELAY_MIN_US 100
|
|
|
|
#define RESPONSE_REGISTER_LOOP_MAX 200
|
|
|
|
|
|
|
|
+#define SOC_SUBSYSTEM_IP_MAX 12
|
|
|
|
+#define DELAY_MIN_US 2000
|
|
|
|
+#define DELAY_MAX_US 3000
|
|
|
|
enum amd_pmc_def {
|
|
|
|
MSG_TEST = 0x01,
|
|
|
|
MSG_OS_HINT_PCO,
|
|
|
|
MSG_OS_HINT_RN,
|
|
|
|
};
|
|
|
|
|
|
|
|
+struct amd_pmc_bit_map {
|
|
|
|
+ const char *name;
|
|
|
|
+ u32 bit_mask;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static const struct amd_pmc_bit_map soc15_ip_blk[] = {
|
|
|
|
+ {"DISPLAY", BIT(0)},
|
|
|
|
+ {"CPU", BIT(1)},
|
|
|
|
+ {"GFX", BIT(2)},
|
|
|
|
+ {"VDD", BIT(3)},
|
|
|
|
+ {"ACP", BIT(4)},
|
|
|
|
+ {"VCN", BIT(5)},
|
|
|
|
+ {"ISP", BIT(6)},
|
|
|
|
+ {"NBIO", BIT(7)},
|
|
|
|
+ {"DF", BIT(8)},
|
|
|
|
+ {"USB0", BIT(9)},
|
|
|
|
+ {"USB1", BIT(10)},
|
|
|
|
+ {"LAPIC", BIT(11)},
|
|
|
|
+ {}
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
struct amd_pmc_dev {
|
|
|
|
void __iomem *regbase;
|
|
|
|
- void __iomem *smu_base;
|
|
|
|
+ void __iomem *smu_virt_addr;
|
|
|
|
u32 base_addr;
|
|
|
|
u32 cpu_id;
|
|
|
|
+ u32 active_ips;
|
|
|
|
struct device *dev;
|
|
|
|
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
|
|
|
struct dentry *dbgfs_dir;
|
|
|
|
@@ -73,6 +106,7 @@ struct amd_pmc_dev {
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct amd_pmc_dev pmc;
|
|
|
|
+static int amd_pmc_send_cmd(struct amd_pmc_dev *dev, bool set, u32 *data, u8 msg, bool ret);
|
|
|
|
|
|
|
|
static inline u32 amd_pmc_reg_read(struct amd_pmc_dev *dev, int reg_offset)
|
|
|
|
{
|
|
|
|
@@ -84,9 +118,50 @@ static inline void amd_pmc_reg_write(struct amd_pmc_dev *dev, int reg_offset, u3
|
|
|
|
iowrite32(val, dev->regbase + reg_offset);
|
|
|
|
}
|
|
|
|
|
|
|
|
+struct smu_metrics {
|
|
|
|
+ u32 table_version;
|
|
|
|
+ u32 hint_count;
|
|
|
|
+ u32 s0i3_cyclecount;
|
|
|
|
+ u32 timein_s0i2;
|
|
|
|
+ u64 timeentering_s0i3_lastcapture;
|
|
|
|
+ u64 timeentering_s0i3_totaltime;
|
|
|
|
+ u64 timeto_resume_to_os_lastcapture;
|
|
|
|
+ u64 timeto_resume_to_os_totaltime;
|
|
|
|
+ u64 timein_s0i3_lastcapture;
|
|
|
|
+ u64 timein_s0i3_totaltime;
|
|
|
|
+ u64 timein_swdrips_lastcapture;
|
|
|
|
+ u64 timein_swdrips_totaltime;
|
|
|
|
+ u64 timecondition_notmet_lastcapture[SOC_SUBSYSTEM_IP_MAX];
|
|
|
|
+ u64 timecondition_notmet_totaltime[SOC_SUBSYSTEM_IP_MAX];
|
|
|
|
+} __packed;
|
|
|
|
+
|
|
|
|
#ifdef CONFIG_DEBUG_FS
|
|
|
|
static int smu_fw_info_show(struct seq_file *s, void *unused)
|
|
|
|
{
|
|
|
|
+ struct amd_pmc_dev *dev = s->private;
|
|
|
|
+ struct smu_metrics table;
|
|
|
|
+ u32 value;
|
|
|
|
+ int idx;
|
|
|
|
+
|
|
|
|
+ if (dev->cpu_id == AMD_CPU_ID_PCO)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ memcpy_fromio(&table, dev->smu_virt_addr, sizeof(struct smu_metrics));
|
|
|
|
+
|
|
|
|
+ seq_puts(s, "\n=== SMU Statistics ===\n");
|
|
|
|
+ seq_printf(s, "Table Version: %d\n", table.table_version);
|
|
|
|
+ seq_printf(s, "Hint Count: %d\n", table.hint_count);
|
|
|
|
+ seq_printf(s, "S0i3 Cycle Count: %d\n", table.s0i3_cyclecount);
|
|
|
|
+ seq_printf(s, "Time (in us) to S0i3: %lld\n", table.timeentering_s0i3_lastcapture);
|
|
|
|
+ seq_printf(s, "Time (in us) in S0i3: %lld\n", table.timein_s0i3_lastcapture);
|
|
|
|
+
|
|
|
|
+ seq_puts(s, "\n=== Active time (in us) ===\n");
|
|
|
|
+ for (idx = 0 ; idx < SOC_SUBSYSTEM_IP_MAX ; idx++) {
|
|
|
|
+ if (soc15_ip_blk[idx].bit_mask & dev->active_ips)
|
|
|
|
+ seq_printf(s, "%-8s : %lld\n", soc15_ip_blk[idx].name,
|
|
|
|
+ table.timecondition_notmet_lastcapture[idx]);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
DEFINE_SHOW_ATTRIBUTE(smu_fw_info);
|
|
|
|
@@ -112,6 +187,32 @@ static inline void amd_pmc_dbgfs_unregister(struct amd_pmc_dev *dev)
|
|
|
|
}
|
|
|
|
#endif /* CONFIG_DEBUG_FS */
|
|
|
|
|
|
|
|
+static int amd_pmc_setup_smu_logging(struct amd_pmc_dev *dev)
|
|
|
|
+{
|
|
|
|
+ u32 phys_addr_low, phys_addr_hi;
|
|
|
|
+ u64 smu_phys_addr;
|
|
|
|
+
|
|
|
|
+ if (dev->cpu_id == AMD_CPU_ID_PCO)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ /* Get Active devices list from SMU */
|
|
|
|
+ amd_pmc_send_cmd(dev, 0, &dev->active_ips, SMU_MSG_GET_SUP_CONSTRAINTS, 1);
|
|
|
|
+
|
|
|
|
+ /* Get dram address */
|
|
|
|
+ amd_pmc_send_cmd(dev, 0, &phys_addr_low, SMU_MSG_LOG_GETDRAM_ADDR_LO, 1);
|
|
|
|
+ amd_pmc_send_cmd(dev, 0, &phys_addr_hi, SMU_MSG_LOG_GETDRAM_ADDR_HI, 1);
|
|
|
|
+ smu_phys_addr = ((u64)phys_addr_hi << 32 | phys_addr_low);
|
|
|
|
+
|
|
|
|
+ dev->smu_virt_addr = devm_ioremap(dev->dev, smu_phys_addr, sizeof(struct smu_metrics));
|
|
|
|
+ if (!dev->smu_virt_addr)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
|
|
+ /* Start the logging */
|
|
|
|
+ amd_pmc_send_cmd(dev, 0, NULL, SMU_MSG_LOG_START, 0);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static void amd_pmc_dump_registers(struct amd_pmc_dev *dev)
|
|
|
|
{
|
|
|
|
u32 value;
|
|
|
|
@@ -126,10 +227,9 @@ static void amd_pmc_dump_registers(struct amd_pmc_dev *dev)
|
|
|
|
dev_dbg(dev->dev, "AMD_PMC_REGISTER_MESSAGE:%x\n", value);
|
|
|
|
}
|
|
|
|
|
|
|
|
-static int amd_pmc_send_cmd(struct amd_pmc_dev *dev, bool set)
|
|
|
|
+static int amd_pmc_send_cmd(struct amd_pmc_dev *dev, bool set, u32 *data, u8 msg, bool ret)
|
|
|
|
{
|
|
|
|
int rc;
|
|
|
|
- u8 msg;
|
|
|
|
u32 val;
|
|
|
|
|
|
|
|
/* Wait until we get a valid response */
|
|
|
|
@@ -148,8 +248,8 @@ static int amd_pmc_send_cmd(struct amd_pmc_dev *dev, bool set)
|
|
|
|
amd_pmc_reg_write(dev, AMD_PMC_REGISTER_ARGUMENT, set);
|
|
|
|
|
|
|
|
/* Write message ID to message ID register */
|
|
|
|
- msg = (dev->cpu_id == AMD_CPU_ID_RN) ? MSG_OS_HINT_RN : MSG_OS_HINT_PCO;
|
|
|
|
amd_pmc_reg_write(dev, AMD_PMC_REGISTER_MESSAGE, msg);
|
|
|
|
+
|
|
|
|
/* Wait until we get a valid response */
|
|
|
|
rc = readx_poll_timeout(ioread32, dev->regbase + AMD_PMC_REGISTER_RESPONSE,
|
|
|
|
val, val == AMD_PMC_RESULT_OK, PMC_MSG_DELAY_MIN_US,
|
|
|
|
@@ -158,16 +258,40 @@ static int amd_pmc_send_cmd(struct amd_pmc_dev *dev, bool set)
|
|
|
|
dev_err(dev->dev, "SMU response timed out\n");
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+ if (ret) {
|
|
|
|
+ /* PMFW may take longer time to return back the data */
|
|
|
|
+ usleep_range(DELAY_MIN_US, 10 * DELAY_MAX_US);
|
|
|
|
+ *data = amd_pmc_reg_read(dev, AMD_PMC_REGISTER_ARGUMENT);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
amd_pmc_dump_registers(dev);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
+static int amd_pmc_get_os_hint(struct amd_pmc_dev *dev)
|
|
|
|
+{
|
|
|
|
+ switch (dev->cpu_id) {
|
|
|
|
+ case AMD_CPU_ID_PCO:
|
|
|
|
+ return MSG_OS_HINT_PCO;
|
|
|
|
+ case AMD_CPU_ID_RN:
|
|
|
|
+ return MSG_OS_HINT_RN;
|
|
|
|
+ }
|
|
|
|
+ return -EINVAL;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static int __maybe_unused amd_pmc_suspend(struct device *dev)
|
|
|
|
{
|
|
|
|
struct amd_pmc_dev *pdev = dev_get_drvdata(dev);
|
|
|
|
int rc;
|
|
|
|
+ u8 msg;
|
|
|
|
+
|
|
|
|
+ /* Reset and Start SMU logging - to monitor the s0i3 stats */
|
|
|
|
+ amd_pmc_send_cmd(pdev, 0, NULL, SMU_MSG_LOG_RESET, 0);
|
|
|
|
+ amd_pmc_send_cmd(pdev, 0, NULL, SMU_MSG_LOG_START, 0);
|
|
|
|
|
|
|
|
- rc = amd_pmc_send_cmd(pdev, 1);
|
|
|
|
+ msg = amd_pmc_get_os_hint(pdev);
|
|
|
|
+ rc = amd_pmc_send_cmd(pdev, 1, NULL, msg, 0);
|
|
|
|
if (rc)
|
|
|
|
dev_err(pdev->dev, "suspend failed\n");
|
|
|
|
|
|
|
|
@@ -178,8 +302,13 @@ static int __maybe_unused amd_pmc_resume(struct device *dev)
|
|
|
|
{
|
|
|
|
struct amd_pmc_dev *pdev = dev_get_drvdata(dev);
|
|
|
|
int rc;
|
|
|
|
+ u8 msg;
|
|
|
|
+
|
|
|
|
+ /* Let SMU know that we are looking for stats */
|
|
|
|
+ amd_pmc_send_cmd(pdev, 0, NULL, SMU_MSG_LOG_DUMP_DATA, 0);
|
|
|
|
|
|
|
|
- rc = amd_pmc_send_cmd(pdev, 0);
|
|
|
|
+ msg = amd_pmc_get_os_hint(pdev);
|
|
|
|
+ rc = amd_pmc_send_cmd(pdev, 0, NULL, msg, 0);
|
|
|
|
if (rc)
|
|
|
|
dev_err(pdev->dev, "resume failed\n");
|
|
|
|
|
|
|
|
@@ -202,8 +331,7 @@ static int amd_pmc_probe(struct platform_device *pdev)
|
|
|
|
{
|
|
|
|
struct amd_pmc_dev *dev = &pmc;
|
|
|
|
struct pci_dev *rdev;
|
|
|
|
- u32 base_addr_lo;
|
|
|
|
- u32 base_addr_hi;
|
|
|
|
+ u32 base_addr_lo, base_addr_hi;
|
|
|
|
u64 base_addr;
|
|
|
|
int err;
|
|
|
|
u32 val;
|
|
|
|
@@ -254,6 +382,10 @@ static int amd_pmc_probe(struct platform_device *pdev)
|
|
|
|
if (!dev->regbase)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
+ /* Use SMU to get the s0i3 debug stats */
|
|
|
|
+ err = amd_pmc_setup_smu_logging(dev);
|
|
|
|
+ if (err)
|
|
|
|
+ dev_err(dev->dev, "SMU debugging info not supported on this platform\n");
|
|
|
|
platform_set_drvdata(pdev, dev);
|
|
|
|
amd_pmc_dbgfs_register(dev);
|
|
|
|
return 0;
|
|
|
|
--
|
|
|
|
2.32.0
|
|
|
|
|
2021-07-02 12:50:26 +00:00
|
|
|
From c0b1001ec46fd2912b7d2882f22973bfe309520f Mon Sep 17 00:00:00 2001
|
2021-06-19 19:58:38 +00:00
|
|
|
From: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
|
|
|
|
Date: Thu, 17 Jun 2021 17:00:38 +0530
|
|
|
|
Subject: [PATCH] platform/x86: amd-pmc: Add support for logging s0ix counters
|
|
|
|
|
|
|
|
Even the FCH SSC registers provides certain level of information
|
|
|
|
about the s0ix entry and exit times which comes handy when the SMU
|
|
|
|
fails to report the statistics via the mailbox communication.
|
|
|
|
|
|
|
|
This information is captured via a new debugfs file "s0ix_stats".
|
|
|
|
A non-zero entry in this counters would mean that the system entered
|
|
|
|
the s0ix state.
|
|
|
|
|
|
|
|
If s0ix entry time and exit time don't change during suspend to idle,
|
|
|
|
the silicon has not entered the deepest state.
|
|
|
|
|
|
|
|
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
|
|
|
|
Patchset: s0ix-amd
|
|
|
|
---
|
|
|
|
drivers/platform/x86/amd-pmc.c | 46 ++++++++++++++++++++++++++++++++--
|
|
|
|
1 file changed, 44 insertions(+), 2 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/drivers/platform/x86/amd-pmc.c b/drivers/platform/x86/amd-pmc.c
|
|
|
|
index b5249fdeb95f..b6ad290c9a86 100644
|
|
|
|
--- a/drivers/platform/x86/amd-pmc.c
|
|
|
|
+++ b/drivers/platform/x86/amd-pmc.c
|
|
|
|
@@ -46,6 +46,15 @@
|
|
|
|
#define AMD_PMC_RESULT_CMD_UNKNOWN 0xFE
|
|
|
|
#define AMD_PMC_RESULT_FAILED 0xFF
|
|
|
|
|
|
|
|
+/* FCH SSC Registers */
|
|
|
|
+#define FCH_S0I3_ENTRY_TIME_L_OFFSET 0x30
|
|
|
|
+#define FCH_S0I3_ENTRY_TIME_H_OFFSET 0x34
|
|
|
|
+#define FCH_S0I3_EXIT_TIME_L_OFFSET 0x38
|
|
|
|
+#define FCH_S0I3_EXIT_TIME_H_OFFSET 0x3C
|
|
|
|
+#define FCH_SSC_MAPPING_SIZE 0x800
|
|
|
|
+#define FCH_BASE_PHY_ADDR_LOW 0xFED81100
|
|
|
|
+#define FCH_BASE_PHY_ADDR_HIGH 0x00000000
|
|
|
|
+
|
|
|
|
/* SMU Message Definations */
|
|
|
|
#define SMU_MSG_GETSMUVERSION 0x02
|
|
|
|
#define SMU_MSG_LOG_GETDRAM_ADDR_HI 0x04
|
|
|
|
@@ -96,6 +105,7 @@ static const struct amd_pmc_bit_map soc15_ip_blk[] = {
|
|
|
|
struct amd_pmc_dev {
|
|
|
|
void __iomem *regbase;
|
|
|
|
void __iomem *smu_virt_addr;
|
|
|
|
+ void __iomem *fch_virt_addr;
|
|
|
|
u32 base_addr;
|
|
|
|
u32 cpu_id;
|
|
|
|
u32 active_ips;
|
|
|
|
@@ -140,7 +150,6 @@ static int smu_fw_info_show(struct seq_file *s, void *unused)
|
|
|
|
{
|
|
|
|
struct amd_pmc_dev *dev = s->private;
|
|
|
|
struct smu_metrics table;
|
|
|
|
- u32 value;
|
|
|
|
int idx;
|
|
|
|
|
|
|
|
if (dev->cpu_id == AMD_CPU_ID_PCO)
|
|
|
|
@@ -166,6 +175,29 @@ static int smu_fw_info_show(struct seq_file *s, void *unused)
|
|
|
|
}
|
|
|
|
DEFINE_SHOW_ATTRIBUTE(smu_fw_info);
|
|
|
|
|
|
|
|
+static int s0ix_stats_show(struct seq_file *s, void *unused)
|
|
|
|
+{
|
|
|
|
+ struct amd_pmc_dev *dev = s->private;
|
|
|
|
+ u64 entry_time, exit_time, residency;
|
|
|
|
+
|
|
|
|
+ entry_time = ioread32(dev->fch_virt_addr + FCH_S0I3_ENTRY_TIME_H_OFFSET);
|
|
|
|
+ entry_time = entry_time << 32 | ioread32(dev->fch_virt_addr + FCH_S0I3_ENTRY_TIME_L_OFFSET);
|
|
|
|
+
|
|
|
|
+ exit_time = ioread32(dev->fch_virt_addr + FCH_S0I3_EXIT_TIME_H_OFFSET);
|
|
|
|
+ exit_time = exit_time << 32 | ioread32(dev->fch_virt_addr + FCH_S0I3_EXIT_TIME_L_OFFSET);
|
|
|
|
+
|
|
|
|
+ /* It's in 48MHz. We need to convert it to unit of 100ns */
|
|
|
|
+ residency = (exit_time - entry_time) * 10 / 48;
|
|
|
|
+
|
|
|
|
+ seq_puts(s, "=== S0ix statistics ===\n");
|
|
|
|
+ seq_printf(s, "S0ix Entry Time: %lld\n", entry_time);
|
|
|
|
+ seq_printf(s, "S0ix Exit Time: %lld\n", exit_time);
|
|
|
|
+ seq_printf(s, "Residency Time: %lld\n", residency);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+DEFINE_SHOW_ATTRIBUTE(s0ix_stats);
|
|
|
|
+
|
|
|
|
static void amd_pmc_dbgfs_unregister(struct amd_pmc_dev *dev)
|
|
|
|
{
|
|
|
|
debugfs_remove_recursive(dev->dbgfs_dir);
|
|
|
|
@@ -176,6 +208,8 @@ static void amd_pmc_dbgfs_register(struct amd_pmc_dev *dev)
|
|
|
|
dev->dbgfs_dir = debugfs_create_dir("amd_pmc", NULL);
|
|
|
|
debugfs_create_file("smu_fw_info", 0644, dev->dbgfs_dir, dev,
|
|
|
|
&smu_fw_info_fops);
|
|
|
|
+ debugfs_create_file("s0ix_stats", 0644, dev->dbgfs_dir, dev,
|
|
|
|
+ &s0ix_stats_fops);
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
static inline void amd_pmc_dbgfs_register(struct amd_pmc_dev *dev)
|
|
|
|
@@ -332,7 +366,7 @@ static int amd_pmc_probe(struct platform_device *pdev)
|
|
|
|
struct amd_pmc_dev *dev = &pmc;
|
|
|
|
struct pci_dev *rdev;
|
|
|
|
u32 base_addr_lo, base_addr_hi;
|
|
|
|
- u64 base_addr;
|
|
|
|
+ u64 base_addr, fch_phys_addr;
|
|
|
|
int err;
|
|
|
|
u32 val;
|
|
|
|
|
|
|
|
@@ -382,6 +416,14 @@ static int amd_pmc_probe(struct platform_device *pdev)
|
|
|
|
if (!dev->regbase)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
+ /* Use FCH registers to get the S0ix stats */
|
|
|
|
+ base_addr_lo = FCH_BASE_PHY_ADDR_LOW;
|
|
|
|
+ base_addr_hi = FCH_BASE_PHY_ADDR_HIGH;
|
|
|
|
+ fch_phys_addr = ((u64)base_addr_hi << 32 | base_addr_lo);
|
|
|
|
+ dev->fch_virt_addr = devm_ioremap(dev->dev, fch_phys_addr, FCH_SSC_MAPPING_SIZE);
|
|
|
|
+ if (!dev->fch_virt_addr)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
|
|
/* Use SMU to get the s0i3 debug stats */
|
|
|
|
err = amd_pmc_setup_smu_logging(dev);
|
|
|
|
if (err)
|
|
|
|
--
|
|
|
|
2.32.0
|
|
|
|
|
2021-07-02 12:50:26 +00:00
|
|
|
From c1e5e94f1bf15f1b70ae991bcabab92d9e9150a5 Mon Sep 17 00:00:00 2001
|
2021-06-19 19:58:38 +00:00
|
|
|
From: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
|
|
|
|
Date: Thu, 17 Jun 2021 17:00:39 +0530
|
|
|
|
Subject: [PATCH] platform/x86: amd-pmc: Add support for ACPI ID AMDI0006
|
|
|
|
|
|
|
|
Some newer BIOSes have added another ACPI ID for the uPEP device.
|
|
|
|
SMU statistics behave identically on this device.
|
|
|
|
|
|
|
|
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
|
|
|
|
Patchset: s0ix-amd
|
|
|
|
---
|
|
|
|
drivers/platform/x86/amd-pmc.c | 1 +
|
|
|
|
1 file changed, 1 insertion(+)
|
|
|
|
|
|
|
|
diff --git a/drivers/platform/x86/amd-pmc.c b/drivers/platform/x86/amd-pmc.c
|
|
|
|
index b6ad290c9a86..2a73fe0deaf3 100644
|
|
|
|
--- a/drivers/platform/x86/amd-pmc.c
|
|
|
|
+++ b/drivers/platform/x86/amd-pmc.c
|
|
|
|
@@ -443,6 +443,7 @@ static int amd_pmc_remove(struct platform_device *pdev)
|
|
|
|
|
|
|
|
static const struct acpi_device_id amd_pmc_acpi_ids[] = {
|
|
|
|
{"AMDI0005", 0},
|
|
|
|
+ {"AMDI0006", 0},
|
|
|
|
{"AMD0004", 0},
|
|
|
|
{"AMD0005", 0},
|
|
|
|
{ }
|
|
|
|
--
|
|
|
|
2.32.0
|
|
|
|
|
2021-07-02 12:50:26 +00:00
|
|
|
From 31b773122734f73887807b6f8b1d7e2229b5af8b Mon Sep 17 00:00:00 2001
|
2021-06-19 19:58:38 +00:00
|
|
|
From: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
|
|
|
|
Date: Thu, 17 Jun 2021 17:00:40 +0530
|
|
|
|
Subject: [PATCH] platform/x86: amd-pmc: Add new acpi id for future PMC
|
|
|
|
controllers
|
|
|
|
|
|
|
|
The upcoming PMC controller would have a newer acpi id, add that to
|
|
|
|
the supported acpid device list.
|
|
|
|
|
|
|
|
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
|
|
|
|
Patchset: s0ix-amd
|
|
|
|
---
|
|
|
|
drivers/platform/x86/amd-pmc.c | 4 ++++
|
|
|
|
1 file changed, 4 insertions(+)
|
|
|
|
|
|
|
|
diff --git a/drivers/platform/x86/amd-pmc.c b/drivers/platform/x86/amd-pmc.c
|
|
|
|
index 2a73fe0deaf3..5a2be598fc2e 100644
|
|
|
|
--- a/drivers/platform/x86/amd-pmc.c
|
|
|
|
+++ b/drivers/platform/x86/amd-pmc.c
|
|
|
|
@@ -68,6 +68,7 @@
|
|
|
|
#define AMD_CPU_ID_RN 0x1630
|
|
|
|
#define AMD_CPU_ID_PCO AMD_CPU_ID_RV
|
|
|
|
#define AMD_CPU_ID_CZN AMD_CPU_ID_RN
|
|
|
|
+#define AMD_CPU_ID_YC 0x14B5
|
|
|
|
|
|
|
|
#define PMC_MSG_DELAY_MIN_US 100
|
|
|
|
#define RESPONSE_REGISTER_LOOP_MAX 200
|
|
|
|
@@ -309,6 +310,7 @@ static int amd_pmc_get_os_hint(struct amd_pmc_dev *dev)
|
|
|
|
case AMD_CPU_ID_PCO:
|
|
|
|
return MSG_OS_HINT_PCO;
|
|
|
|
case AMD_CPU_ID_RN:
|
|
|
|
+ case AMD_CPU_ID_YC:
|
|
|
|
return MSG_OS_HINT_RN;
|
|
|
|
}
|
|
|
|
return -EINVAL;
|
|
|
|
@@ -354,6 +356,7 @@ static const struct dev_pm_ops amd_pmc_pm_ops = {
|
|
|
|
};
|
|
|
|
|
|
|
|
static const struct pci_device_id pmc_pci_ids[] = {
|
|
|
|
+ { PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_YC) },
|
|
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_CZN) },
|
|
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_RN) },
|
|
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_PCO) },
|
|
|
|
@@ -444,6 +447,7 @@ static int amd_pmc_remove(struct platform_device *pdev)
|
|
|
|
static const struct acpi_device_id amd_pmc_acpi_ids[] = {
|
|
|
|
{"AMDI0005", 0},
|
|
|
|
{"AMDI0006", 0},
|
|
|
|
+ {"AMDI0007", 0},
|
|
|
|
{"AMD0004", 0},
|
|
|
|
{"AMD0005", 0},
|
|
|
|
{ }
|
|
|
|
--
|
|
|
|
2.32.0
|
|
|
|
|
2021-07-02 12:50:26 +00:00
|
|
|
From 7001c6c1a202585885a14575aa8f731f60714c5c Mon Sep 17 00:00:00 2001
|
2021-06-19 19:58:38 +00:00
|
|
|
From: Pratik Vishwakarma <Pratik.Vishwakarma@amd.com>
|
|
|
|
Date: Thu, 17 Jun 2021 11:42:08 -0500
|
|
|
|
Subject: [PATCH] ACPI: PM: s2idle: Use correct revision id
|
|
|
|
|
|
|
|
AMD spec mentions only revision 0. With this change,
|
|
|
|
device constraint list is populated properly.
|
|
|
|
|
|
|
|
Signed-off-by: Pratik Vishwakarma <Pratik.Vishwakarma@amd.com>
|
|
|
|
Patchset: s0ix-amd
|
|
|
|
---
|
|
|
|
drivers/acpi/x86/s2idle.c | 2 +-
|
|
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
|
|
|
|
diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c
|
|
|
|
index 482e6b23b21a..4339e6da0dd6 100644
|
|
|
|
--- a/drivers/acpi/x86/s2idle.c
|
|
|
|
+++ b/drivers/acpi/x86/s2idle.c
|
|
|
|
@@ -96,7 +96,7 @@ static void lpi_device_get_constraints_amd(void)
|
|
|
|
int i, j, k;
|
|
|
|
|
|
|
|
out_obj = acpi_evaluate_dsm_typed(lps0_device_handle, &lps0_dsm_guid,
|
|
|
|
- 1, ACPI_LPS0_GET_DEVICE_CONSTRAINTS,
|
|
|
|
+ rev_id, ACPI_LPS0_GET_DEVICE_CONSTRAINTS,
|
|
|
|
NULL, ACPI_TYPE_PACKAGE);
|
|
|
|
|
|
|
|
if (!out_obj)
|
|
|
|
--
|
|
|
|
2.32.0
|
|
|
|
|