/** @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; }