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