/** @file
This file contains routines for GPIO native and chipset specific purpose
used by Reference Code only.
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//
// Chipset specific data
//
//ISH
extern GPIO_PAD_NATIVE_FUNCTION mPchLpIshGPGpio[PCH_ISH_MAX_GP_PINS];
extern GPIO_PAD_NATIVE_FUNCTION mPchHIshGPGpio[PCH_ISH_MAX_GP_PINS];
extern GPIO_PAD_NATIVE_FUNCTION mPchLpIshI2cGpio[PCH_ISH_MAX_I2C_CONTROLLERS][PCH_ISH_PINS_PER_I2C_CONTROLLER];
extern GPIO_PAD_NATIVE_FUNCTION mPchHIshI2cGpio[PCH_ISH_MAX_I2C_CONTROLLERS][PCH_ISH_PINS_PER_I2C_CONTROLLER];
extern GPIO_PAD_NATIVE_FUNCTION mPchLpIshUartGpio[PCH_ISH_MAX_UART_CONTROLLERS][PCH_ISH_PINS_PER_UART_CONTROLLER];
extern GPIO_PAD_NATIVE_FUNCTION mPchHIshUartGpio[PCH_ISH_MAX_UART_CONTROLLERS][PCH_ISH_PINS_PER_UART_CONTROLLER];
extern GPIO_PAD_NATIVE_FUNCTION mPchLpIshSpiGpio[PCH_ISH_PINS_PER_SPI_CONTROLLER];
extern GPIO_PAD_NATIVE_FUNCTION mPchHIshSpiGpio[PCH_ISH_PINS_PER_SPI_CONTROLLER];
//PCIe SRCCLKREQB
extern GPIO_PAD_NATIVE_FUNCTION mPchLpPcieSrcClkReqbPinToGpioMap[PCH_LP_PCIE_MAX_CLK_REQ];
extern GPIO_PAD_NATIVE_FUNCTION mPchHPcieSrcClkReqbPinToGpioMap[PCH_H_PCIE_MAX_CLK_REQ];
//PCH_HOT
extern GPIO_PAD_NATIVE_FUNCTION mPchLpPchHotbPin;
extern GPIO_PAD_NATIVE_FUNCTION mPchHPchHotbPin;
//CPU GP
extern GPIO_PAD_NATIVE_FUNCTION mPchLpCpuGpPinMap[4];
extern GPIO_PAD_NATIVE_FUNCTION mPchHCpuGpPinMap[4];
/**
This function sets ISH I2C controller pins into native mode
@param[in] IshI2cControllerNumber I2C controller
@retval Status
**/
EFI_STATUS
GpioSetIshI2cPinsIntoNativeMode (
IN UINT32 IshI2cControllerNumber
)
{
EFI_STATUS Status;
UINTN Index;
GPIO_PAD_NATIVE_FUNCTION (*I2cGpio) [PCH_ISH_PINS_PER_I2C_CONTROLLER];
Status = EFI_SUCCESS;
if (GetPchSeries () == PchLp) {
I2cGpio = mPchLpIshI2cGpio;
} else {
I2cGpio = mPchHIshI2cGpio;
}
ASSERT (IshI2cControllerNumber < PCH_ISH_MAX_I2C_CONTROLLERS);
for (Index = 0; Index < PCH_ISH_PINS_PER_I2C_CONTROLLER; Index++) {
Status = SetGpioPadMode (I2cGpio[IshI2cControllerNumber][Index].Pad, I2cGpio[IshI2cControllerNumber][Index].Mode);
if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED;
}
}
return Status;
}
/**
This function sets ISH UART controller pins into native mode
@param[in] IshUartControllerNumber UART controller
@retval Status
**/
EFI_STATUS
GpioSetIshUartPinsIntoNativeMode (
IN UINT32 IshUartControllerNumber
)
{
EFI_STATUS Status;
UINTN Index;
GPIO_PAD_NATIVE_FUNCTION (*UartGpio) [PCH_ISH_PINS_PER_UART_CONTROLLER];
Status = EFI_SUCCESS;
if (GetPchSeries () == PchLp) {
UartGpio = mPchLpIshUartGpio;
} else {
UartGpio = mPchHIshUartGpio;
}
ASSERT (IshUartControllerNumber < PCH_ISH_MAX_UART_CONTROLLERS);
for (Index = 0; Index < PCH_ISH_PINS_PER_UART_CONTROLLER; Index++) {
Status = SetGpioPadMode (UartGpio[IshUartControllerNumber][Index].Pad, UartGpio[IshUartControllerNumber][Index].Mode);
if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED;
}
}
return Status;
}
/**
This function sets ISH SPI controller pins into native mode
@param[in] none
@retval Status
**/
EFI_STATUS
GpioSetIshSpiPinsIntoNativeMode (
VOID
)
{
EFI_STATUS Status;
UINTN Index;
GPIO_PAD_NATIVE_FUNCTION *SpiGpio;
Status = EFI_SUCCESS;
if (GetPchSeries () == PchLp) {
SpiGpio = mPchLpIshSpiGpio;
} else {
SpiGpio = mPchHIshSpiGpio;
}
for (Index = 0; Index < PCH_ISH_PINS_PER_SPI_CONTROLLER; Index++) {
Status = SetGpioPadMode (SpiGpio[Index].Pad, SpiGpio[Index].Mode);
if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED;
}
}
return Status;
}
/**
This function sets ISH GP pins into native mode
@param[in] IshGpPinNumber ISH GP pin number
@retval Status
**/
EFI_STATUS
GpioSetIshGpPinsIntoNativeMode (
IN UINT32 IshGpPinNumber
)
{
EFI_STATUS Status;
GPIO_PAD_NATIVE_FUNCTION *IshGp;
Status = EFI_SUCCESS;
if (GetPchSeries () == PchLp) {
IshGp = mPchLpIshGPGpio;
} else {
IshGp = mPchHIshGPGpio;
}
ASSERT (IshGpPinNumber < PCH_ISH_MAX_GP_PINS);
Status = SetGpioPadMode (IshGp[IshGpPinNumber].Pad, IshGp[IshGpPinNumber].Mode);
if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED;
}
return Status;
}
/**
Returns a pad for given CLKREQ# index.
@param[in] ClkreqIndex CLKREQ# number
@return CLKREQ# pad.
**/
GPIO_PAD
GpioGetClkreqPad (
IN UINT32 ClkreqIndex
)
{
if (GetPchSeries () == PchLp) {
ASSERT (ClkreqIndex < PCH_LP_PCIE_MAX_CLK_REQ);
return mPchLpPcieSrcClkReqbPinToGpioMap[ClkreqIndex].Pad;
} else {
ASSERT (ClkreqIndex < PCH_H_PCIE_MAX_CLK_REQ);
return mPchHPcieSrcClkReqbPinToGpioMap[ClkreqIndex].Pad;
}
}
/**
Enables CLKREQ# pad in native mode.
@param[in] ClkreqIndex CLKREQ# number
@return none
**/
VOID
GpioEnableClkreq (
IN UINT32 ClkreqIndex
)
{
GPIO_CONFIG PadConfig;
GPIO_PAD ClkreqPad;
GPIO_PAD_MODE PadMode;
ZeroMem (&PadConfig, sizeof (PadConfig));
if (GetPchSeries () == PchLp) {
ASSERT (ClkreqIndex < PCH_LP_PCIE_MAX_CLK_REQ);
ClkreqPad = mPchLpPcieSrcClkReqbPinToGpioMap[ClkreqIndex].Pad;
PadMode = mPchLpPcieSrcClkReqbPinToGpioMap[ClkreqIndex].Mode;
} else {
ASSERT (ClkreqIndex < PCH_H_PCIE_MAX_CLK_REQ);
ClkreqPad = mPchHPcieSrcClkReqbPinToGpioMap[ClkreqIndex].Pad;
PadMode = mPchHPcieSrcClkReqbPinToGpioMap[ClkreqIndex].Mode;
}
PadConfig.PadMode = PadMode;
PadConfig.Direction = GpioDirNone;
PadConfig.PowerConfig = GpioHostDeepReset;
DEBUG ((DEBUG_INFO, "Enabling CLKREQ%d\n", ClkreqIndex));
GpioSetPadConfig (ClkreqPad, &PadConfig);
}
/**
This function checks if GPIO pin for PCHHOTB is in NATIVE MODE
@param[in] none
@retval TRUE Pin is in PCHHOTB native mode
FALSE Pin is in gpio mode or is not owned by HOST
**/
BOOLEAN
GpioIsPchHotbPinInNativeMode (
VOID
)
{
EFI_STATUS Status;
GPIO_PAD_NATIVE_FUNCTION PchHotbPin;
GPIO_PAD_MODE GpioMode;
if (GetPchSeries () == PchLp) {
PchHotbPin = mPchLpPchHotbPin;
} else {
PchHotbPin = mPchHPchHotbPin;
}
Status = GetGpioPadMode (PchHotbPin.Pad, &GpioMode);
if ((EFI_ERROR (Status)) || (GpioMode != PchHotbPin.Mode)) {
return FALSE;
} else {
return TRUE;
}
}
/**
This function sets CPU GP pins into native mode
@param[in] CpuGpPinNum CPU GP pin number
@retval Status
**/
EFI_STATUS
GpioSetCpuGpPinsIntoNativeMode (
IN UINT32 CpuGpPinNum
)
{
EFI_STATUS Status;
GPIO_PAD_NATIVE_FUNCTION *CpuGpPins;
if (GetPchSeries () == PchLp) {
CpuGpPins = mPchLpCpuGpPinMap;
} else {
CpuGpPins = mPchHCpuGpPinMap;
}
ASSERT (CpuGpPinNum < 4);
Status = SetGpioPadMode (CpuGpPins[CpuGpPinNum].Pad, CpuGpPins[CpuGpPinNum].Mode);
if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED;
}
return EFI_SUCCESS;
}