blob: 8e7b603ba0f64935213aca1afc7d29999364f18f [file] [log] [blame]
Bin Meng9e70a112016-05-07 07:46:29 -07001/*
2 * Copyright (C) 2008 Advanced Micro Devices, Inc.
3 * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
4 *
5 * Modified from coreboot src/arch/x86/acpi/debug.asl
6 *
7 * SPDX-License-Identifier: GPL-2.0+
8 */
9
10/* POST register region */
11OperationRegion(X80, SystemIO, 0x80, 1)
12Field(X80, ByteAcc, NoLock, Preserve)
13{
14 P80, 8
15}
16
17/* Legacy serial port register region */
18OperationRegion(CREG, SystemIO, 0x3F8, 8)
19Field(CREG, ByteAcc, NoLock, Preserve)
20{
21 CDAT, 8,
22 CDLM, 8,
23 , 8,
24 CLCR, 8,
25 CMCR, 8,
26 CLSR, 8
27}
28
29/* DINI - Initialize the serial port to 115200 8-N-1 */
30Method(DINI)
31{
32 Store(0x83, CLCR)
33 Store(0x01, CDAT) /* 115200 baud (low) */
34 Store(0x00, CDLM) /* 115200 baud (high) */
35 Store(0x03, CLCR) /* word=8 stop=1 parity=none */
36 Store(0x03, CMCR) /* DTR=1 RTS=1 out1/2=Off loop=Off */
37 Store(0x00, CDLM) /* turn off interrupts */
38}
39
40/* THRE - Wait for serial port transmitter holding register to go empty */
41Method(THRE)
42{
43 And(CLSR, 0x20, Local0)
44 While (LEqual(Local0, Zero)) {
45 And(CLSR, 0x20, Local0)
46 }
47}
48
49/* OUTX - Send a single raw character */
50Method(OUTX, 1)
51{
52 THRE()
53 Store(Arg0, CDAT)
54}
55
56/* OUTC - Send a single character, expanding LF into CR/LF */
57Method(OUTC, 1)
58{
59 If (LEqual(Arg0, 0x0a)) {
60 OUTX(0x0d)
61 }
62 OUTX(Arg0)
63}
64
65/* DBGN - Send a single hex nibble */
66Method(DBGN, 1)
67{
68 And(Arg0, 0x0f, Local0)
69 If (LLess(Local0, 10)) {
70 Add(Local0, 0x30, Local0)
71 } Else {
72 Add(Local0, 0x37, Local0)
73 }
74 OUTC(Local0)
75}
76
77/* DBGB - Send a hex byte */
78Method(DBGB, 1)
79{
80 ShiftRight(Arg0, 4, Local0)
81 DBGN(Local0)
82 DBGN(Arg0)
83}
84
85/* DBGW - Send a hex word */
86Method(DBGW, 1)
87{
88 ShiftRight(Arg0, 8, Local0)
89 DBGB(Local0)
90 DBGB(Arg0)
91}
92
93/* DBGD - Send a hex dword */
94Method(DBGD, 1)
95{
96 ShiftRight(Arg0, 16, Local0)
97 DBGW(Local0)
98 DBGW(Arg0)
99}
100
101/* Get a char from a string */
102Method(GETC, 2)
103{
104 CreateByteField(Arg0, Arg1, DBGC)
105 Return (DBGC)
106}
107
108/* DBGO - Send either a string or an integer */
109Method(DBGO, 1, Serialized)
110{
111 If (LEqual(ObjectType(Arg0), 1)) {
112 If (LGreater(Arg0, 0xffff)) {
113 DBGD(Arg0)
114 } Else {
115 If (LGreater(Arg0, 0xff)) {
116 DBGW(Arg0)
117 } Else {
118 DBGB(Arg0)
119 }
120 }
121 } Else {
122 Name(BDBG, Buffer(80) {})
123 Store(Arg0, BDBG)
124 Store(0, Local1)
125 While (One) {
126 Store(GETC(BDBG, Local1), Local0)
127 If (LEqual(Local0, 0)) {
128 Return (Zero)
129 }
130 OUTC(Local0)
131 Increment(Local1)
132 }
133 }
134
135 Return (Zero)
136}