]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/PlatformPei/BootMode.c
MdeModulePkg/CapsuleApp: Center bitmap at bottom of screen
[mirror_edk2.git] / Vlv2TbltDevicePkg / PlatformPei / BootMode.c
CommitLineData
3cbfba02
DW
1/** @file\r
2\r
3 Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
4 \r\r
5 This program and the accompanying materials are licensed and made available under\r\r
6 the terms and conditions of the BSD License that accompanies this distribution. \r\r
7 The full text of the license may be found at \r\r
8 http://opensource.org/licenses/bsd-license.php. \r\r
9 \r\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r\r
12 \r\r
13\r
14Module Name:\r
15\r
16\r
17 BootMode.c\r
18\r
19Abstract:\r
20\r
21 EFI PEIM to provide the platform support functionality on the Thurley.\r
22\r
23\r
24--*/\r
25#include "CommonHeader.h"\r
26#include "Platform.h"\r
27#include "PlatformBaseAddresses.h"\r
28#include "PchAccess.h"\r
29#include "PlatformBootMode.h"\r
30#include <Guid/SetupVariable.h>\r
31\r
32#include <Guid/BootState.h>\r
33\r
34//\r
35// Priority of our boot modes, highest priority first\r
36//\r
37EFI_BOOT_MODE mBootModePriority[] = {\r
38 BOOT_IN_RECOVERY_MODE,\r
39 BOOT_WITH_DEFAULT_SETTINGS,\r
40 BOOT_ON_FLASH_UPDATE,\r
41 BOOT_ON_S2_RESUME,\r
42 BOOT_ON_S3_RESUME,\r
43 BOOT_ON_S4_RESUME,\r
44 BOOT_WITH_MINIMAL_CONFIGURATION,\r
45 BOOT_ASSUMING_NO_CONFIGURATION_CHANGES,\r
46 BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS,\r
47 BOOT_WITH_FULL_CONFIGURATION,\r
48 BOOT_ON_S5_RESUME\r
49};\r
50\r
51EFI_PEI_NOTIFY_DESCRIPTOR mCapsuleNotifyList[1] = {\r
52 {\r
53 (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
54 &gPeiCapsulePpiGuid,\r
55 CapsulePpiNotifyCallback\r
56 }\r
57};\r
58\r
59BOOLEAN\r
60GetSleepTypeAfterWakeup (\r
61 IN CONST EFI_PEI_SERVICES **PeiServices,\r
62 OUT UINT16 *SleepType\r
63 );\r
64\r
65EFI_STATUS\r
66EFIAPI\r
67CapsulePpiNotifyCallback (\r
68 IN EFI_PEI_SERVICES **PeiServices,\r
69 IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,\r
70 IN VOID *Ppi\r
71 )\r
72{\r
73 EFI_STATUS Status;\r
74 EFI_BOOT_MODE BootMode;\r
75 PEI_CAPSULE_PPI *Capsule;\r
76\r
77 Status = (*PeiServices)->GetBootMode((const EFI_PEI_SERVICES **)PeiServices, &BootMode);\r
78 ASSERT_EFI_ERROR (Status);\r
79\r
80 if (BootMode == BOOT_ON_S3_RESUME) {\r
81 //\r
82 // Determine if we're in capsule update mode\r
83 //\r
84 Status = (*PeiServices)->LocatePpi ((const EFI_PEI_SERVICES **)PeiServices,\r
85 &gPeiCapsulePpiGuid,\r
86 0,\r
87 NULL,\r
88 (VOID **)&Capsule\r
89 );\r
90\r
91 if (Status == EFI_SUCCESS) {\r
92 if (Capsule->CheckCapsuleUpdate ((EFI_PEI_SERVICES**)PeiServices) == EFI_SUCCESS) {\r
93 BootMode = BOOT_ON_FLASH_UPDATE;\r
94 Status = (*PeiServices)->SetBootMode((const EFI_PEI_SERVICES **)PeiServices, BootMode);\r
95 ASSERT_EFI_ERROR (Status);\r
96 }\r
97 }\r
98 }\r
99\r
100 return Status;\r
101}\r
102\r
103/**\r
104 Check CMOS register bit to determine if previous boot was successful\r
105\r
106 @param PeiServices pointer to the PEI Service Table\r
107\r
108 @retval TRUE - Previous Boot was success\r
109 @retval FALSE - Previous Boot wasn't success\r
110\r
111**/\r
112BOOLEAN\r
113IsPreviousBootSuccessful(\r
114 IN CONST EFI_PEI_SERVICES **PeiServices\r
115\r
116 )\r
117{\r
118 EFI_STATUS Status;\r
119 BOOLEAN BootState;\r
120 UINTN DataSize;\r
121 CHAR16 VarName[] = BOOT_STATE_VARIABLE_NAME;\r
122 EFI_PEI_READ_ONLY_VARIABLE2_PPI *PeiVar;\r
123\r
124 Status = (**PeiServices).LocatePpi (\r
125 PeiServices,\r
126 &gEfiPeiReadOnlyVariable2PpiGuid,\r
127 0,\r
128 NULL,\r
129 (void **)&PeiVar\r
130 );\r
131 ASSERT_EFI_ERROR (Status);\r
132\r
133 //\r
134 // Get last Boot State Variable to confirm that it is not a first boot .\r
135 //\r
136\r
137 DataSize = sizeof (BOOLEAN);\r
138 Status = PeiVar->GetVariable (\r
139 PeiVar,\r
140 VarName,\r
141 &gEfiBootStateGuid,\r
142 NULL,\r
143 &DataSize,\r
144 &BootState\r
145 );\r
146 if (EFI_ERROR (Status) || (BootState == TRUE)) {\r
147 return FALSE;\r
148 }\r
149\r
150 DEBUG ((EFI_D_INFO, "Previous boot cycle successfully completed handover to OS\n"));\r
151 return TRUE;\r
152}\r
153#ifdef NOCS_S3_SUPPORT\r
154EFI_STATUS\r
155UpdateBootMode (\r
156 IN CONST EFI_PEI_SERVICES **PeiServices\r
157 )\r
158{\r
159 EFI_STATUS Status;\r
160 EFI_BOOT_MODE BootMode;\r
161 UINT16 SleepType;\r
162 CHAR16 *strBootMode;\r
163\r
164 Status = (*PeiServices)->GetBootMode(PeiServices, &BootMode);\r
165 ASSERT_EFI_ERROR (Status);\r
166 if (BootMode == BOOT_IN_RECOVERY_MODE){\r
167 return Status;\r
168 }\r
169\r
170 //\r
171 // Let's assume things are OK if not told otherwise\r
172 //\r
173 BootMode = BOOT_WITH_FULL_CONFIGURATION;\r
174\r
175 if (GetSleepTypeAfterWakeup (PeiServices, &SleepType)) {\r
176 switch (SleepType) {\r
177 case V_PCH_ACPI_PM1_CNT_S3:\r
178 BootMode = BOOT_ON_S3_RESUME;\r
179 Status = (*PeiServices)->NotifyPpi (PeiServices, &mCapsuleNotifyList[0]);\r
180 ASSERT_EFI_ERROR (Status);\r
181 break;\r
182\r
183 case V_PCH_ACPI_PM1_CNT_S4:\r
184 BootMode = BOOT_ON_S4_RESUME;\r
185 break;\r
186\r
187 case V_PCH_ACPI_PM1_CNT_S5:\r
188 BootMode = BOOT_ON_S5_RESUME;\r
189 break;\r
190 } // switch (SleepType)\r
191 }\r
192\r
193 if (IsFastBootEnabled (PeiServices) && IsPreviousBootSuccessful (PeiServices)) {\r
194 DEBUG ((EFI_D_INFO, "Prioritizing Boot mode to BOOT_WITH_MINIMAL_CONFIGURATION\n"));\r
195 PrioritizeBootMode (&BootMode, BOOT_WITH_MINIMAL_CONFIGURATION);\r
196 }\r
197\r
198 switch (BootMode) {\r
199 case BOOT_WITH_FULL_CONFIGURATION:\r
200 strBootMode = L"BOOT_WITH_FULL_CONFIGURATION";\r
201 break;\r
202 case BOOT_WITH_MINIMAL_CONFIGURATION:\r
203 strBootMode = L"BOOT_WITH_MINIMAL_CONFIGURATION";\r
204 break;\r
205 case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:\r
206 strBootMode = L"BOOT_ASSUMING_NO_CONFIGURATION_CHANGES";\r
207 break;\r
208 case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS:\r
209 strBootMode = L"BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS";\r
210 break;\r
211 case BOOT_WITH_DEFAULT_SETTINGS:\r
212 strBootMode = L"BOOT_WITH_DEFAULT_SETTINGS";\r
213 break;\r
214 case BOOT_ON_S4_RESUME:\r
215 strBootMode = L"BOOT_ON_S4_RESUME";\r
216 break;\r
217 case BOOT_ON_S5_RESUME:\r
218 strBootMode = L"BOOT_ON_S5_RESUME";\r
219 break;\r
220 case BOOT_ON_S2_RESUME:\r
221 strBootMode = L"BOOT_ON_S2_RESUME";\r
222 break;\r
223 case BOOT_ON_S3_RESUME:\r
224 strBootMode = L"BOOT_ON_S3_RESUME";\r
225\r
226 break;\r
227 case BOOT_ON_FLASH_UPDATE:\r
228 strBootMode = L"BOOT_ON_FLASH_UPDATE";\r
229 break;\r
230 case BOOT_IN_RECOVERY_MODE:\r
231 strBootMode = L"BOOT_IN_RECOVERY_MODE";\r
232 break;\r
233 default:\r
234 strBootMode = L"Unknown boot mode";\r
235 } // switch (BootMode)\r
236\r
237 DEBUG ((EFI_D_ERROR, "Setting BootMode to %s\n", strBootMode));\r
238 Status = (*PeiServices)->SetBootMode(PeiServices, BootMode);\r
239 ASSERT_EFI_ERROR (Status);\r
240\r
241 return Status;\r
242}\r
243#endif\r
244\r
245/**\r
246 Get sleep type after wakeup\r
247\r
248 @param PeiServices Pointer to the PEI Service Table.\r
249 @param SleepType Sleep type to be returned.\r
250\r
251 @retval TRUE A wake event occured without power failure.\r
252 @retval FALSE Power failure occured or not a wakeup.\r
253\r
254**/\r
255BOOLEAN\r
256GetSleepTypeAfterWakeup (\r
257 IN CONST EFI_PEI_SERVICES **PeiServices,\r
258 OUT UINT16 *SleepType\r
259 )\r
260{\r
261 UINT16 Pm1Sts;\r
262 UINT16 Pm1Cnt;\r
263 UINT16 GenPmCon1;\r
264 //\r
265 // VLV BIOS Specification 0.6.2 - Section 18.4, "Power Failure Consideration"\r
266 //\r
267 // When the SUS_PWR_FLR bit is set, it indicates the SUS well power is lost.\r
268