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