xref: /openbmc/u-boot/arch/x86/include/asm/acpi/debug.asl (revision b28c5fcc)
1/*
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}
137