aboutsummaryrefslogtreecommitdiff
path: root/src/vendorcode/amd/cimx/rd890/amdDebugOutLib.c
diff options
context:
space:
mode:
authorKerry Sheh <shekairui@gmail.com>2012-01-31 20:39:37 +0800
committerPatrick Georgi <patrick@georgi-clan.de>2012-02-02 13:54:36 +0100
commit9292d89be84d6abf9257ddb872887d4f53b2a00e (patch)
tree9eaa548f1742745f57fc92a12734649fec8db1cd /src/vendorcode/amd/cimx/rd890/amdDebugOutLib.c
parent17670866a0d12839bc2a4c852210ccf11d3cb4b2 (diff)
RD890 Northbridge: AMD RD890/SR56X0 Northbridge CIMX code
Change-Id: If9908ffeb5b707a660db38dc44f5118347cbcc06 Signed-off-by: Kerry Sheh <kerry.she@amd.com> Signed-off-by: Kerry Sheh <shekairui@gmail.com> Reviewed-on: http://review.coreboot.org/557 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
Diffstat (limited to 'src/vendorcode/amd/cimx/rd890/amdDebugOutLib.c')
-rw-r--r--src/vendorcode/amd/cimx/rd890/amdDebugOutLib.c436
1 files changed, 436 insertions, 0 deletions
diff --git a/src/vendorcode/amd/cimx/rd890/amdDebugOutLib.c b/src/vendorcode/amd/cimx/rd890/amdDebugOutLib.c
new file mode 100644
index 0000000000..f40852b7e5
--- /dev/null
+++ b/src/vendorcode/amd/cimx/rd890/amdDebugOutLib.c
@@ -0,0 +1,436 @@
+/**
+ * @file
+ *
+ * Debug out functions.
+ *
+ *
+ *
+ * @xrefitem bom "File Content Label" "Release Content"
+ * @e project: Common Library
+ * @e sub-project:
+ * @e \$Revision:$ @e \$Date:$
+ *
+ */
+/*****************************************************************************
+ *
+ * Copyright (C) 2012 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.
+ *
+ *
+ ***************************************************************************/
+/*----------------------------------------------------------------------------------------
+ * M O D U L E S U S E D
+ *----------------------------------------------------------------------------------------
+ */
+#include "AGESA.h"
+#include "amdlib.h"
+#include "amdDebugOutLib.h"
+/*----------------------------------------------------------------------------------------
+ * D E F I N I T I O N S A N D M A C R O S
+ *----------------------------------------------------------------------------------------
+ */
+#define COM_BASE_ADDRESS 0x3f8
+#define DIVISOR 115200
+#define LF 0x0a
+#define CR 0x0d
+
+typedef CHAR8 *va_list;
+#ifndef _INTSIZEOF
+#define _INTSIZEOF(n)( (sizeof(n) + sizeof(UINTN) - 1) & ~(sizeof(UINTN) - 1) )
+#endif
+#ifndef va_start
+#define va_start(ap, v) ( ap = (va_list)&(v) + _INTSIZEOF(v) )
+#endif
+#ifndef va_arg
+#define va_arg(ap, t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
+#endif
+#ifndef va_end
+#define va_end(ap) ( ap = (va_list)0 )
+#endif
+
+/*----------------------------------------------------------------------------------------
+ * T Y P E D E F S A N D S T R U C T U R E S
+ *----------------------------------------------------------------------------------------
+ */
+
+typedef struct {
+ UINT8 Index;
+ CHAR8 Buffer[256];
+} StringBuffer;
+
+/*----------------------------------------------------------------------------------------
+ * P R O T O T Y P E S O F L O C A L F U N C T I O N S
+ *----------------------------------------------------------------------------------------
+ */
+
+VOID
+SendByteToBuffer (
+ IN OUT StringBuffer *Buffer,
+ IN CHAR8 Data
+ );
+
+VOID
+SendStringToBuffer (
+ OUT StringBuffer *Buffer,
+ IN CHAR8 *pstr
+ );
+
+VOID
+SendBufferToDebugOut (
+ IN CHAR8* Buffer
+ );
+
+VOID
+ItoA (
+ IN UINT32 Value,
+ IN UINTN Radix,
+ OUT CHAR8 *pstr
+ );
+
+VOID
+SendBufferToHdtOut (
+ IN CHAR8* Buffer
+ );
+
+VOID
+SendBufferToSerialOut (
+ IN CHAR8* Buffer
+ );
+
+VOID
+InitDebugOut (VOID);
+
+VOID
+InitSerialOut (VOID);
+
+/*----------------------------------------------------------------------------------------
+ * E X P O R T E D F U N C T I O N S
+ *----------------------------------------------------------------------------------------
+ */
+
+
+/*----------------------------------------------------------------------------------------*/
+/**
+ * Send format string to debug out
+ *
+ *
+ *
+ * @param[in] pConfig
+ *
+ */
+
+VOID
+LibAmdTraceDebug (
+ IN UINT32 Level,
+ IN CHAR8 *Format,
+ IN ...
+ )
+{
+ CHAR8 TemBuffer[16];
+ UINT8 Index;
+ StringBuffer Buffer;
+ va_list ArgList;
+ if (Level == 0) {
+ return;
+ }
+ Buffer.Index = 0;
+ Index = 1;
+ va_start (ArgList, Format);
+ while (Index != 0) {
+ if (*Format == 0) break;
+ if (*Format == '%') {
+ INT32 Radix;
+ Radix = 0;
+ if (*(Format + 1) == 'd' || *(Format + 1) == 'D') {
+ Radix = 10;
+ }
+ if (*(Format + 1) == 'x' || *(Format + 1) == 'X' ) {
+ Radix = 16;
+ }
+ if (Radix != 0) {
+ ItoA (va_arg (ArgList, INT32), Radix, TemBuffer);
+ SendStringToBuffer (&Buffer, TemBuffer);
+ Format += 2;
+ continue;
+ }
+ }
+ SendByteToBuffer (&Buffer, *Format);
+ if (*(Format) == 0x0a) SendByteToBuffer (&Buffer, 0x0d);
+ Format++;
+ }
+ SendBufferToDebugOut (&Buffer.Buffer[0]);
+ va_end (ArgList);
+}
+
+
+/*----------------------------------------------------------------------------------------*/
+/**
+ * Write string to message buffer
+ *
+ *
+ *
+ * @param[in] pConfig
+ *
+ */
+
+VOID
+SendStringToBuffer (
+ OUT StringBuffer *Buffer,
+ IN CHAR8 *pstr
+ )
+{
+ while (*pstr != 0) {
+ SendByteToBuffer (Buffer, *pstr);
+ pstr++;
+ }
+}
+
+/*----------------------------------------------------------------------------------------*/
+/**
+ * Write byte to message buffer
+ *
+ *
+ *
+ * @param[in] pConfig
+ *
+ */
+
+VOID
+SendByteToBuffer (
+ IN OUT StringBuffer *Buffer,
+ IN CHAR8 Data
+ )
+{
+ if (Buffer->Index < 255) {
+ Buffer->Buffer[Buffer->Index] = Data;
+ Buffer->Buffer[++Buffer->Index] = 0;
+ } else {
+ SendBufferToDebugOut (Buffer->Buffer);
+ Buffer->Index = 0;
+ }
+}
+
+/*----------------------------------------------------------------------------------------*/
+/**
+ * Integer To String
+ *
+ *
+ *
+ * @param[in] pConfig
+ *
+ */
+
+VOID
+ItoA (
+ IN UINT32 Value,
+ IN UINTN Radix,
+ OUT CHAR8 *pstr
+ )
+{
+ CHAR8 *tsptr;
+ CHAR8 *rsptr;
+ CHAR8 ch1;
+ CHAR8 ch2;
+ UINTN Reminder;
+
+ tsptr = pstr;
+ rsptr = pstr;
+//Create String
+ do {
+ Reminder = Value % Radix;
+ Value = Value / Radix;
+ if (Reminder < 0xa) {
+ *tsptr = (UINT8)Reminder + '0';
+ } else {
+ *tsptr = (UINT8)Reminder - 0xa + 'a';
+ }
+ tsptr++;
+ } while (Value != 0);
+//Reverse String
+ *tsptr = 0;
+ tsptr--;
+ while (tsptr > rsptr) {
+ ch1 = *tsptr;
+ ch2 = *rsptr;
+ *rsptr = ch1;
+ *tsptr = ch2;
+ tsptr--;
+ rsptr++;
+ }
+}
+
+/*----------------------------------------------------------------------------------------*/
+/**
+ * Init debug Output
+ *
+ *
+ *
+ * @param[in] pConfig
+ *
+ */
+VOID
+InitDebugOut (
+ VOID
+ )
+{
+#ifdef SERIAL_OUT_SUPPORT
+ InitSerialOut ();
+#endif
+}
+
+/*----------------------------------------------------------------------------------------*/
+/**
+ * Init Serial Output
+ *
+ *
+ *
+ * @param[in] pConfig
+ *
+ */
+VOID
+InitSerialOut (
+ VOID
+ )
+{
+ UINT8 Data;
+ UINT16 Divisor;
+
+ Data = 0x87;
+ LibAmdIoWrite (AccessWidth8, COM_BASE_ADDRESS + 0x3, &Data, NULL);
+ Divisor = 115200 / DIVISOR;
+ Data = (UINT8) (Divisor & 0xFF);
+ LibAmdIoWrite (AccessWidth8 , COM_BASE_ADDRESS + 0x00, &Data, NULL);
+ Data = (UINT8) (Divisor >> 8);
+ LibAmdIoWrite (AccessWidth8, COM_BASE_ADDRESS + 0x01, &Data, NULL);
+ Data = 0x07;
+ LibAmdIoWrite (AccessWidth8, COM_BASE_ADDRESS + 0x3, &Data, NULL);
+}
+
+/*----------------------------------------------------------------------------------------*/
+/**
+ * Init HDT Output
+ *
+ *
+ *
+ * @param[in] pConfig
+ *
+ */
+
+
+/*----------------------------------------------------------------------------------------*/
+/**
+ * Send Buffer to debug Output
+ *
+ *
+ *
+ * @param[in] pConfig
+ *
+ */
+VOID
+SendBufferToDebugOut (
+ IN CHAR8* Buffer
+ )
+{
+#ifdef HDT_OUT_SUPPORT
+ SendBufferToHdtOut (Buffer);
+#endif
+
+#ifdef SERIAL_OUT_SUPPORT
+ SendBufferToSerialOut (Buffer);
+#endif
+}
+
+#ifdef HDT_OUT_SUPPORT
+/*----------------------------------------------------------------------------------------*/
+/**
+ * Send Buffer to debug Output
+ *
+ *
+ *
+ * @param[in] pConfig
+ *
+ */
+VOID
+SendBufferToHdtOut (
+ IN CHAR8* Buffer
+ )
+{
+ UINT32 Dr0Reg;
+ UINT32 Dr7Reg;
+ UINT32 Cr4Reg;
+ UINT64 MsrCurrentValue;
+ UINT64 MsrNewValue;
+
+ // Save the CPU debug registers for restoration at the end of the routine
+ LibAmdMsrRead (0xC001100A, &MsrCurrentValue, NULL);
+ LibAmdReadCpuReg (DR0_REG, &Dr0Reg);
+ LibAmdReadCpuReg (DR7_REG, &Dr7Reg);
+ LibAmdReadCpuReg (CR4_REG, &Cr4Reg);
+
+ //Modify the registers for HDT out
+ LibAmdWriteCpuReg (DR0_REG, 0x8F0);
+ LibAmdWriteCpuReg (DR7_REG, 0x20402);
+ LibAmdWriteCpuReg (CR4_REG, Cr4Reg | 0x8);
+ MsrNewValue = MsrCurrentValue | BIT0;
+ LibAmdMsrWrite (0xC001100A, &MsrNewValue, NULL);
+
+ //HDT out
+ LibAmdIoWrite (AccessWidth32, 0x8F0, &Buffer, NULL);
+
+ // Restore the CPU debug registers
+ LibAmdWriteCpuReg (CR4_REG, Cr4Reg);
+ LibAmdWriteCpuReg (DR7_REG, Dr7Reg);
+ LibAmdWriteCpuReg (DR0_REG, Dr0Reg);
+ LibAmdMsrWrite (0xC001100A, &MsrCurrentValue, NULL);
+}
+#endif
+/*----------------------------------------------------------------------------------------*/
+/**
+ * Send Buffer to debug Output
+ *
+ *
+ *
+ * @param[in] pConfig
+ *
+ */
+VOID
+SendBufferToSerialOut (
+ IN CHAR8* Buffer
+ )
+{
+ UINT8 Status;
+ UINT32 Count;
+
+ Count = 10000;
+ while (*Buffer != 0) {
+ do {
+ LibAmdIoRead (AccessWidth8, COM_BASE_ADDRESS + 0x05, &Status, NULL);
+ if (Status == 0xff) return;
+ // Loop port is ready
+ } while ((Status & 0x20) == 0 && (--Count) != 0);
+ LibAmdIoWrite (AccessWidth8, COM_BASE_ADDRESS + 0x00, Buffer, NULL);
+ Buffer++;
+ }
+}