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