/** @file
Platform Hooks file
@copyright
Copyright 1999 - 2021 Intel Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
UINT8
IsSimPlatform (VOID)
{
return 0;
}
/**
Read Aspeed AHB register.
@param RegIndex: register index of Aspeed.
@retval value of register.
**/
UINT32
ReadAHBDword (
UINT32 RegIndex
)
{
UINT8 bValue;
UINT32 rdValue = 0;
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, REG_LOGICAL_DEVICE);
IoWrite8 (0xED, 0);//short delay.
IoWrite8 (ASPEED2500_SIO_DATA_PORT, ASPEED2500_SIO_SMI);
IoWrite8 (0xED, 0);//short delay.
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, 0x30);
IoWrite8 (0xED, 0);//short delay.
IoWrite8 (ASPEED2500_SIO_DATA_PORT, 1);
IoWrite8 (0xED, 0);//short delay.
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, 0xf8);
bValue = IoRead8(ASPEED2500_SIO_DATA_PORT);
bValue &= 0xfc;
bValue |= 2; // 4 byte window.
IoWrite8 (ASPEED2500_SIO_DATA_PORT, bValue);
IoWrite8 (0xED, 0);//short delay.
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, 0xf0);
IoWrite8 (0xED, 0);//short delay.
IoWrite8 (ASPEED2500_SIO_DATA_PORT, (UINT8)((RegIndex >> 24)& 0xff));
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, 0xf1);
IoWrite8 (0xED, 0);//short delay.
IoWrite8 (ASPEED2500_SIO_DATA_PORT, (UINT8)((RegIndex >> 16)& 0xff));
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, 0xf2);
IoWrite8 (0xED, 0);//short delay.
IoWrite8 (ASPEED2500_SIO_DATA_PORT, (UINT8)((RegIndex >> 8) & 0xff));
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, 0xf3);
IoWrite8 (0xED, 0);//short delay.
IoWrite8 (ASPEED2500_SIO_DATA_PORT, (UINT8)((RegIndex )& 0xff));
// trigger read
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, 0xfe);
IoRead8 (ASPEED2500_SIO_DATA_PORT);
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, 0xf4);
rdValue += IoRead8 (ASPEED2500_SIO_DATA_PORT);
rdValue <<= 8;
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, 0xf5);
rdValue += IoRead8 (ASPEED2500_SIO_DATA_PORT);
rdValue <<= 8;
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, 0xf6);
rdValue += IoRead8 (ASPEED2500_SIO_DATA_PORT);
rdValue <<= 8;
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, 0xf7);
rdValue += IoRead8 (ASPEED2500_SIO_DATA_PORT);
return rdValue;
}
/**
* Checks for the presence of ASPEED SIO
* @return TRUE if its present. FALSE if not.
*/
BOOLEAN
IsAspeedPresent (
VOID
)
{
BOOLEAN PresenceStatus = FALSE;
//
//ASPEED AST2500/AST2600
//
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, ASPEED2500_SIO_UNLOCK);
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, ASPEED2500_SIO_UNLOCK);
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, REG_LOGICAL_DEVICE);
IoWrite8 (ASPEED2500_SIO_DATA_PORT, ASPEED2500_SIO_UART1);
if (IoRead8 (ASPEED2500_SIO_DATA_PORT) == ASPEED2500_SIO_UART1) {
//
// In ESPI mode, assume this SIO logic device always present.
//
#ifdef ESPI_ENABLE
PresenceStatus = TRUE;
#else
//
//There is a Aspeed card need to support as well. it's type is AST2500 A1 EVB.
//
//AST2300-A0 0x01000003
//AST2300-A1 0x01010303
//AST1300-A1 0x01010003
//AST1050-A1 0x01010203
//AST2400-A0 0x02000303
//AST2400-A1 0x02010303
//AST1400-A1 0x02010103
//AST1250-A1 0x02010303
//AST2500-A0 0x04000303
//AST2510-A0 0x04000103
//AST2520-A0 0x04000203
//AST2530-A0 0x04000403
//AST2500-A1 0x04010303
//AST2510-A1 0x04010103
//AST2520-A1 0x04010203
//AST2530-A1 0x04010403
//
if ((ReadAHBDword (SCU7C) & 0xff0000ff) == 0x04000003) {
PresenceStatus = TRUE;
}
#endif
}
IoWrite8 (ASPEED2500_SIO_INDEX_PORT, ASPEED2500_SIO_LOCK);
return PresenceStatus;
}
/**
* Checks for the presence of Nuvoton SIO
* @return TRUE if its present. FALSE if not.
*/
BOOLEAN
IsNuvotonPresent (
VOID
)
{
BOOLEAN PresenceStatus = FALSE;
//
// Nuvoton NCT5104D
//
IoWrite8 (NCT5104D_SIO_INDEX_PORT, NCT5104D_ENTER_THE_EXTENDED_FUNCTION_MODE);
IoWrite8 (NCT5104D_SIO_INDEX_PORT, NCT5104D_ENTER_THE_EXTENDED_FUNCTION_MODE);
IoWrite8 (NCT5104D_SIO_INDEX_PORT, NCT5104D_CHIP_ID_REG);
if (IoRead8 (NCT5104D_SIO_DATA_PORT) == NCT5104D_CHIP_ID) {
PresenceStatus = TRUE;
}
return PresenceStatus;
}
/**
* Checks for the presence of the following SIO:
* -ASPEED AST2500
* -Nuvoton NCT5104D
*
* @return An UINT32 with the corresponding bit set for each SIO.
* -ASPEED_EXIST BIT4
* -NCT5104D_EXIST BIT3
* -PC8374_EXIST BIT1
* -PILOTIV_EXIST BIT0
*/
UINT32
IsSioExist (
VOID
)
{
UINT32 SioExit = 0;
if (IsAspeedPresent ()) {
SioExit |= ASPEED_EXIST;
}
if (IsNuvotonPresent ()) {
SioExit |= NCT5104D_EXIST;
}
DEBUG((DEBUG_INFO, "[SIO] Current system SIO exist bit:%x \n", SioExit));
return SioExit;
}