diff options
Diffstat (limited to 'src/vendorcode/amd/cimx/sb900/Debug.c')
-rwxr-xr-x | src/vendorcode/amd/cimx/sb900/Debug.c | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/src/vendorcode/amd/cimx/sb900/Debug.c b/src/vendorcode/amd/cimx/sb900/Debug.c new file mode 100755 index 0000000000..76d63b86b3 --- /dev/null +++ b/src/vendorcode/amd/cimx/sb900/Debug.c @@ -0,0 +1,203 @@ +/*;******************************************************************************** +; +; Copyright (c) 2011, Advanced Micro Devices, Inc. +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions are met: +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; * Neither the name of Advanced Micro Devices, Inc. nor the names of +; its contributors may be used to endorse or promote products derived +; from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +; DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY +; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +; +;*********************************************************************************/ + +#include "SbPlatform.h" + +#define COM_BASE_ADDRESS 0x3f8 +#define DIVISOR 115200 +#define LF 0x0a +#define CR 0x0d + + +#ifdef CIM_DEBUG + +VOID SendBytePort (IN UINT8 Data); +VOID SendStringPort (IN CHAR8* pstr); +VOID ItoA (IN UINT32 Value, IN UINT32 Radix, IN CHAR8* pstr); + +#ifndef CIM_DEBUG_LEVEL + #define CIM_DEBUG_LEVEL 0xf +#endif + +VOID +TraceCode ( + IN UINT32 Level, + IN UINT32 Code + ) +{ + if ( ! (Level & CIM_DEBUG_LEVEL) ) { + return; + } +#if CIM_DEBUG & 1 + if ( Code != 0xFF ) { + WriteIO (0x80, AccWidthUint8, &Code); + } +#endif +} + + +VOID +TraceDebug ( + IN UINT32 Level, + IN CHAR8 *Format, + ) +{ + CHAR8 temp[16]; + va_list ArgList; + UINT32 Radix; + + if ( ! (Level & CIM_DEBUG_LEVEL) ) { + return; + } + +#if CIM_DEBUG & 2 + ArgList = va_start (ArgList, Format); + Format = (CHAR8*) (Format); + while ( 1 ) { + if ( *Format == 0 ) { + break; + } + if ( *Format == ' % ' ) { + Radix = 0; + if ( *(Format + 1) == 's' || *(Format + 1) == 'S' ) { + SendStringPort ((CHAR8*) (va_arg (ArgList, CHAR8*))); + Format += 2; + continue; + } + + if ( *(Format + 1) == 'd' || *(Format + 1) == 'D' ) { + Radix = 10; + } + if ( *(Format + 1) == 'x' || *(Format + 1) == 'X' ) { + Radix = 16; + } + if ( Radix ) { + ItoA (va_arg (ArgList, intqq), Radix, temp); + SendStringPort (temp); + Format += 2; + continue; + } + } + SendBytePort (*Format); + if ( *(Format) == 0x0a ) { + SendBytePort (0x0d); + } + Format++; + } + va_end (ArgList); +#endif +} + + +VOID +ItoA ( + IN UINT32 Value, + IN UINT32 Radix, + IN CHAR8* pstr + ) +{ + CHAR8* tsptr; + CHAR8* rsptr; + CHAR8 ch1; + CHAR8 ch2; + UINT32 Reminder; + tsptr = pstr; + rsptr = pstr; +//Create String + do { + Reminder = Value % Radix; + Value = Value / Radix; + if ( Reminder < 0xa ) { + *tsptr = Reminder + '0'; + } else { + *tsptr = Reminder - 0xa + 'a'; + } + tsptr++; + } while ( Value ); +//Reverse String + *tsptr = 0; + tsptr--; + while ( tsptr > rsptr ) { + ch1 = *tsptr; + ch2 = *rsptr; + *rsptr = ch1; + *tsptr = ch2; + tsptr--; + rsptr++; + } +} + +VOID +InitSerialOut ( + ) +{ + UINT8 Data; + UINT16 Divisor; + Data = 0x87; + WriteIO (COM_BASE_ADDRESS + 0x3, AccWidthUint8, &Data); + Divisor = 115200 / DIVISOR; + Data = Divisor & 0xFF; + WriteIO (COM_BASE_ADDRESS + 0x00, AccWidthUint8, &Data); + Data = Divisor >> 8; + WriteIO (COM_BASE_ADDRESS + 0x01, AccWidthUint8, &Data); + Data = 0x07; + WriteIO (COM_BASE_ADDRESS + 0x3, AccWidthUint8, &Data); +} + + +VOID +SendStringPort ( + IN CHAR8* pstr + ) +{ + + while ( *pstr! = 0 ) { + SendBytePort (*pstr); + pstr++; + } +} + +VOID +SendBytePort ( + IN UINT8 Data + ) +{ + INT8 Count; + UINT8 Status; + Count = 80; + do { + ReadIO ((COM_BASE_ADDRESS + 0x05), AccWidthUint8, &Status); + if ( Status == 0xff ) { + break; + } + // Loop port is ready + } while ( (Status & 0x20) == 0 && (--Count) != 0 ); + WriteIO (COM_BASE_ADDRESS + 0x00, AccWidthUint8, &Data); +} +#endif |