1 /** @file 2 This will be invoked only once. It will call FspMemoryInit API, 3 register TemporaryRamDonePpi to call TempRamExit API, and register MemoryDiscoveredPpi 4 notify to call FspSiliconInit API. 5 6 Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR> 7 This program and the accompanying materials 8 are licensed and made available under the terms and conditions of the BSD License 9 which accompanies this distribution. The full text of the license may be found at 10 http://opensource.org/licenses/bsd-license.php. 11 12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 14 15 **/ 16 17 18 #include <PiPei.h> 19 20 #include <Library/PeimEntryPoint.h> 21 #include <Library/PeiServicesLib.h> 22 #include <Library/PeiServicesTablePointerLib.h> 23 #include <Library/BaseLib.h> 24 #include <Library/DebugLib.h> 25 #include <Library/BaseMemoryLib.h> 26 #include <Library/MemoryAllocationLib.h> 27 #include <Library/HobLib.h> 28 #include <Library/PcdLib.h> 29 #include <Library/TimerLib.h> 30 #include <Library/PerformanceLib.h> 31 #include <Library/FspWrapperPlatformLib.h> 32 #include <Library/FspWrapperHobProcessLib.h> 33 #include <Library/FspWrapperApiLib.h> 34 35 #include <Ppi/FspSiliconInitDone.h> 36 #include <Ppi/EndOfPeiPhase.h> 37 #include <Ppi/MemoryDiscovered.h> 38 #include <Ppi/SecPlatformInformation.h> 39 #include <Library/FspWrapperApiTestLib.h> 40 #include <FspEas.h> 41 #include <FspStatusCode.h> 42 43 extern EFI_GUID gFspHobGuid; 44 45 /** 46 Call FspMemoryInit API. 47 48 @return Status returned by FspMemoryInit API. 49 **/ 50 EFI_STATUS 51 PeiFspMemoryInit ( 52 VOID 53 ) 54 { 55 FSP_INFO_HEADER *FspmHeaderPtr; 56 EFI_STATUS Status; 57 UINT64 TimeStampCounterStart; 58 VOID *FspHobListPtr; 59 VOID *HobData; 60 FSPM_UPD_COMMON *FspmUpdDataPtr; 61 UINTN *SourceData; 62 63 DEBUG ((DEBUG_INFO, "PeiFspMemoryInit enter\n")); 64 65 FspHobListPtr = NULL; 66 67 // 68 // Copy default FSP-M UPD data from Flash 69 // 70 FspmHeaderPtr = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress)); 71 DEBUG ((DEBUG_INFO, "FspmHeaderPtr - 0x%x\n", FspmHeaderPtr)); 72 if (FspmHeaderPtr == NULL) { 73 return EFI_DEVICE_ERROR; 74 } 75 76 FspmUpdDataPtr = (FSPM_UPD_COMMON *)AllocateZeroPool ((UINTN)FspmHeaderPtr->CfgRegionSize); 77 ASSERT (FspmUpdDataPtr != NULL); 78 SourceData = (UINTN *)((UINTN)FspmHeaderPtr->ImageBase + (UINTN)FspmHeaderPtr->CfgRegionOffset); 79 CopyMem (FspmUpdDataPtr, SourceData, (UINTN)FspmHeaderPtr->CfgRegionSize); 80 81 DEBUG ((DEBUG_INFO, "UpdateFspmUpdData enter\n")); 82 UpdateFspmUpdData ((VOID *)FspmUpdDataPtr); 83 DEBUG ((DEBUG_INFO, " NvsBufferPtr - 0x%x\n", FspmUpdDataPtr->FspmArchUpd.NvsBufferPtr)); 84 DEBUG ((DEBUG_INFO, " StackBase - 0x%x\n", FspmUpdDataPtr->FspmArchUpd.StackBase)); 85 DEBUG ((DEBUG_INFO, " StackSize - 0x%x\n", FspmUpdDataPtr->FspmArchUpd.StackSize)); 86 DEBUG ((DEBUG_INFO, " BootLoaderTolumSize - 0x%x\n", FspmUpdDataPtr->FspmArchUpd.BootLoaderTolumSize)); 87 DEBUG ((DEBUG_INFO, " BootMode - 0x%x\n", FspmUpdDataPtr->FspmArchUpd.BootMode)); 88 DEBUG ((DEBUG_INFO, " HobListPtr - 0x%x\n", &FspHobListPtr)); 89 90 TimeStampCounterStart = AsmReadTsc (); 91 Status = CallFspMemoryInit (FspmUpdDataPtr, &FspHobListPtr); 92 // Create hobs after memory initialization and not in temp RAM. Hence passing the recorded timestamp here 93 PERF_START_EX(&gFspApiPerformanceGuid, "EventRec", NULL, TimeStampCounterStart, FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY); 94 PERF_END_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT); 95 DEBUG ((DEBUG_INFO, "Total time spent executing FspMemoryInitApi: %d millisecond\n", DivU64x32 (GetTimeInNanoSecond (AsmReadTsc () - TimeStampCounterStart), 1000000))); 96 97 // 98 // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED status 99 // 100 if ((Status >= FSP_STATUS_RESET_REQUIRED_COLD) && (Status <= FSP_STATUS_RESET_REQUIRED_8)) { 101 DEBUG((DEBUG_INFO, "FspMemoryInitApi requested reset 0x%x\n", Status)); 102 CallFspWrapperResetSystem ((UINT32)Status); 103 } 104 105 if (EFI_ERROR(Status)) { 106 DEBUG ((DEBUG_ERROR, "ERROR - Failed to execute FspMemoryInitApi(), Status = %r\n", Status)); 107 } 108 DEBUG((DEBUG_INFO, "FspMemoryInit status: 0x%x\n", Status)); 109 ASSERT_EFI_ERROR (Status); 110 111 112 Status = TestFspMemoryInitApiOutput (FspmUpdDataPtr, &FspHobListPtr); 113 if (EFI_ERROR (Status)) { 114 DEBUG ((DEBUG_ERROR, "ERROR - TestFspMemoryInitApiOutput () fail, Status = %r\n", Status)); 115 } 116 117 DEBUG ((DEBUG_INFO, " FspHobListPtr (returned) - 0x%x\n", FspHobListPtr)); 118 ASSERT (FspHobListPtr != NULL); 119 120 PostFspmHobProcess (FspHobListPtr); 121 122 // 123 // FspHobList is not complete at this moment. 124 // Save FspHobList pointer to hob, so that it can be got later 125 // 126 HobData = BuildGuidHob ( 127 &gFspHobGuid, 128 sizeof (VOID *) 129 ); 130 ASSERT (HobData != NULL); 131 CopyMem (HobData, &FspHobListPtr, sizeof (FspHobListPtr)); 132 133 return Status; 134 } 135 136 /** 137 Do FSP initialization. 138 139 @return FSP initialization status. 140 **/ 141 EFI_STATUS 142 EFIAPI 143 FspmWrapperInit ( 144 VOID 145 ) 146 { 147 EFI_STATUS Status; 148 149 Status = PeiFspMemoryInit (); 150 ASSERT_EFI_ERROR (Status); 151 152 return Status; 153 } 154 155 /** 156 This is the entrypoint of PEIM 157 158 @param[in] FileHandle Handle of the file being invoked. 159 @param[in] PeiServices Describes the list of possible PEI Services. 160 161 @retval EFI_SUCCESS if it completed successfully. 162 **/ 163 EFI_STATUS 164 EFIAPI 165 FspmWrapperPeimEntryPoint ( 166 IN EFI_PEI_FILE_HANDLE FileHandle, 167 IN CONST EFI_PEI_SERVICES **PeiServices 168 ) 169 { 170 DEBUG((DEBUG_INFO, "FspmWrapperPeimEntryPoint\n")); 171 172 FspmWrapperInit (); 173 174 return EFI_SUCCESS; 175 } 176