/** @file
@copyright
Copyright 2012 - 2021 Intel Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//
// UBA and GPIO headers
//
#include
#include
/**
Function gets pointers to the UBA data installed by the right RP package
@param[out] GpioParams The pointer to the platform GPIO parameters
@retval EFI_SUCCESS The function completed successfully
**/
EFI_STATUS
PlatformGetGpioPlatformMappings (
IN OUT PLATFORM_GPIO_CONFIG_TABLE *GpioParams
)
{
EFI_STATUS Status;
UBA_CONFIG_DATABASE_PPI *UbaConfigPpi = NULL;
UINTN TableSize;
Status = PeiServicesLocatePpi (&gUbaConfigDatabasePpiGuid, 0, NULL, &UbaConfigPpi);
if (EFI_ERROR (Status)) {
return Status;
}
TableSize = sizeof(PLATFORM_GPIO_CONFIG_TABLE);
Status = UbaConfigPpi->GetData (
UbaConfigPpi,
&gPlatformGpioPlatformConfigDataGuid,
GpioParams,
&TableSize
);
return Status;
}
/**
Reads GPIO pin to get Flash Security Override jumper status
@param[out] Jumper - The pointer to the jumper output
@retval Status - Success if GPIO's are read properly
Jumper - 0x0 if an error happened, otherwise the jumperl value
**/
EFI_STATUS
GpioGetFlashSecOvrdVal (
OUT UINT32 *Jumper
)
{
EFI_STATUS Status;
PLATFORM_GPIO_CONFIG_TABLE GpioPlatformConfig;
DYNAMIC_SI_LIBARY_PPI *DynamicSiLibraryPpi = NULL;
Status = PeiServicesLocatePpi (&gDynamicSiLibraryPpiGuid, 0, NULL, &DynamicSiLibraryPpi);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
*Jumper = 0x0;
Status = PlatformGetGpioPlatformMappings (&GpioPlatformConfig);
if (EFI_ERROR (Status)) {
return Status;
}
if (GpioPlatformConfig.FlashSecOverride == UNUSED_GPIO) {
return EFI_UNSUPPORTED;
}
Status = DynamicSiLibraryPpi->GpioGetInputValue (GpioPlatformConfig.FlashSecOverride, Jumper);
return Status;
}
/**
Reads GPIO pin to get recovery jumper status
@param[out] RcvJumper - The pointer to the Recovery jumper input
@retval Status - Success if GPIO's are read properly
**/
EFI_STATUS
GpioGetRcvPadVal (
OUT UINT32 *RcvJumper
)
{
EFI_STATUS Status;
PLATFORM_GPIO_CONFIG_TABLE GpioPlatformConfig;
DYNAMIC_SI_LIBARY_PPI *DynamicSiLibraryPpi = NULL;
Status = PeiServicesLocatePpi (&gDynamicSiLibraryPpiGuid, 0, NULL, &DynamicSiLibraryPpi);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
Status = PlatformGetGpioPlatformMappings (&GpioPlatformConfig);
if (EFI_ERROR (Status)) {
return Status;
}
if (GpioPlatformConfig.RcvJumper == UNUSED_GPIO) {
return EFI_UNSUPPORTED;
}
Status = DynamicSiLibraryPpi->GpioGetInputValue (GpioPlatformConfig.RcvJumper, RcvJumper);
return Status;
}
/**
Reads GPIO pin to get FM ADR trigger pin
@param[out] FmAdrTrigger - The pointer to the ADR trigger input
@retval Status - Success if GPIO's are read properly
**/
EFI_STATUS
GpioGetFmAdrTriggerPadVal (
OUT UINT32 *FmAdrTrigger
)
{
EFI_STATUS Status;
PLATFORM_GPIO_CONFIG_TABLE GpioPlatformConfig;
DYNAMIC_SI_LIBARY_PPI *DynamicSiLibraryPpi = NULL;
Status = PeiServicesLocatePpi (&gDynamicSiLibraryPpiGuid, 0, NULL, &DynamicSiLibraryPpi);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
Status = PlatformGetGpioPlatformMappings (&GpioPlatformConfig);
if (EFI_ERROR (Status)) {
return Status;
}
if (GpioPlatformConfig.FmAdrTrigger == UNUSED_GPIO) {
return EFI_UNSUPPORTED;
}
Status = DynamicSiLibraryPpi->GpioGetInputValue (GpioPlatformConfig.FmAdrTrigger, FmAdrTrigger);
return Status;
}
/**
Sets GPIO pin to enable ADR on the board
@param Set[in] - If TRUE means the pas should go 'high', otherwise 'low'
@retval Status - Success if GPIO set properly
**/
EFI_STATUS
GpioSetAdrEnablePadOutVal (
IN BOOLEAN Set
)
{
EFI_STATUS Status;
PLATFORM_GPIO_CONFIG_TABLE GpioPlatformConfig;
DYNAMIC_SI_LIBARY_PPI *DynamicSiLibraryPpi = NULL;
Status = PeiServicesLocatePpi (&gDynamicSiLibraryPpiGuid, 0, NULL, &DynamicSiLibraryPpi);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
Status = PlatformGetGpioPlatformMappings (&GpioPlatformConfig);
if (EFI_ERROR(Status)) {
return Status;
}
if (GpioPlatformConfig.AdrEnable == UNUSED_GPIO) {
return EFI_UNSUPPORTED;
}
if (Set) {
Status = DynamicSiLibraryPpi->GpioSetOutputValue (GpioPlatformConfig.AdrEnable, GpioOutHigh);
}
else {
Status = DynamicSiLibraryPpi->GpioSetOutputValue (GpioPlatformConfig.AdrEnable, GpioOutLow);
}
return Status;
}
/**
Reads GPIO pin to Force to S1 config mode pad
@param[out] ForceS1ConfigPad - Input value of the Froce S1 Config pad
@retval Status - Success if GPIO's are read properly
**/
EFI_STATUS
GpioGetForcetoS1ConfigModePadVal (
OUT UINT32 *ForceS1ConfigPad
)
{
EFI_STATUS Status;
PLATFORM_GPIO_CONFIG_TABLE GpioPlatformConfig;
DYNAMIC_SI_LIBARY_PPI *DynamicSiLibraryPpi = NULL;
Status = PeiServicesLocatePpi (&gDynamicSiLibraryPpiGuid, 0, NULL, &DynamicSiLibraryPpi);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
Status = PlatformGetGpioPlatformMappings (&GpioPlatformConfig);
if (EFI_ERROR (Status)) {
return Status;
}
if (GpioPlatformConfig.ForceTo1SConfigModePad == UNUSED_GPIO) {
return EFI_UNSUPPORTED;
}
Status = DynamicSiLibraryPpi->GpioGetInputValue (GpioPlatformConfig.ForceTo1SConfigModePad, ForceS1ConfigPad);
return Status;
}
/**
Reads GPIO pin related to QAT
@param[out] QATPad - Input value of the QAT pad
@retval Status - Success if GPIO's are read properly
**/
EFI_STATUS
GpioGetQATPadVal (
OUT UINT32 *QATPad
)
{
EFI_STATUS Status;
PLATFORM_GPIO_CONFIG_TABLE GpioPlatformConfig;
DYNAMIC_SI_LIBARY_PPI *DynamicSiLibraryPpi = NULL;
Status = PeiServicesLocatePpi (&gDynamicSiLibraryPpiGuid, 0, NULL, &DynamicSiLibraryPpi);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
Status = PlatformGetGpioPlatformMappings (&GpioPlatformConfig);
if (EFI_ERROR (Status)) {
return Status;
}
if (GpioPlatformConfig.QATGpio == UNUSED_GPIO) {
return EFI_UNSUPPORTED;
}
Status = DynamicSiLibraryPpi->GpioGetInputValue (GpioPlatformConfig.QATGpio, QATPad);
return Status;
}
/**
Get GPIO pin for FPGA error detection RAS functionality
@param[out] FpgaErrorPad -The input value of the FPGA error 1 pad
@retval Status - Success if GPIO's pad read properly
**/
EFI_STATUS
GpioGetFpgaErrorPad1 (
OUT UINT32 *FpgaErrorPad
)
{
EFI_STATUS Status;
PLATFORM_GPIO_CONFIG_TABLE GpioPlatformConfig;
Status = PlatformGetGpioPlatformMappings (&GpioPlatformConfig);
if (EFI_ERROR (Status)) {
return Status;
}
if (GpioPlatformConfig.FpgaErrorSingnalPad1 == UNUSED_GPIO) {
return EFI_UNSUPPORTED;
}
*FpgaErrorPad = (UINT32) GpioPlatformConfig.FpgaErrorSingnalPad1;
return EFI_SUCCESS;
}
/**
Get GPIO pin for FPGA error detection RAS functionality
@param[out] FpgaErrorPad -The input value of the FPGA error 2 pad
@retval Status - Success if GPIO's pad read properly
**/
EFI_STATUS
GpioGetFpgaErrorPad2 (
OUT UINT32 *FpgaErrorPad
)
{
EFI_STATUS Status;
PLATFORM_GPIO_CONFIG_TABLE GpioPlatformConfig;
Status = PlatformGetGpioPlatformMappings (&GpioPlatformConfig);
if (EFI_ERROR (Status)) {
return Status;
}
if (GpioPlatformConfig.FpgaErrorSingnalPad2 == UNUSED_GPIO) {
return EFI_UNSUPPORTED;
}
*FpgaErrorPad = (UINT32) GpioPlatformConfig.FpgaErrorSingnalPad2;
return Status;
}
/**
Get GPIO pin for CPU HP SMI detection for RAS functionality
@retval Status - Success if GPIO's pad read properly
**/
EFI_STATUS
GpioGetCpuHpSmiPad (
OUT UINT32 *CpuHpSmiPad
)
{
EFI_STATUS Status;
PLATFORM_GPIO_CONFIG_TABLE GpioPlatformConfig;
Status = PlatformGetGpioPlatformMappings (&GpioPlatformConfig);
if (EFI_ERROR (Status)) {
return Status;
}
if (GpioPlatformConfig.CpuHpSmiPad == UNUSED_GPIO) {
return EFI_UNSUPPORTED;
}
*CpuHpSmiPad = (UINT32) GpioPlatformConfig.CpuHpSmiPad;
return Status;
}
/**
Reads GPIO pin that is first bit of the Board ID indication word
@retval Status - Success if GPIO's are read properly
**/
EFI_STATUS
GpioGetBoardId0PadVal (
OUT UINT32 *BoardID0Gpio
)
{
EFI_STATUS Status;
PLATFORM_GPIO_CONFIG_TABLE GpioPlatformConfig;
DYNAMIC_SI_LIBARY_PPI *DynamicSiLibraryPpi = NULL;
Status = PeiServicesLocatePpi (&gDynamicSiLibraryPpiGuid, 0, NULL, &DynamicSiLibraryPpi);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
Status = PlatformGetGpioPlatformMappings (&GpioPlatformConfig);
if (EFI_ERROR (Status)) {
return Status;
}
if (GpioPlatformConfig.BoardID0Gpio == UNUSED_GPIO) {
return EFI_UNSUPPORTED;
}
Status = DynamicSiLibraryPpi->GpioGetInputValue (GpioPlatformConfig.BoardID0Gpio, BoardID0Gpio);
return Status;
}
/**
Sets GPIO's used for Boot Mode
@param None
@retval Status - Success if GPIO's are configured
**/
EFI_STATUS
GpioConfigForMFGMode (
VOID
)
{
EFI_STATUS Status;
PLATFORM_GPIO_CONFIG_TABLE GpioPlatformConfig;
DYNAMIC_SI_LIBARY_PPI *DynamicSiLibraryPpi = NULL;
Status = PeiServicesLocatePpi (&gDynamicSiLibraryPpiGuid, 0, NULL, &DynamicSiLibraryPpi);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
Status = PlatformGetGpioPlatformMappings (&GpioPlatformConfig);
if (EFI_ERROR (Status)) {
return Status;
}
if (GpioPlatformConfig.GpioMfgPad.GpioPad == UNUSED_GPIO) {
return EFI_UNSUPPORTED;
}
DEBUG ((EFI_D_INFO, "Start ConfigureGpio() for BootMode Detection.\n"));
Status = DynamicSiLibraryPpi->GpioSetPadConfig (GpioPlatformConfig.GpioMfgPad.GpioPad, &GpioPlatformConfig.GpioMfgPad.GpioConfig);
ASSERT_EFI_ERROR (Status);
DEBUG ((EFI_D_INFO, "End ConfigureGpio() for BootMode Detection.\n"));
return Status;
}
/**
Checks whether the MDF jumper has been set
@param None
@retval ManufacturingMode - TRUE when MFG jumper is on, FALSE otherwise
**/
BOOLEAN
IsManufacturingMode (
VOID
)
{
BOOLEAN ManufacturingMode = TRUE;
EFI_STATUS Status;
UINT32 GpiValue;
PLATFORM_GPIO_CONFIG_TABLE GpioPlatformConfig;
DYNAMIC_SI_LIBARY_PPI *DynamicSiLibraryPpi = NULL;
Status = PeiServicesLocatePpi (&gDynamicSiLibraryPpiGuid, 0, NULL, &DynamicSiLibraryPpi);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return FALSE;
}
Status = PlatformGetGpioPlatformMappings (&GpioPlatformConfig);
ASSERT_EFI_ERROR (Status);
if (GpioPlatformConfig.GpioMfgPad.GpioPad == UNUSED_GPIO) {
return FALSE;
}
Status = GpioConfigForMFGMode ();
ASSERT_EFI_ERROR (Status);
Status = DynamicSiLibraryPpi->GpioGetInputValue (GpioPlatformConfig.GpioMfgPad.GpioPad, &GpiValue);
ASSERT_EFI_ERROR (Status);
if (!GpiValue) {
ManufacturingMode = FALSE;
}
return ManufacturingMode;
}