xref: /openbmc/u-boot/arch/x86/include/asm/acpi/debug.asl (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini/* SPDX-License-Identifier: GPL-2.0+ */
29e70a116SBin Meng/*
39e70a116SBin Meng * Copyright (C) 2008 Advanced Micro Devices, Inc.
49e70a116SBin Meng * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
59e70a116SBin Meng *
69e70a116SBin Meng * Modified from coreboot src/arch/x86/acpi/debug.asl
79e70a116SBin Meng */
89e70a116SBin Meng
99e70a116SBin Meng/* POST register region */
109e70a116SBin MengOperationRegion(X80, SystemIO, 0x80, 1)
119e70a116SBin MengField(X80, ByteAcc, NoLock, Preserve)
129e70a116SBin Meng{
139e70a116SBin Meng	P80, 8
149e70a116SBin Meng}
159e70a116SBin Meng
169e70a116SBin Meng/* Legacy serial port register region */
179e70a116SBin MengOperationRegion(CREG, SystemIO, 0x3F8, 8)
189e70a116SBin MengField(CREG, ByteAcc, NoLock, Preserve)
199e70a116SBin Meng{
209e70a116SBin Meng	CDAT, 8,
219e70a116SBin Meng	CDLM, 8,
229e70a116SBin Meng	    , 8,
239e70a116SBin Meng	CLCR, 8,
249e70a116SBin Meng	CMCR, 8,
259e70a116SBin Meng	CLSR, 8
269e70a116SBin Meng}
279e70a116SBin Meng
289e70a116SBin Meng/* DINI - Initialize the serial port to 115200 8-N-1 */
299e70a116SBin MengMethod(DINI)
309e70a116SBin Meng{
319e70a116SBin Meng	Store(0x83, CLCR)
329e70a116SBin Meng	Store(0x01, CDAT)	/* 115200 baud (low) */
339e70a116SBin Meng	Store(0x00, CDLM)	/* 115200 baud (high) */
349e70a116SBin Meng	Store(0x03, CLCR)	/* word=8 stop=1 parity=none */
359e70a116SBin Meng	Store(0x03, CMCR)	/* DTR=1 RTS=1 out1/2=Off loop=Off */
369e70a116SBin Meng	Store(0x00, CDLM)	/* turn off interrupts */
379e70a116SBin Meng}
389e70a116SBin Meng
399e70a116SBin Meng/* THRE - Wait for serial port transmitter holding register to go empty */
409e70a116SBin MengMethod(THRE)
419e70a116SBin Meng{
429e70a116SBin Meng	And(CLSR, 0x20, Local0)
439e70a116SBin Meng	While (LEqual(Local0, Zero)) {
449e70a116SBin Meng		And(CLSR, 0x20, Local0)
459e70a116SBin Meng	}
469e70a116SBin Meng}
479e70a116SBin Meng
489e70a116SBin Meng/* OUTX - Send a single raw character */
499e70a116SBin MengMethod(OUTX, 1)
509e70a116SBin Meng{
519e70a116SBin Meng	THRE()
529e70a116SBin Meng	Store(Arg0, CDAT)
539e70a116SBin Meng}
549e70a116SBin Meng
559e70a116SBin Meng/* OUTC - Send a single character, expanding LF into CR/LF */
569e70a116SBin MengMethod(OUTC, 1)
579e70a116SBin Meng{
589e70a116SBin Meng	If (LEqual(Arg0, 0x0a)) {
599e70a116SBin Meng		OUTX(0x0d)
609e70a116SBin Meng	}
619e70a116SBin Meng	OUTX(Arg0)
629e70a116SBin Meng}
639e70a116SBin Meng
649e70a116SBin Meng/* DBGN - Send a single hex nibble */
659e70a116SBin MengMethod(DBGN, 1)
669e70a116SBin Meng{
679e70a116SBin Meng	And(Arg0, 0x0f, Local0)
689e70a116SBin Meng	If (LLess(Local0, 10)) {
699e70a116SBin Meng		Add(Local0, 0x30, Local0)
709e70a116SBin Meng	} Else {
719e70a116SBin Meng		Add(Local0, 0x37, Local0)
729e70a116SBin Meng	}
739e70a116SBin Meng	OUTC(Local0)
749e70a116SBin Meng}
759e70a116SBin Meng
769e70a116SBin Meng/* DBGB - Send a hex byte */
779e70a116SBin MengMethod(DBGB, 1)
789e70a116SBin Meng{
799e70a116SBin Meng	ShiftRight(Arg0, 4, Local0)
809e70a116SBin Meng	DBGN(Local0)
819e70a116SBin Meng	DBGN(Arg0)
829e70a116SBin Meng}
839e70a116SBin Meng
849e70a116SBin Meng/* DBGW - Send a hex word */
859e70a116SBin MengMethod(DBGW, 1)
869e70a116SBin Meng{
879e70a116SBin Meng	ShiftRight(Arg0, 8, Local0)
889e70a116SBin Meng	DBGB(Local0)
899e70a116SBin Meng	DBGB(Arg0)
909e70a116SBin Meng}
919e70a116SBin Meng
929e70a116SBin Meng/* DBGD - Send a hex dword */
939e70a116SBin MengMethod(DBGD, 1)
949e70a116SBin Meng{
959e70a116SBin Meng	ShiftRight(Arg0, 16, Local0)
969e70a116SBin Meng	DBGW(Local0)
979e70a116SBin Meng	DBGW(Arg0)
989e70a116SBin Meng}
999e70a116SBin Meng
1009e70a116SBin Meng/* Get a char from a string */
1019e70a116SBin MengMethod(GETC, 2)
1029e70a116SBin Meng{
1039e70a116SBin Meng	CreateByteField(Arg0, Arg1, DBGC)
1049e70a116SBin Meng	Return (DBGC)
1059e70a116SBin Meng}
1069e70a116SBin Meng
1079e70a116SBin Meng/* DBGO - Send either a string or an integer */
1089e70a116SBin MengMethod(DBGO, 1, Serialized)
1099e70a116SBin Meng{
1109e70a116SBin Meng	If (LEqual(ObjectType(Arg0), 1)) {
1119e70a116SBin Meng		If (LGreater(Arg0, 0xffff)) {
1129e70a116SBin Meng			DBGD(Arg0)
1139e70a116SBin Meng		} Else {
1149e70a116SBin Meng			If (LGreater(Arg0, 0xff)) {
1159e70a116SBin Meng				DBGW(Arg0)
1169e70a116SBin Meng			} Else {
1179e70a116SBin Meng				DBGB(Arg0)
1189e70a116SBin Meng			}
1199e70a116SBin Meng		}
1209e70a116SBin Meng	} Else {
1219e70a116SBin Meng		Name(BDBG, Buffer(80) {})
1229e70a116SBin Meng		Store(Arg0, BDBG)
1239e70a116SBin Meng		Store(0, Local1)
1249e70a116SBin Meng		While (One) {
1259e70a116SBin Meng			Store(GETC(BDBG, Local1), Local0)
1269e70a116SBin Meng			If (LEqual(Local0, 0)) {
1279e70a116SBin Meng				Return (Zero)
1289e70a116SBin Meng			}
1299e70a116SBin Meng			OUTC(Local0)
1309e70a116SBin Meng			Increment(Local1)
1319e70a116SBin Meng		}
1329e70a116SBin Meng	}
1339e70a116SBin Meng
1349e70a116SBin Meng	Return (Zero)
1359e70a116SBin Meng}
136