/** @file Library for Board Init. @copyright Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include IIO_UDS *mIioUds; /** Connects Root Bridge **/ VOID ConnectRootBridge ( BOOLEAN Recursive ); VOID ProgramDPRregs ( VOID ); /** A hook for board-specific initialization after PCI enumeration. @retval EFI_SUCCESS The board initialization was successful. @retval EFI_NOT_READY The board has not been detected yet. **/ EFI_STATUS EFIAPI BoardInitAfterPciEnumeration ( VOID ) { return EFI_SUCCESS; } /** A hook for board-specific functionality for the ReadyToBoot event. @retval EFI_SUCCESS The board initialization was successful. @retval EFI_NOT_READY The board has not been detected yet. **/ EFI_STATUS EFIAPI BoardInitReadyToBoot ( VOID ) { return EFI_SUCCESS; } /** A hook for board-specific functionality for the ExitBootServices event. @retval EFI_SUCCESS The board initialization was successful. @retval EFI_NOT_READY The board has not been detected yet. **/ EFI_STATUS EFIAPI BoardInitEndOfFirmware ( VOID ) { return EFI_SUCCESS; } /** This function will retrieve the DPR data from HOBs produced by MRC and will use it to program the DPR registers in IIO and in PCH @param VOID @retval VOID **/ VOID ProgramDprRegs ( VOID ) { return; } /** Function to set the WPE bit of the BIOS Info Flags MSR to enable Anti-Flash wearout protection within BIOS Guard before booting to the OS @param[in] EFI_EVENT Event @param[in] VOID *Context @retval None **/ VOID EFIAPI EnableAntiFlashWearout ( EFI_EVENT Event, VOID *Context ) { EFI_STATUS Status; EFI_MP_SERVICES_PROTOCOL *MpServices = NULL; SYSTEM_CONFIGURATION SetupData; DYNAMIC_SI_LIBARY_PROTOCOL *DynamicSiLibraryProtocol = NULL; Status = gBS->LocateProtocol (&gDynamicSiLibraryProtocolGuid, NULL, &DynamicSiLibraryProtocol); if (EFI_ERROR (Status)) { ASSERT_EFI_ERROR (Status); return; } CopyMem (&SetupData, PcdGetPtr(PcdSetup), sizeof(SYSTEM_CONFIGURATION)); // // First check if Anti-flash wearout feature is supported by platform and Setup variable is enabled // if (SetupData.AntiFlashWearoutSupported == TRUE && SetupData.EnableAntiFlashWearout) { Status = gBS->LocateProtocol ( &gEfiMpServiceProtocolGuid, NULL, (VOID **) &MpServices ); ASSERT_EFI_ERROR(Status); // // Set WPE on BSP, then all other APs // DynamicSiLibraryProtocol->SetBiosInfoFlagWpe(); MpServices->StartupAllAPs ( MpServices, (EFI_AP_PROCEDURE) DynamicSiLibraryProtocol->SetBiosInfoFlagWpe, FALSE, NULL, 0, NULL, NULL ); } } /** Before console after trusted console event callback @param[in] Event The Event this notify function registered to. @param[in] Context Pointer to the context data registered to the Event. **/ VOID BdsBoardBeforeConsoleAfterTrustedConsoleCallback ( IN EFI_EVENT Event, IN VOID *Context ) { EFI_STATUS Status; VOID *Interface; DEBUG ((DEBUG_INFO, "Board gBdsEventBeforeConsoleBeforeEndOfDxeGuid callback starts\n")); // // make sure root bridge is already connected before EndOfDxe. // Try to locate gEfiPciEnumerationCompleteProtocolGuid to see if PciBus scan already executed. // Status = gBS->LocateProtocol ( &gEfiPciEnumerationCompleteProtocolGuid, NULL, &Interface ); if (EFI_ERROR (Status)) { ConnectRootBridge (FALSE); } } EFI_STATUS EFIAPI BoardNotificationInit ( VOID ) { EFI_STATUS Status; EFI_EVENT EndOfDxeEvent; UINT32 BspCpuidSignature; UINT32 RegEax, RegEbx, RegEcx, RegEdx; EFI_HOB_GUID_TYPE *GuidHob; IIO_UDS *UdsHobPtr; EFI_BOOT_MODE BootMode; EFI_GUID UniversalDataGuid = IIO_UNIVERSAL_DATA_GUID; EFI_EVENT BeforeConsoleAfterTrustedConsoleEvent; DYNAMIC_SI_LIBARY_PROTOCOL *DynamicSiLibraryProtocol = NULL; Status = gBS->LocateProtocol (&gDynamicSiLibraryProtocolGuid, NULL, &DynamicSiLibraryProtocol); if (EFI_ERROR (Status)) { ASSERT_EFI_ERROR (Status); return Status; } DEBUG((DEBUG_INFO, "PlatformEarlyDxeEntry \n")); // // Get the IIO_UDS data HOB // GuidHob = GetFirstGuidHob (&UniversalDataGuid); ASSERT(GuidHob != NULL); if (GuidHob == NULL) { return EFI_NOT_FOUND; } UdsHobPtr = GET_GUID_HOB_DATA(GuidHob); // // Allocate Memory Pool buffer for IIO_UDS data // Status = gBS->AllocatePool ( EfiBootServicesData, sizeof (IIO_UDS), (VOID **) &mIioUds ); ASSERT_EFI_ERROR (Status); // // Initialize the Memory Pool buffer with the data from the Hand-Off-Block // CopyMem(mIioUds, UdsHobPtr, sizeof(IIO_UDS)); // // Get the boot mode that we are currently in // BootMode = GetBootModeHob(); // // Program DPR registers with the range from Memory Init // ProgramDprRegs (); // // Program the GenProtRange registers for BIOS Guard // DynamicSiLibraryProtocol->ProgramGenProtRangeRegs (mIioUds); // // Program the IMR registers for ME IMR region // DynamicSiLibraryProtocol->ProgramImrRegs (mIioUds); // // Program the IMR2 registers for CPM & nCPM IMR region // DynamicSiLibraryProtocol->ProgramImr2Regs (mIioUds); // // Get BSP CPU ID // Shift out the stepping // AsmCpuid (0x01, &RegEax, &RegEbx, &RegEcx, &RegEdx); BspCpuidSignature = (RegEax >> 4) & 0x0000FFFF; if ( (BspCpuidSignature == CPU_FAMILY_SKX) && (BootMode != BOOT_ON_FLASH_UPDATE)) { // // Register event to set WPE bit in Bios Info Flags MSR to enable Anti Flash wearout // Status = gBS->CreateEventEx ( EVT_NOTIFY_SIGNAL, TPL_CALLBACK, EnableAntiFlashWearout, NULL, &gEfiEndOfDxeEventGroupGuid, &EndOfDxeEvent ); ASSERT_EFI_ERROR (Status); } // // Create BeforeConsoleAfterTrustedConsole event callback // Status = gBS->CreateEventEx ( EVT_NOTIFY_SIGNAL, TPL_CALLBACK, BdsBoardBeforeConsoleAfterTrustedConsoleCallback, NULL, &gBdsEventBeforeConsoleAfterTrustedConsoleGuid, &BeforeConsoleAfterTrustedConsoleEvent ); ASSERT_EFI_ERROR (Status); return Status; }