/** FSP notify phase 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 FspNotifyPhasePeimEntryPoint ( IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices ) { EFI_STATUS Status; VOID *OldDxeIplPpi; EFI_PEI_PPI_DESCRIPTOR *OldDescriptor; DEBUG ((DEBUG_INFO | DEBUG_INIT, "The entry of FspNotificationPeim\n")); // // Locate old DXE IPL PPI // Status = PeiServicesLocatePpi ( &gEfiDxeIplPpiGuid, 0, &OldDescriptor, &OldDxeIplPpi ); ASSERT_EFI_ERROR (Status); // // Re-install the DXE IPL PPI to wait for notify // Status = PeiServicesReInstallPpi (OldDescriptor, &mInstallDxeIplPpi); ASSERT_EFI_ERROR (Status); return EFI_SUCCESS; }
/** Install Pei Load File PPI. @param PrivateData - Pointer to PEI_CORE_INSTANCE. @param OldCoreData - Pointer to PEI_CORE_INSTANCE. **/ VOID InitializeImageServices ( IN PEI_CORE_INSTANCE *PrivateData, IN PEI_CORE_INSTANCE *OldCoreData ) { if (OldCoreData == NULL) { // // The first time we are XIP (running from FLASH). We need to remember the // FLASH address so we can reinstall the memory version that runs faster // PrivateData->XipLoadFile = &gPpiLoadFilePpiList; PeiServicesInstallPpi (PrivateData->XipLoadFile); } else { // // 2nd time we are running from memory so replace the XIP version with the // new memory version. // PeiServicesReInstallPpi (PrivateData->XipLoadFile, &gPpiLoadFilePpiList); } }
/** Collects BIST data from PPI. This function collects BIST data from Sec Platform Information2 PPI or SEC Platform Information PPI. @param PeiServices Pointer to PEI Services Table @param PeiCpuMpData Pointer to PEI CPU MP Data **/ VOID CollectBistDataFromPpi ( IN CONST EFI_PEI_SERVICES **PeiServices, IN PEI_CPU_MP_DATA *PeiCpuMpData ) { EFI_STATUS Status; EFI_PEI_PPI_DESCRIPTOR *SecInformationDescriptor; EFI_SEC_PLATFORM_INFORMATION_RECORD2 *SecPlatformInformation2; EFI_SEC_PLATFORM_INFORMATION_RECORD *SecPlatformInformation; UINTN NumberOfData; EFI_SEC_PLATFORM_INFORMATION_CPU *CpuInstance; EFI_SEC_PLATFORM_INFORMATION_CPU BspCpuInstance; UINTN ProcessorNumber; UINTN CpuIndex; PEI_CPU_DATA *CpuData; SecPlatformInformation2 = NULL; SecPlatformInformation = NULL; NumberOfData = 0; CpuInstance = NULL; // // Get BIST information from Sec Platform Information2 Ppi firstly // Status = GetBistInfoFromPpi ( PeiServices, &gEfiSecPlatformInformation2PpiGuid, &SecInformationDescriptor, (VOID *) &SecPlatformInformation2 ); if (Status == EFI_SUCCESS) { // // Sec Platform Information2 PPI includes BSP/APs' BIST information // NumberOfData = SecPlatformInformation2->NumberOfCpus; CpuInstance = SecPlatformInformation2->CpuInstance; } else { // // Otherwise, get BIST information from Sec Platform Information Ppi // Status = GetBistInfoFromPpi ( PeiServices, &gEfiSecPlatformInformationPpiGuid, &SecInformationDescriptor, (VOID *) &SecPlatformInformation ); if (Status == EFI_SUCCESS) { NumberOfData = 1; // // SEC Platform Information only includes BSP's BIST information // and does not have BSP's APIC ID // BspCpuInstance.CpuLocation = GetInitialApicId (); BspCpuInstance.InfoRecord.IA32HealthFlags.Uint32 = SecPlatformInformation->IA32HealthFlags.Uint32; CpuInstance = &BspCpuInstance; } else { DEBUG ((EFI_D_INFO, "Does not find any stored CPU BIST information from PPI!\n")); } } for (ProcessorNumber = 0; ProcessorNumber < PeiCpuMpData->CpuCount; ProcessorNumber ++) { CpuData = &PeiCpuMpData->CpuData[ProcessorNumber]; for (CpuIndex = 0; CpuIndex < NumberOfData; CpuIndex ++) { ASSERT (CpuInstance != NULL); if (CpuData->ApicId == CpuInstance[CpuIndex].CpuLocation) { // // Update processor's BIST data if it is already stored before // CpuData->Health = CpuInstance[CpuIndex].InfoRecord.IA32HealthFlags; } } if (CpuData->Health.Uint32 == 0) { CpuData->CpuHealthy = TRUE; } else { CpuData->CpuHealthy = FALSE; // // Report Status Code that self test is failed // REPORT_STATUS_CODE ( EFI_ERROR_CODE | EFI_ERROR_MAJOR, (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_SELF_TEST) ); } DEBUG ((EFI_D_INFO, " APICID - 0x%08x, BIST - 0x%08x\n", PeiCpuMpData->CpuData[ProcessorNumber].ApicId, PeiCpuMpData->CpuData[ProcessorNumber].Health.Uint32 )); } if (SecPlatformInformation2 != NULL && NumberOfData < PeiCpuMpData->CpuCount) { // // Reinstall SecPlatformInformation2 PPI to include new BIST inforamtion // Status = PeiServicesReInstallPpi ( SecInformationDescriptor, &mPeiSecPlatformInformation2Ppi ); ASSERT_EFI_ERROR (Status); } else { // // Install SecPlatformInformation2 PPI to include new BIST inforamtion // Status = PeiServicesInstallPpi (&mPeiSecPlatformInformation2Ppi); ASSERT_EFI_ERROR(Status); } }
/** Initialize DMA protection. @param VTdInfo The VTd engine context information. @retval EFI_SUCCESS the DMA protection is initialized. @retval EFI_OUT_OF_RESOURCES no enough resource to initialize DMA protection. **/ EFI_STATUS InitDmaProtection ( IN VTD_INFO *VTdInfo ) { EFI_STATUS Status; UINT32 LowMemoryAlignment; UINT64 HighMemoryAlignment; UINTN MemoryAlignment; UINTN LowBottom; UINTN LowTop; UINTN HighBottom; UINT64 HighTop; DMA_BUFFER_INFO *DmaBufferInfo; VOID *Hob; EFI_PEI_PPI_DESCRIPTOR *OldDescriptor; EDKII_IOMMU_PPI *OldIoMmuPpi; Hob = GetFirstGuidHob (&mDmaBufferInfoGuid); DmaBufferInfo = GET_GUID_HOB_DATA(Hob); DEBUG ((DEBUG_INFO, " DmaBufferSize : 0x%x\n", DmaBufferInfo->DmaBufferSize)); LowMemoryAlignment = GetLowMemoryAlignment (VTdInfo, VTdInfo->EngineMask); HighMemoryAlignment = GetHighMemoryAlignment (VTdInfo, VTdInfo->EngineMask); if (LowMemoryAlignment < HighMemoryAlignment) { MemoryAlignment = (UINTN)HighMemoryAlignment; } else { MemoryAlignment = LowMemoryAlignment; } ASSERT (DmaBufferInfo->DmaBufferSize == ALIGN_VALUE(DmaBufferInfo->DmaBufferSize, MemoryAlignment)); DmaBufferInfo->DmaBufferBase = (UINTN)AllocateAlignedPages (EFI_SIZE_TO_PAGES(DmaBufferInfo->DmaBufferSize), MemoryAlignment); ASSERT (DmaBufferInfo->DmaBufferBase != 0); if (DmaBufferInfo->DmaBufferBase == 0) { DEBUG ((DEBUG_INFO, " InitDmaProtection : OutOfResource\n")); return EFI_OUT_OF_RESOURCES; } DEBUG ((DEBUG_INFO, " DmaBufferBase : 0x%x\n", DmaBufferInfo->DmaBufferBase)); DmaBufferInfo->DmaBufferCurrentTop = DmaBufferInfo->DmaBufferBase + DmaBufferInfo->DmaBufferSize; DmaBufferInfo->DmaBufferCurrentBottom = DmaBufferInfo->DmaBufferBase; // // (Re)Install PPI. // Status = PeiServicesLocatePpi ( &gEdkiiIoMmuPpiGuid, 0, &OldDescriptor, (VOID **) &OldIoMmuPpi ); if (!EFI_ERROR (Status)) { Status = PeiServicesReInstallPpi (OldDescriptor, &mIoMmuPpiList); } else { Status = PeiServicesInstallPpi (&mIoMmuPpiList); } ASSERT_EFI_ERROR (Status); LowBottom = 0; LowTop = DmaBufferInfo->DmaBufferBase; HighBottom = DmaBufferInfo->DmaBufferBase + DmaBufferInfo->DmaBufferSize; HighTop = LShiftU64 (1, VTdInfo->HostAddressWidth + 1); Status = SetDmaProtectedRange ( VTdInfo, VTdInfo->EngineMask, (UINT32)LowBottom, (UINT32)(LowTop - LowBottom), HighBottom, HighTop - HighBottom ); if (EFI_ERROR(Status)) { FreePages ((VOID *)DmaBufferInfo->DmaBufferBase, EFI_SIZE_TO_PAGES(DmaBufferInfo->DmaBufferSize)); } return Status; }