/** @file
Source code file for TBT Init PEI module
Copyright (c) 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*
/**
This function Update and Print PEI TBT Policy after TbtPolicyBoardInitDone
@param[in] PeiServices Pointer to PEI Services Table.
@param[in] NotifyDesc Pointer to the descriptor for the Notification event that
caused this function to execute.
@param[in] Ppi Pointer to the PPI data associated with this function.
@retval EFI_SUCCESS The function completes successfully
@retval others
**/
/**
This function pass PEI TBT Policy to Hob at the end of PEI
@param[in] PeiServices Pointer to PEI Services Table.
@param[in] NotifyDesc Pointer to the descriptor for the Notification event that
caused this function to execute.
@param[in] Ppi Pointer to the PPI data associated with this function.
@retval EFI_SUCCESS The function completes successfully
@retval others
**/
EFI_STATUS
EFIAPI
PassTbtPolicyToHob (
VOID
)
{
EFI_STATUS Status;
EFI_BOOT_MODE BootMode;
TBT_INFO_HOB *TbtInfoHob;
PEI_TBT_POLICY *PeiTbtConfig;
DEBUG ((DEBUG_INFO, "PassTbtPolicyToHob\n"));
Status = PeiServicesGetBootMode (&BootMode);
ASSERT_EFI_ERROR (Status);
if (BootMode == BOOT_ON_S3_RESUME ) {
return EFI_SUCCESS;
}
Status = PeiServicesLocatePpi (
&gPeiTbtPolicyPpiGuid,
0,
NULL,
(VOID **) &PeiTbtConfig
);
if (EFI_ERROR(Status)) {
DEBUG ((DEBUG_ERROR, " gPeiTbtPolicyPpiGuid Not installed!!!\n"));
}
ASSERT_EFI_ERROR (Status);
//
// Create HOB for TBT Data
//
Status = PeiServicesCreateHob (
EFI_HOB_TYPE_GUID_EXTENSION,
sizeof (TBT_INFO_HOB),
(VOID **) &TbtInfoHob
);
DEBUG ((DEBUG_INFO, "TbtInfoHob Created \n"));
ASSERT_EFI_ERROR (Status);
//
// Initialize the TBT INFO HOB data.
//
TbtInfoHob->EfiHobGuidType.Name = gTbtInfoHobGuid;
//
// Update DTBT Policy
//
TbtInfoHob-> DTbtControllerConfig.DTbtControllerEn = PeiTbtConfig-> DTbtControllerConfig.DTbtControllerEn;
TbtInfoHob-> DTbtControllerConfig.Type = PeiTbtConfig-> DTbtControllerConfig.Type;
TbtInfoHob-> DTbtControllerConfig.PcieRpNumber = PeiTbtConfig-> DTbtControllerConfig.PcieRpNumber;
TbtInfoHob-> DTbtControllerConfig.ForcePwrGpio.GpioPad = PeiTbtConfig-> DTbtControllerConfig.ForcePwrGpio.GpioPad;
TbtInfoHob-> DTbtControllerConfig.ForcePwrGpio.GpioLevel = PeiTbtConfig-> DTbtControllerConfig.ForcePwrGpio.GpioLevel;
TbtInfoHob-> DTbtControllerConfig.CioPlugEventGpio.GpioPad = PeiTbtConfig-> DTbtControllerConfig.CioPlugEventGpio.GpioPad;
TbtInfoHob-> DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignature = PeiTbtConfig-> DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignature;
TbtInfoHob-> DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignaturePorting = PeiTbtConfig-> DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignaturePorting;
TbtInfoHob-> DTbtControllerConfig.PcieRstGpio.GpioPad = PeiTbtConfig-> DTbtControllerConfig.PcieRstGpio.GpioPad;
TbtInfoHob-> DTbtControllerConfig.PcieRstGpio.GpioLevel = PeiTbtConfig-> DTbtControllerConfig.PcieRstGpio.GpioLevel;
TbtInfoHob->DTbtCommonConfig.TbtBootOn = PeiTbtConfig->DTbtCommonConfig.TbtBootOn;
TbtInfoHob->DTbtCommonConfig.TbtUsbOn = PeiTbtConfig->DTbtCommonConfig.TbtUsbOn;
TbtInfoHob->DTbtCommonConfig.Gpio3ForcePwr = PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwr;
TbtInfoHob->DTbtCommonConfig.Gpio3ForcePwrDly = PeiTbtConfig->DTbtCommonConfig.Gpio3ForcePwrDly;
TbtInfoHob->DTbtCommonConfig.DTbtSharedGpioConfiguration = PeiTbtConfig->DTbtCommonConfig.DTbtSharedGpioConfiguration;
TbtInfoHob->DTbtCommonConfig.PcieRstSupport = PeiTbtConfig->DTbtCommonConfig.PcieRstSupport;
return EFI_SUCCESS;
}
/**
This function handles TbtInit task at the end of PEI
@param[in] PeiServices Pointer to PEI Services Table.
@param[in] NotifyDesc Pointer to the descriptor for the Notification event that
caused this function to execute.
@param[in] Ppi Pointer to the PPI data associated with this function.
@retval EFI_SUCCESS The function completes successfully
@retval others
**/
EFI_STATUS
EFIAPI
TbtInitEndOfPei (
VOID
)
{
EFI_STATUS Status;
BOOLEAN DTbtExisted;
PEI_TBT_POLICY *PeiTbtConfig;
DEBUG ((DEBUG_INFO, "TbtInitEndOfPei Entry\n"));
Status = EFI_SUCCESS;
PeiTbtConfig = NULL;
DTbtExisted = FALSE;
Status = PeiServicesLocatePpi (
&gPeiTbtPolicyPpiGuid,
0,
NULL,
(VOID **) &PeiTbtConfig
);
if (EFI_ERROR(Status)) {
DEBUG ((DEBUG_ERROR, " gPeiTbtPolicyPpiGuid Not installed!!!\n"));
}
ASSERT_EFI_ERROR (Status);
if (PeiTbtConfig-> DTbtControllerConfig.DTbtControllerEn == 1) {
DTbtExisted = TRUE;
}
if (DTbtExisted == TRUE) {
//
// Call Init function
//
Status = TbtInit ();
}
return EFI_SUCCESS;
}
/**
TBT Init PEI module entry point
@param[in] FileHandle Not used.
@param[in] PeiServices General purpose services available to every PEIM.
@retval EFI_SUCCESS The function completes successfully
@retval EFI_OUT_OF_RESOURCES Insufficient resources to create database
**/
EFI_STATUS
EFIAPI
TbtInitEntryPoint (
IN EFI_PEI_FILE_HANDLE FileHandle,
IN CONST EFI_PEI_SERVICES **PeiServices
)
{
EFI_STATUS Status;
DEBUG ((DEBUG_INFO, "TBT PEI EntryPoint\n"));
//
// Install PEI TBT Policy
//
Status = InstallPeiTbtPolicy ();
ASSERT_EFI_ERROR (Status);
UpdatePeiTbtPolicy ();
TbtPrintPeiPolicyConfig ();
//
// Performing PassTbtPolicyToHob and TbtInitEndOfPei
//
Status = PassTbtPolicyToHob ();
Status = TbtInitEndOfPei ();
return Status;
}