summaryrefslogtreecommitdiff
path: root/src/soc/amd/common/acpi/upep.asl
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/amd/common/acpi/upep.asl')
-rw-r--r--src/soc/amd/common/acpi/upep.asl131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/soc/amd/common/acpi/upep.asl b/src/soc/amd/common/acpi/upep.asl
new file mode 100644
index 0000000000..3fcf2f7eb4
--- /dev/null
+++ b/src/soc/amd/common/acpi/upep.asl
@@ -0,0 +1,131 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#define PEPD_DSM_UUID "e3f32452-febc-43ce-9039-932122d37721"
+#define PEPD_DSM_LPI_ENUM_FUNCTIONS 0
+#define PEPD_DSM_LPI_ADDITIONAL_FUNCTIONS 1
+#define PEPD_DSM_LPI_GET_DEVICE_CONSTRAINTS 1
+
+#define PEPD_DSM_NOTIFICATIONS_UUID "11e00d56-ce64-47ce-837b-1f898f9aa461"
+#define PEPD_DSM_NOTIFICATION_ENUM_FUNCTIONS 0
+
+/*
+ * Power Engine Plug-in Device
+ *
+ * References:
+ * * Intel Low Power S0 Idle
+ * * AMD Modern Standby BIOS Implementation Guide - #56358
+ * * Linux Kernel: drivers/acpi/x86/s2idle.c
+ * * https://docs.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-firmware-notifications
+ */
+Scope (\_SB) {
+ Device (PEP) {
+ Name (_HID, "AMDI0005")
+ Name (_CID, EisaId ("PNP0D80"))
+ Name (_UID, One)
+
+ Method (_STA, 0, NotSerialized) {
+ Return (0x0F)
+ }
+
+ /*
+ * Device constraints for low power states (may be used for debugging).
+ * For now there is only one disabled dummy device, because Windows
+ * expects at least one device and crashes without it with a bluescreen
+ * (`INTERNAL_POWER_ERROR`). Returning an empty package does not work.
+ */
+ Name (DEVL, Package() {
+ Package() {
+ 0, /* Disabled */
+ "\\DUMY", /* \DUMY - not existent */
+ 0, /* Function States */
+ 0 /* Minimum D-state */
+ }
+ })
+
+ /*
+ * PEPD_DSM_UUID Helper method
+ *
+ * Arg0: Function Index
+ */
+ Method (DSM0, 1, Serialized) {
+ Switch (ToInteger(Arg0)) {
+ /*
+ * Return a bit field of the supported functions for
+ * this UUID.
+ */
+ Case (PEPD_DSM_LPI_ENUM_FUNCTIONS) {
+ Local0 = Buffer { 0x00 }
+ CreateByteField(Local0, 0x00, SUPP)
+
+ SUPP = PEPD_DSM_LPI_ADDITIONAL_FUNCTIONS
+ SUPP |= 1 << PEPD_DSM_LPI_GET_DEVICE_CONSTRAINTS
+
+ Return (Local0)
+ }
+ Case (PEPD_DSM_LPI_GET_DEVICE_CONSTRAINTS) {
+ Return (DEVL)
+ }
+ Default {
+ /* Unknown function */
+ Return (Buffer() { 0x00 })
+ }
+ }
+ }
+
+ /*
+ * PEPD_DSM_NOTIFICATIONS_UUID Helper method
+ *
+ * Arg0: Function Index
+ */
+ Method (DSM1, 1, Serialized) {
+ Switch (ToInteger(Arg0)) {
+ /*
+ * Return a bit field of the supported functions for
+ * this UUID.
+ */
+ Case (PEPD_DSM_NOTIFICATION_ENUM_FUNCTIONS) {
+ /*
+ * TODO(b/185586290): Add additional functions when
+ * linux kernel driver is fixed.
+ */
+ Return (Buffer() { 0x00 })
+ }
+ Default {
+ /* Unknown function */
+ Return (Buffer() { 0x00 })
+ }
+ }
+ }
+
+ /*
+ * Device Specific Method
+ *
+ * Arg0: UUID
+ * Arg1: Revision Id
+ * Arg2: Function Index
+ */
+ Method (_DSM, 4, Serialized) {
+ Switch (ToBuffer(Arg0)) {
+ Case (ToUUID(PEPD_DSM_UUID)) {
+ /* Unsupported Revision */
+ If (ToInteger(Arg1) != 0) {
+ Return (Buffer() { 0x00 })
+ }
+
+ Return (DSM0(Arg2))
+ }
+ Case (ToUUID(PEPD_DSM_NOTIFICATIONS_UUID)) {
+ /* Unsupported Revision */
+ If (ToInteger(Arg1) != 0) {
+ Return (Buffer() { 0x00 })
+ }
+
+ Return (DSM1(Arg2))
+ }
+ Default {
+ Return (Buffer { 0x00 })
+ }
+ }
+ }
+ }
+}