]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c
ArmVirtPkg/NorFlashQemuLib: disregard our primary FV
[mirror_edk2.git] / IntelFsp2Pkg / FspNotifyPhase / FspNotifyPhasePeim.c
CommitLineData
cf1d4549
JY
1/** @file\r
2 Source file for FSP notify phase PEI module\r
3\r
e37bb20c 4 Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.\r
cf1d4549
JY
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php.\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12**/\r
13\r
14#include "FspNotifyPhasePeim.h"\r
15\r
16/**\r
17\r
18 This function waits for FSP notify.\r
e37bb20c 19\r
cf1d4549
JY
20 @param This Entry point for DXE IPL PPI.\r
21 @param PeiServices General purpose services available to every PEIM.\r
22 @param HobList Address to the Pei HOB list.\r
e37bb20c 23\r
cf1d4549
JY
24 @return EFI_SUCCESS This function never returns.\r
25\r
26**/\r
27EFI_STATUS\r
28EFIAPI\r
29WaitForNotify (\r
30 IN CONST EFI_DXE_IPL_PPI *This,\r
31 IN EFI_PEI_SERVICES **PeiServices,\r
32 IN EFI_PEI_HOB_POINTERS HobList\r
33 );\r
34\r
35CONST EFI_DXE_IPL_PPI mDxeIplPpi = {\r
36 WaitForNotify\r
37};\r
38\r
39CONST EFI_PEI_PPI_DESCRIPTOR mInstallDxeIplPpi = {\r
40 EFI_PEI_PPI_DESCRIPTOR_PPI,\r
41 &gEfiDxeIplPpiGuid,\r
42 (VOID *) &mDxeIplPpi\r
43};\r
44\r
45CONST EFI_PEI_PPI_DESCRIPTOR gEndOfPeiSignalPpi = {\r
46 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
47 &gEfiEndOfPeiSignalPpiGuid,\r
48 NULL\r
49};\r
50\r
a2e61f34
CC
51CONST EFI_PEI_PPI_DESCRIPTOR gFspReadyForNotifyPhasePpi = {\r
52 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
53 &gFspReadyForNotifyPhasePpiGuid,\r
54 NULL\r
55};\r
56\r
cf1d4549
JY
57/**\r
58\r
59 This function waits for FSP notify.\r
e37bb20c 60\r
cf1d4549
JY
61 @param This Entry point for DXE IPL PPI.\r
62 @param PeiServices General purpose services available to every PEIM.\r
63 @param HobList Address to the Pei HOB list.\r
e37bb20c 64\r
cf1d4549
JY
65 @return EFI_SUCCESS This function never returns.\r
66\r
67**/\r
68EFI_STATUS\r
69EFIAPI\r
70WaitForNotify (\r
71 IN CONST EFI_DXE_IPL_PPI *This,\r
72 IN EFI_PEI_SERVICES **PeiServices,\r
73 IN EFI_PEI_HOB_POINTERS HobList\r
74 )\r
75{\r
76 EFI_STATUS Status;\r
77\r
78 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP HOB is located at 0x%08X\n", HobList));\r
79\r
80 //\r
81 // End of PEI phase signal\r
82 //\r
83 Status = PeiServicesInstallPpi (&gEndOfPeiSignalPpi);\r
84 ASSERT_EFI_ERROR (Status);\r
85\r
86 //\r
87 // Give control back to BootLoader after FspSiliconInit\r
88 //\r
89 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP is waiting for NOTIFY\n"));\r
0e3f9ee1 90 FspSiliconInitDone2 (EFI_SUCCESS);\r
cf1d4549
JY
91\r
92 //\r
93 // BootLoader called FSP again through NotifyPhase\r
94 //\r
95 FspWaitForNotify ();\r
96\r
a2e61f34
CC
97 if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {\r
98 //\r
99 // Should not come here\r
100 //\r
101 while (TRUE) {\r
102 DEBUG ((DEBUG_ERROR, "No FSP API should be called after FSP is DONE!\n"));\r
103 SetFspApiReturnStatus (EFI_UNSUPPORTED);\r
104 Pei2LoaderSwitchStack ();\r
105 }\r
cf1d4549
JY
106 }\r
107\r
108 return EFI_SUCCESS;\r
109}\r
110\r
111/**\r
112 FSP notify phase PEI module entry point\r
113\r
114 @param[in] FileHandle Not used.\r
115 @param[in] PeiServices General purpose services available to every PEIM.\r
116\r
117 @retval EFI_SUCCESS The function completes successfully\r
118 @retval EFI_OUT_OF_RESOURCES Insufficient resources to create database\r
119**/\r
120EFI_STATUS\r
121FspNotifyPhasePeimEntryPoint (\r
122 IN EFI_PEI_FILE_HANDLE FileHandle,\r
123 IN CONST EFI_PEI_SERVICES **PeiServices\r
124 )\r
125{\r
126 EFI_STATUS Status;\r
127 VOID *OldDxeIplPpi;\r
128 EFI_PEI_PPI_DESCRIPTOR *OldDescriptor;\r
129\r
130 DEBUG ((DEBUG_INFO | DEBUG_INIT, "The entry of FspNotificationPeim\n"));\r
131\r
a2e61f34
CC
132 if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {\r
133 //\r
134 // Locate old DXE IPL PPI\r
135 //\r
136 Status = PeiServicesLocatePpi (\r
137 &gEfiDxeIplPpiGuid,\r
138 0,\r
139 &OldDescriptor,\r
140 &OldDxeIplPpi\r
141 );\r
142 ASSERT_EFI_ERROR (Status);\r
143\r
144 //\r
145 // Re-install the DXE IPL PPI to wait for notify\r
146 //\r
147 Status = PeiServicesReInstallPpi (OldDescriptor, &mInstallDxeIplPpi);\r
148 ASSERT_EFI_ERROR (Status);\r
149 } else {\r
150 Status = PeiServicesInstallPpi (&gFspReadyForNotifyPhasePpi);\r
151 ASSERT_EFI_ERROR (Status);\r
152 }\r
cf1d4549
JY
153\r
154 return EFI_SUCCESS;\r
155}\r