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