| /*;******************************************************************************** |
| ; |
| ; 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 |