x86: acpi: Add some generic ASL libraries
authorBin Meng <bmeng.cn@gmail.com>
Sat, 7 May 2016 14:46:29 +0000 (07:46 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Mon, 23 May 2016 07:18:00 +0000 (15:18 +0800)
This adds several generic ASL libraries that can be included by
other ASL files, which are:

- debug.asl: for debug output using POST I/O port and legacy serial port
- globutil.asl: for string compare routines
- statdef.asl: for _STA status values

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Stefan Roese <sr@denx.de>
Tested-by: Stefan Roese <sr@denx.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
arch/x86/include/asm/acpi/debug.asl [new file with mode: 0644]
arch/x86/include/asm/acpi/globutil.asl [new file with mode: 0644]
arch/x86/include/asm/acpi/statdef.asl [new file with mode: 0644]

diff --git a/arch/x86/include/asm/acpi/debug.asl b/arch/x86/include/asm/acpi/debug.asl
new file mode 100644 (file)
index 0000000..8e7b603
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/arch/x86/acpi/debug.asl
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+/* POST register region */
+OperationRegion(X80, SystemIO, 0x80, 1)
+Field(X80, ByteAcc, NoLock, Preserve)
+{
+       P80, 8
+}
+
+/* Legacy serial port register region */
+OperationRegion(CREG, SystemIO, 0x3F8, 8)
+Field(CREG, ByteAcc, NoLock, Preserve)
+{
+       CDAT, 8,
+       CDLM, 8,
+           , 8,
+       CLCR, 8,
+       CMCR, 8,
+       CLSR, 8
+}
+
+/* DINI - Initialize the serial port to 115200 8-N-1 */
+Method(DINI)
+{
+       Store(0x83, CLCR)
+       Store(0x01, CDAT)       /* 115200 baud (low) */
+       Store(0x00, CDLM)       /* 115200 baud (high) */
+       Store(0x03, CLCR)       /* word=8 stop=1 parity=none */
+       Store(0x03, CMCR)       /* DTR=1 RTS=1 out1/2=Off loop=Off */
+       Store(0x00, CDLM)       /* turn off interrupts */
+}
+
+/* THRE - Wait for serial port transmitter holding register to go empty */
+Method(THRE)
+{
+       And(CLSR, 0x20, Local0)
+       While (LEqual(Local0, Zero)) {
+               And(CLSR, 0x20, Local0)
+       }
+}
+
+/* OUTX - Send a single raw character */
+Method(OUTX, 1)
+{
+       THRE()
+       Store(Arg0, CDAT)
+}
+
+/* OUTC - Send a single character, expanding LF into CR/LF */
+Method(OUTC, 1)
+{
+       If (LEqual(Arg0, 0x0a)) {
+               OUTX(0x0d)
+       }
+       OUTX(Arg0)
+}
+
+/* DBGN - Send a single hex nibble */
+Method(DBGN, 1)
+{
+       And(Arg0, 0x0f, Local0)
+       If (LLess(Local0, 10)) {
+               Add(Local0, 0x30, Local0)
+       } Else {
+               Add(Local0, 0x37, Local0)
+       }
+       OUTC(Local0)
+}
+
+/* DBGB - Send a hex byte */
+Method(DBGB, 1)
+{
+       ShiftRight(Arg0, 4, Local0)
+       DBGN(Local0)
+       DBGN(Arg0)
+}
+
+/* DBGW - Send a hex word */
+Method(DBGW, 1)
+{
+       ShiftRight(Arg0, 8, Local0)
+       DBGB(Local0)
+       DBGB(Arg0)
+}
+
+/* DBGD - Send a hex dword */
+Method(DBGD, 1)
+{
+       ShiftRight(Arg0, 16, Local0)
+       DBGW(Local0)
+       DBGW(Arg0)
+}
+
+/* Get a char from a string */
+Method(GETC, 2)
+{
+       CreateByteField(Arg0, Arg1, DBGC)
+       Return (DBGC)
+}
+
+/* DBGO - Send either a string or an integer */
+Method(DBGO, 1, Serialized)
+{
+       If (LEqual(ObjectType(Arg0), 1)) {
+               If (LGreater(Arg0, 0xffff)) {
+                       DBGD(Arg0)
+               } Else {
+                       If (LGreater(Arg0, 0xff)) {
+                               DBGW(Arg0)
+                       } Else {
+                               DBGB(Arg0)
+                       }
+               }
+       } Else {
+               Name(BDBG, Buffer(80) {})
+               Store(Arg0, BDBG)
+               Store(0, Local1)
+               While (One) {
+                       Store(GETC(BDBG, Local1), Local0)
+                       If (LEqual(Local0, 0)) {
+                               Return (Zero)
+                       }
+                       OUTC(Local0)
+                       Increment(Local1)
+               }
+       }
+
+       Return (Zero)
+}
diff --git a/arch/x86/include/asm/acpi/globutil.asl b/arch/x86/include/asm/acpi/globutil.asl
new file mode 100644 (file)
index 0000000..46381b6
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/arch/x86/acpi/globutil.asl
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+Method(MIN, 2)
+{
+       If (LLess(Arg0, Arg1)) {
+               Return (Arg0)
+       } Else {
+               Return (Arg1)
+       }
+}
+
+Method(SLEN, 1)
+{
+       Store(Arg0, Local0)
+       Return (Sizeof(Local0))
+}
+
+Method(S2BF, 1, Serialized)
+{
+       Add(SLEN(Arg0), One, Local0)
+       Name(BUFF, Buffer(Local0) {})
+       Store(Arg0, BUFF)
+       Return (BUFF)
+}
+
+/*
+ * SCMP - Strong string compare
+ *
+ * Checks both length and content
+ */
+Method(SCMP, 2)
+{
+       Store(S2BF(Arg0), Local0)
+       Store(S2BF(Arg1), Local1)
+       Store(Zero, Local4)
+       Store(SLEN(Arg0), Local5)
+       Store(SLEN(Arg1), Local6)
+       Store(MIN(Local5, Local6), Local7)
+
+       While (LLess(Local4, Local7)) {
+               Store(Derefof(Index(Local0, Local4)), Local2)
+               Store(Derefof(Index(Local1, Local4)), Local3)
+               If (LGreater(Local2, Local3)) {
+                       Return (One)
+               } Else {
+                       If (LLess(Local2, Local3)) {
+                               Return (Ones)
+                       }
+               }
+               Increment(Local4)
+       }
+
+       If (LLess(Local4, Local5)) {
+               Return (One)
+       } Else {
+               If (LLess(Local4, Local6)) {
+                       Return (Ones)
+               } Else {
+                       Return (Zero)
+               }
+       }
+}
+
+/*
+ * WCMP - Weak string compare
+ *
+ * Checks to find Arg1 at beginning of Arg0.
+ * Fails if length(Arg0) < length(Arg1).
+ * Returns 0 on fail, 1 on pass.
+ */
+Method(WCMP, 2)
+{
+       Store(S2BF(Arg0), Local0)
+       Store(S2BF(Arg1), Local1)
+       If (LLess(SLEN(Arg0), SLEN(Arg1))) {
+               Return (Zero)
+       }
+       Store(Zero, Local2)
+       Store(SLEN(Arg1), Local3)
+
+       While (LLess(Local2, Local3)) {
+               If (LNotEqual(Derefof(Index(Local0, Local2)),
+                       Derefof(Index(Local1, Local2)))) {
+                       Return (Zero)
+               }
+               Increment(Local2)
+       }
+
+       Return (One)
+}
+
+/*
+ * I2BM - Returns Bit Map
+ *
+ * Arg0 = IRQ Number (0-15)
+ */
+Method(I2BM, 1)
+{
+       Store(0, Local0)
+       If (LNotEqual(Arg0, 0)) {
+               Store(1, Local1)
+               ShiftLeft(Local1, Arg0, Local0)
+       }
+
+       Return (Local0)
+}
diff --git a/arch/x86/include/asm/acpi/statdef.asl b/arch/x86/include/asm/acpi/statdef.asl
new file mode 100644 (file)
index 0000000..e8cff10
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/arch/x86/acpi/statdef.asl
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+/* Status and notification definitions */
+
+#define STA_MISSING            0x00
+#define STA_PRESENT            0x01
+#define STA_ENABLED            0x03
+#define STA_DISABLED           0x09
+#define STA_INVISIBLE          0x0b
+#define STA_UNAVAILABLE                0x0d
+#define STA_VISIBLE            0x0f
+
+/* SMBus status codes */
+#define SMB_OK                 0x00
+#define SMB_UNKNOWN_FAIL       0x07
+#define SMB_DEV_ADDR_NAK       0x10
+#define SMB_DEVICE_ERROR       0x11
+#define SMB_DEV_CMD_DENIED     0x12
+#define SMB_UNKNOWN_ERR                0x13
+#define SMB_DEV_ACC_DENIED     0x17
+#define SMB_TIMEOUT            0x18
+#define SMB_HST_UNSUPP_PROTOCOL        0x19
+#define SMB_BUSY               0x1a
+#define SMB_PKT_CHK_ERROR      0x1f
+
+/* Device Object Notification Values */
+#define NOTIFY_BUS_CHECK       0x00
+#define NOTIFY_DEVICE_CHECK    0x01
+#define NOTIFY_DEVICE_WAKE     0x02
+#define NOTIFY_EJECT_REQUEST   0x03
+#define NOTIFY_DEVICE_CHECK_JR 0x04
+#define NOTIFY_FREQUENCY_ERROR 0x05
+#define NOTIFY_BUS_MODE                0x06
+#define NOTIFY_POWER_FAULT     0x07
+#define NOTIFY_CAPABILITIES    0x08
+#define NOTIFY_PLD_CHECK       0x09
+#define NOTIFY_SLIT_UPDATE     0x0b
+#define NOTIFY_SRA_UPDATE      0x0d
+
+/* Battery Device Notification Values */
+#define NOTIFY_BAT_STATUSCHG   0x80
+#define NOTIFY_BAT_INFOCHG     0x81
+#define NOTIFY_BAT_MAINTDATA   0x82
+
+/* Power Source Object Notification Values */
+#define NOTIFY_PWR_STATUSCHG   0x80
+#define NOTIFY_PWR_INFOCHG     0x81
+
+/* Thermal Zone Object Notification Values */
+#define NOTIFY_TZ_STATUSCHG    0x80
+#define NOTIFY_TZ_TRIPPTCHG    0x81
+#define NOTIFY_TZ_DEVLISTCHG   0x82
+#define NOTIFY_TZ_RELTBLCHG    0x83
+
+/* Power Button Notification Values */
+#define NOTIFY_POWER_BUTTON    0x80
+
+/* Sleep Button Notification Values */
+#define NOTIFY_SLEEP_BUTTON    0x80
+
+/* Lid Notification Values */
+#define NOTIFY_LID_STATUSCHG   0x80
+
+/* Processor Device Notification Values */
+#define NOTIFY_CPU_PPCCHG      0x80
+#define NOTIFY_CPU_CSTATECHG   0x81
+#define NOTIFY_CPU_THROTLCHG   0x82
+
+/* User Presence Device Notification Values */
+#define NOTIFY_USR_PRESNCECHG  0x80
+
+/* Ambient Light Sensor Notification Values */
+#define NOTIFY_ALS_ILLUMCHG    0x80
+#define NOTIFY_ALS_COLORTMPCHG 0x81
+#define NOTIFY_ALS_RESPCHG     0x82