blob: aa755567b11d5e0ae4347793555db80652ca3330 [file] [log] [blame]
/**
* @file
*
* Southbridge EC IO access common routine
*
*/
/*;********************************************************************************
;
; 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"
#include "cbtypes.h"
#include "AmdSbLib.h"
VOID
ReadECmsg (
IN UINT8 Address,
IN UINT8 OpFlag,
OUT VOID* Value
)
{
UINT8 i;
OpFlag = OpFlag & 0x7f;
if (OpFlag == 0x02) OpFlag = 0x03;
WriteIo8((UINT16) (0x3E), Address); // EC_LDN9_MAILBOX_BASE_ADDRESS
i = ReadIo8((UINT16) (0x3F)); // EC_LDN9_MAILBOX_BASE_ADDRESS
*((UINT8*) (Value)) = i;
}
VOID
WriteECmsg (
IN UINT8 Address,
IN UINT8 OpFlag,
IN VOID* Value
)
{
UINT8 i;
OpFlag = OpFlag & 0x7f;
if (OpFlag == 0x02) OpFlag = 0x03;
WriteIo8(0x3E, Address); // EC_LDN9_MAILBOX_BASE_ADDRESS
i = *(UINT8*)Value;
WriteIo8(0x3F, i); // EC_LDN9_MAILBOX_BASE_ADDRESS
}
VOID
WaitForEcLDN9MailboxCmdAck (
VOID
)
{
UINT8 Msgdata;
UINT16 Delaytime;
Msgdata = 0;
for (Delaytime = 0; Delaytime <= 500; Delaytime++) {
ReadECmsg (MSG_REG0, AccWidthUint8, &Msgdata);
if ( Msgdata == 0xfa) {
break;
}
cimSbStall (1000); // Wait for 1ms
}
}
/**
* imcDisableSurebootTimer - IMC Disable Sureboot Timer.
*
*
* @param[in] pConfig Southbridge configuration structure pointer.
*
*/
VOID
imcDisableSurebootTimer (
IN AMDSBCFG* pConfig
)
{
UINT8 Msgdata;
if (!(isImcEnabled ()) ) {
return; //IMC is not enabled
}
Msgdata = 0x00;
WriteECmsg (MSG_REG0, AccWidthUint8, &Msgdata);
Msgdata = 0x01;
WriteECmsg (MSG_REG1, AccWidthUint8, &Msgdata);
Msgdata = 0x00;
WriteECmsg (MSG_REG2, AccWidthUint8, &Msgdata);
Msgdata = 0x94;
WriteECmsg (MSG_SYS_TO_IMC, AccWidthUint8, &Msgdata);
WaitForEcLDN9MailboxCmdAck ();
}
/**
* imcDisarmSurebootTimer - IMC Disarm Sureboot Timer.
*
*
* @param[in] pConfig Southbridge configuration structure pointer.
*
*/
VOID
imcDisarmSurebootTimer (
IN AMDSBCFG* pConfig
)
{
imcDisableSurebootTimer (pConfig);
pConfig->imc.imcSureBootTimer = 0;
}
/**
* imcEnableSurebootTimer - IMC Enable Sureboot Timer.
*
*
* @param[in] pConfig Southbridge configuration structure pointer.
*
*/
VOID
imcEnableSurebootTimer (
IN AMDSBCFG* pConfig
)
{
UINT8 Msgdata;
imcDisableSurebootTimer (pConfig);
Msgdata = 0x00;
if (!(isImcEnabled ()) || (pConfig->imc.imcSureBootTimer == 0)) {
return; //IMC is not enabled
}
WriteECmsg (MSG_REG0, AccWidthUint8, &Msgdata);
Msgdata = 0x01;
WriteECmsg (MSG_REG1, AccWidthUint8, &Msgdata);
Msgdata = ( (pConfig->imc.imcSureBootTimer) << 6) -1;
WriteECmsg (MSG_REG2, AccWidthUint8, &Msgdata);
Msgdata = 0x94;
WriteECmsg (MSG_SYS_TO_IMC, AccWidthUint8, &Msgdata);
WaitForEcLDN9MailboxCmdAck ();
}
/**
* imcSleep - IMC Sleep.
*
*
* @param[in] pConfig Southbridge configuration structure pointer.
*
*/
VOID
imcSleep (
IN AMDSBCFG* pConfig
)
{
UINT8 Msgdata;
if (!(isImcEnabled ()) ) {
return; //IMC is not enabled
}
Msgdata = 0x00;
WriteECmsg (MSG_REG0, AccWidthUint8, &Msgdata);
Msgdata = 0xB4;
WriteECmsg (MSG_REG1, AccWidthUint8, &Msgdata);
Msgdata = 0x00;
WriteECmsg (MSG_REG2, AccWidthUint8, &Msgdata);
Msgdata = 0x96;
WriteECmsg (MSG_SYS_TO_IMC, AccWidthUint8, &Msgdata);
WaitForEcLDN9MailboxCmdAck ();
}
/**
* imcWakeup - IMC Wakeup.
*
*
* @param[in] pConfig Southbridge configuration structure pointer.
*
*/
VOID
imcWakeup (
IN AMDSBCFG* pConfig
)
{
UINT8 Msgdata;
if (!(isImcEnabled ()) ) {
return; //IMC is not enabled
}
Msgdata = 0x00;
WriteECmsg (MSG_REG0, AccWidthUint8, &Msgdata);
Msgdata = 0xB5;
WriteECmsg (MSG_REG1, AccWidthUint8, &Msgdata);
Msgdata = 0x00;
WriteECmsg (MSG_REG2, AccWidthUint8, &Msgdata);
Msgdata = 0x96;
WriteECmsg (MSG_SYS_TO_IMC, AccWidthUint8, &Msgdata);
WaitForEcLDN9MailboxCmdAck ();
}
/**
* imcIdle - IMC Idle.
*
*
* @param[in] pConfig Southbridge configuration structure pointer.
*
*/
VOID
imcIdle (
IN AMDSBCFG* pConfig
)
{
UINT8 Msgdata;
if (!(isImcEnabled ()) ) {
return; //IMC is not enabled
}
Msgdata = 0x00;
WriteECmsg (MSG_REG0, AccWidthUint8, &Msgdata);
Msgdata = 0x01;
WriteECmsg (MSG_REG1, AccWidthUint8, &Msgdata);
Msgdata = 0x00;
WriteECmsg (MSG_REG2, AccWidthUint8, &Msgdata);
Msgdata = 0x98;
WriteECmsg (MSG_SYS_TO_IMC, AccWidthUint8, &Msgdata);
WaitForEcLDN9MailboxCmdAck ();
}
VOID
imcThermalZoneEnable (
IN AMDSBCFG* pConfig
)
{
UINT8 Msgdata;
UINT8 ZoneNum;
BOOLEAN IsSendEcMsg;
if (!(isImcEnabled ()) ) {
return; //IMC is not enabled
}
for ( ZoneNum = 0; ZoneNum < 4; ZoneNum++ ) {
IsSendEcMsg = IsZoneFuncEnable (pConfig->Pecstruct.IMCFUNSupportBitMap, 0, ZoneNum);
if (IsSendEcMsg) {
Msgdata = 0x00;
WriteECmsg (MSG_REG0, AccWidthUint8, &Msgdata);
Msgdata = ZoneNum;
WriteECmsg (MSG_REG1, AccWidthUint8, &Msgdata);
Msgdata = 0x80;
WriteECmsg (MSG_SYS_TO_IMC, AccWidthUint8, &Msgdata);
WaitForEcLDN9MailboxCmdAck ();
Msgdata = 0x00;
WriteECmsg (MSG_REG0, AccWidthUint8, &Msgdata);
Msgdata = ZoneNum;
WriteECmsg (MSG_REG1, AccWidthUint8, &Msgdata);
ReadECmsg (MSG_REG2, AccWidthUint8, &Msgdata);
Msgdata |= BIT0;
WriteECmsg (MSG_REG2, AccWidthUint8, &Msgdata);
Msgdata = 0x81;
WriteECmsg (MSG_SYS_TO_IMC, AccWidthUint8, &Msgdata);
WaitForEcLDN9MailboxCmdAck ();
}
}
}