]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFspPkg/Library/BaseFspPlatformLib/FspPlatformNotify.c
Update IntelFspPkg according to FSP1.1.
[mirror_edk2.git] / IntelFspPkg / Library / BaseFspPlatformLib / FspPlatformNotify.c
CommitLineData
c8ec22a2
JY
1/** @file\r
2\r
d5fb1edf 3 Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
c8ec22a2
JY
4 This program and the accompanying materials\r
5 are licensed and made available under the terms and conditions of the BSD License\r
6 which accompanies this distribution. The full text of the license may be found at\r
7 http://opensource.org/licenses/bsd-license.php.\r
8\r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12**/\r
13\r
14#include <PiPei.h>\r
15#include <Library/PeiServicesLib.h>\r
16#include <Library/PeiServicesTablePointerLib.h>\r
17#include <Library/BaseLib.h>\r
18#include <Library/BaseMemoryLib.h>\r
19#include <Library/PcdLib.h>\r
20#include <Library/DebugLib.h>\r
21#include <Library/HobLib.h>\r
22#include <Library/FspSwitchStackLib.h>\r
23#include <Library/FspCommonLib.h>\r
24#include <Guid/EventGroup.h>\r
25#include <FspApi.h>\r
26#include <Protocol/PciEnumerationComplete.h>\r
27\r
28EFI_PEI_PPI_DESCRIPTOR mPeiPostPciEnumerationPpi = {\r
29 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
30 &gEfiPciEnumerationCompleteProtocolGuid,\r
31 NULL\r
32};\r
33\r
34EFI_PEI_PPI_DESCRIPTOR mPeiReadyToBootPpi = {\r
35 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
36 &gEfiEventReadyToBootGuid,\r
37 NULL\r
38};\r
39\r
40\r
8e89d9ce 41UINT32 mFspNotifySequence[] = {\r
c8ec22a2
JY
42 EnumInitPhaseAfterPciEnumeration,\r
43 EnumInitPhaseReadyToBoot\r
44};\r
45\r
46/**\r
47 Install FSP notification.\r
48\r
8e89d9ce 49 @param[in] NotificationCode FSP notification code\r
c8ec22a2
JY
50\r
51 @retval EFI_SUCCESS Notify FSP successfully\r
8e89d9ce 52 @retval EFI_INVALID_PARAMETER NotificationCode is invalid\r
c8ec22a2
JY
53\r
54**/\r
55EFI_STATUS\r
56EFIAPI\r
57FspNotificationHandler (\r
8e89d9ce 58 IN UINT32 NotificationCode\r
c8ec22a2
JY
59 )\r
60{\r
61 EFI_STATUS Status;\r
62\r
63 Status = EFI_SUCCESS;\r
64\r
8e89d9ce 65 switch (NotificationCode) {\r
c8ec22a2
JY
66 case EnumInitPhaseAfterPciEnumeration:\r
67 //\r
68 // Do POST PCI initialization if needed\r
69 //\r
70 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP Post PCI Enumeration ...\n"));\r
71 PeiServicesInstallPpi (&mPeiPostPciEnumerationPpi);\r
72 break;\r
73\r
74 case EnumInitPhaseReadyToBoot:\r
75 //\r
76 // Ready To Boot\r
77 //\r
78 DEBUG ((DEBUG_INFO| DEBUG_INIT, "FSP Ready To Boot ...\n"));\r
79 PeiServicesInstallPpi (&mPeiReadyToBootPpi);\r
80 break;\r
81\r
82 default:\r
83 Status = EFI_INVALID_PARAMETER;\r
84 break;\r
85 }\r
86\r
87 return Status;\r
88}\r
89\r
90/**\r
91 This function transfer control to the ContinuationFunc passed in by the\r
92 bootloader.\r
93\r
94**/\r
95VOID\r
96EFIAPI\r
97FspInitDone (\r
98 VOID\r
99 )\r
100{\r
d5fb1edf
JY
101 FSP_INIT_PARAMS *FspInitParams;\r
102\r
103 if (GetFspApiCallingMode() == 0) {\r
104 //\r
105 // FspInit API is used, so jump into the ContinuationFunc\r
106 //\r
107 FspInitParams = (FSP_INIT_PARAMS *)GetFspApiParameter ();\r
108 \r
109 //\r
110 // Modify the parameters for ContinuationFunc\r
111 //\r
112 SetFspContinuationFuncParameter(EFI_SUCCESS, 0);\r
113 SetFspContinuationFuncParameter((UINT32)GetHobList(), 1);\r
114 \r
115 //\r
116 // Modify the return address to ContinuationFunc\r
117 //\r
118 SetFspApiReturnAddress((UINT32)FspInitParams->ContinuationFunc);\r
119 \r
120 //\r
121 // Give control back to the boot loader framework caller after FspInit is done\r
122 // It is done throught the continuation function\r
123 //\r
124 SetFspMeasurePoint (FSP_PERF_ID_API_FSPINIT_EXIT);\r
125 } else {\r
126 //\r
127 // FspMemoryInit API is used, so return directly\r
128 //\r
c8ec22a2 129\r
d5fb1edf
JY
130 //\r
131 // This is the end of the FspSiliconInit API\r
132 // Give control back to the boot loader\r
133 //\r
134 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() - End\n"));\r
135 SetFspApiReturnStatus (EFI_SUCCESS);\r
136 }\r
c8ec22a2 137\r
c8ec22a2
JY
138 Pei2LoaderSwitchStack();\r
139}\r
140\r
141/**\r
142 This function handle NotifyPhase API call from the bootloader.\r
143 It gives control back to the bootloader after it is handled. If the\r
144 Notification code is a ReadyToBoot event, this function will return\r
145 and FSP continues the remaining execution until it reaches the DxeIpl.\r
146\r
147**/\r
148VOID\r
149FspWaitForNotify (\r
150 VOID\r
151 )\r
152{\r
153 EFI_STATUS Status;\r
8e89d9ce
JY
154 UINT32 NotificationValue;\r
155 UINT32 NotificationCount;\r
c8ec22a2
JY
156 UINT8 Count;\r
157\r
8e89d9ce
JY
158 NotificationCount = 0;\r
159 while (NotificationCount < sizeof(mFspNotifySequence) / sizeof(UINT32)) {\r
c8ec22a2 160\r
8e89d9ce 161 Count = (UINT8)((NotificationCount << 1) & 0x07);\r
c8ec22a2
JY
162 SetFspMeasurePoint (FSP_PERF_ID_API_NOTIFY_POSTPCI_ENTRY + Count);\r
163\r
8e89d9ce
JY
164 NotificationValue = ((NOTIFY_PHASE_PARAMS *)(UINTN)GetFspApiParameter ())->Phase;\r
165 DEBUG ((DEBUG_INFO, "FSP Got Notification. Notification Value : 0x%08X\n", NotificationValue));\r
c8ec22a2 166\r
8e89d9ce 167 if (mFspNotifySequence[NotificationCount] != NotificationValue) {\r
c8ec22a2
JY
168 //\r
169 // Notify code does not follow the predefined order\r
170 //\r
d5fb1edf 171 DEBUG ((DEBUG_INFO, "Unsupported FSP Notification Value\n"));\r
c8ec22a2
JY
172 SetFspApiReturnStatus(EFI_UNSUPPORTED);\r
173 } else {\r
174 //\r
175 // Process Notification and Give control back to the boot loader framework caller\r
176 //\r
8e89d9ce 177 Status = FspNotificationHandler (NotificationValue);\r
d5fb1edf 178 DEBUG ((DEBUG_INFO, "FSP Notification Handler Returns : 0x%08X\n", Status));\r
c8ec22a2
JY
179 SetFspApiReturnStatus(Status);\r
180 if (!EFI_ERROR(Status)) {\r
8e89d9ce 181 NotificationCount++;\r
c8ec22a2 182 SetFspApiReturnStatus(EFI_SUCCESS);\r
8e89d9ce 183 if (NotificationValue == EnumInitPhaseReadyToBoot) {\r
c8ec22a2
JY
184 break;\r
185 }\r
186 }\r
187 }\r
188 SetFspMeasurePoint (FSP_PERF_ID_API_NOTIFY_POSTPCI_EXIT + Count);\r
189 Pei2LoaderSwitchStack();\r
190 }\r
191\r
192 //\r
193 // Control goes back to the PEI Core and it dispatches further PEIMs.\r
194 // DXEIPL is the final one to transfer control back to the boot loader.\r
195 //\r
196}\r
197\r