summaryrefslogtreecommitdiff
path: root/src/soc/amd/picasso/acpi/aoac.asl
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/amd/picasso/acpi/aoac.asl')
-rw-r--r--src/soc/amd/picasso/acpi/aoac.asl146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/soc/amd/picasso/acpi/aoac.asl b/src/soc/amd/picasso/acpi/aoac.asl
new file mode 100644
index 0000000000..f26f85f205
--- /dev/null
+++ b/src/soc/amd/picasso/acpi/aoac.asl
@@ -0,0 +1,146 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include <amdblocks/acpimmio_map.h>
+
+#define AOAC_DEVICE(DEV_NAME, DEV_ID, SX) \
+ PowerResource(DEV_NAME, SX, 0) { \
+ OperationRegion (AOAC, SystemMemory, ACPIMMIO_AOAC_BASE + 0x40 + (DEV_ID << 1), 2) \
+ Field (AOAC, ByteAcc, NoLock, Preserve) { \
+ /* \
+ * Target Device State \
+ * \
+ * 0 = D0 - Uninitialized \
+ * 1 = D0 - Initialized \
+ * 2 = D1/D2/D3Hot \
+ * 3 = D3Cold \
+ * \
+ * This field is only used to cut off register access. It does not \
+ * control any power states. D3Cold is the only value that will \
+ * cut off register access. All other values will allow register \
+ * access and are purely informational. \
+ */ \
+ TDS, 2, \
+\
+ DS, 1, /* Device State - Purely informational */ \
+\
+ /* \
+ * Power On Dev \
+ * \
+ * 1 = Perform hardware sequence to power on the device \
+ * 0 = Perform hardware sequence to power off the device \
+ * \
+ * This register is only valid when Is Software Control = 0. \
+ */ \
+ POD, 1, \
+\
+ /* Software Power On Reset B */ \
+ SPRB, 1, \
+ /* Software Ref Clock OK */ \
+ SRCO, 1, \
+ /* Software Reset B */ \
+ SRB, 1, \
+ /* \
+ * Is Software Control \
+ * \
+ * 1 = Allow software to control Power On Reset B, \
+ * Ref Clock OK, and Reset B. \
+ * 0 = Hardware control \
+ */ \
+ ISWC, 1, \
+\
+ /* Power Reset B State */ \
+ PRBS, 1, \
+ /* Ref Clock OK State */ \
+ RCOS, 1, \
+ /* Reset B State */ \
+ RBS, 1, \
+ /* Device Off Gating State */ \
+ DOGS, 1, \
+ /* D3 Cold State */ \
+ D3CS, 1, \
+ /* Device Clock OK State */ \
+ COS, 1, \
+ /* State of device */ \
+ STA0, 1, \
+ /* State of device */ \
+ STA1, 1, \
+ } \
+ Method(_STA) { \
+ Local0 = (PRBS && RCOS && RBS) \
+\
+ Printf("AOAC.%s._STA: %o", #DEV_NAME, Local0) \
+\
+ If (Local0) { \
+ Return (1) \
+ } Else { \
+ Return (0) \
+ } \
+ } \
+ Method(_ON, 0, Serialized) { \
+ Printf("AOAC.%s._ON", #DEV_NAME) \
+\
+ ISWC=0 \
+ POD=1 \
+\
+ While (!PRBS || !RCOS || !RBS) { \
+ Printf ("Waiting for device to power on") \
+ Stall (100) \
+ } \
+\
+ Printf("Done waiting") \
+ } \
+ Method(_OFF, 0, Serialized) { \
+ Printf("AOAC.%s._OFF", #DEV_NAME) \
+\
+ ISWC=0 \
+ POD=0 \
+\
+ While (PRBS || RCOS || RBS) { \
+ Printf ("Waiting for device to power off") \
+ Stall (100) \
+ } \
+\
+ Printf("Done waiting") \
+ } \
+ Method(_RST, 0, Serialized) { \
+ Printf("AOAC.%s._RST", #DEV_NAME) \
+\
+ ISWC=1 \
+ SRB=1 \
+\
+ /* Assert the SwRstB signal for 200 us */ \
+ Stall (200) \
+\
+ SRB=0 \
+ ISWC=0 \
+\
+ While (!PRBS || !RCOS || !RBS) { \
+ Printf ("Waiting for device to complete reset") \
+ Stall (100) \
+ } \
+ } \
+ }
+
+
+Device (AOAC) {
+ Name (_HID, EISAID("PNP0C02")) // ID for Motherboard resources
+
+ Method (_STA, 0x0, NotSerialized)
+ {
+ /*
+ * This case is used to indicate a valid device for which no
+ * device driver should be loaded (for example, a bridge
+ * device.) Children of this device may be present and valid.
+ * OSPM should continue enumeration below a device whose _STA
+ * returns this bit combination.
+ */
+ Return (0x08)
+ }
+
+ AOAC_DEVICE(I2C2, 7, 0)
+ AOAC_DEVICE(I2C3, 8, 0)
+ AOAC_DEVICE(I2C4, 9, 5) /* I2C4 is powered from the S5 power group. */
+ AOAC_DEVICE(FUR1, 12, 0)
+ AOAC_DEVICE(FUR2, 16, 0)
+ AOAC_DEVICE(FUR3, 26, 0)
+}