]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/PlatformPei/BootMode.c
Vlv2TbltDevicePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / Vlv2TbltDevicePkg / PlatformPei / BootMode.c
CommitLineData
3cbfba02
DW
1/** @file\r
2\r
a4712bea 3 Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
3cbfba02 4 \r\r
9dc8036d
MK
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
3cbfba02
DW
7 \r\r
8\r
9Module Name:\r
10\r
11\r
12 BootMode.c\r
13\r
14Abstract:\r
15\r
16 EFI PEIM to provide the platform support functionality on the Thurley.\r
17\r
18\r
19--*/\r
20#include "CommonHeader.h"\r
21#include "Platform.h"\r
22#include "PlatformBaseAddresses.h"\r
23#include "PchAccess.h"\r
24#include "PlatformBootMode.h"\r
25#include <Guid/SetupVariable.h>\r
26\r
3cbfba02
DW
27//\r
28// Priority of our boot modes, highest priority first\r
29//\r
30EFI_BOOT_MODE mBootModePriority[] = {\r
31 BOOT_IN_RECOVERY_MODE,\r
32 BOOT_WITH_DEFAULT_SETTINGS,\r
33 BOOT_ON_FLASH_UPDATE,\r
34 BOOT_ON_S2_RESUME,\r
35 BOOT_ON_S3_RESUME,\r
36 BOOT_ON_S4_RESUME,\r
37 BOOT_WITH_MINIMAL_CONFIGURATION,\r
38 BOOT_ASSUMING_NO_CONFIGURATION_CHANGES,\r
39 BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS,\r
40 BOOT_WITH_FULL_CONFIGURATION,\r
41 BOOT_ON_S5_RESUME\r
42};\r
43\r
44EFI_PEI_NOTIFY_DESCRIPTOR mCapsuleNotifyList[1] = {\r
45 {\r
46 (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
47 &gPeiCapsulePpiGuid,\r
48 CapsulePpiNotifyCallback\r
49 }\r
50};\r
51\r
52BOOLEAN\r
53GetSleepTypeAfterWakeup (\r
54 IN CONST EFI_PEI_SERVICES **PeiServices,\r
55 OUT UINT16 *SleepType\r
56 );\r
57\r
58EFI_STATUS\r
59EFIAPI\r
60CapsulePpiNotifyCallback (\r
61 IN EFI_PEI_SERVICES **PeiServices,\r
62 IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,\r
63 IN VOID *Ppi\r
64 )\r
65{\r
66 EFI_STATUS Status;\r
67 EFI_BOOT_MODE BootMode;\r
68 PEI_CAPSULE_PPI *Capsule;\r
69\r
70 Status = (*PeiServices)->GetBootMode((const EFI_PEI_SERVICES **)PeiServices, &BootMode);\r
71 ASSERT_EFI_ERROR (Status);\r
72\r
73 if (BootMode == BOOT_ON_S3_RESUME) {\r
74 //\r
75 // Determine if we're in capsule update mode\r
76 //\r
77 Status = (*PeiServices)->LocatePpi ((const EFI_PEI_SERVICES **)PeiServices,\r
78 &gPeiCapsulePpiGuid,\r
79 0,\r
80 NULL,\r
81 (VOID **)&Capsule\r
82 );\r
83\r
84 if (Status == EFI_SUCCESS) {\r
85 if (Capsule->CheckCapsuleUpdate ((EFI_PEI_SERVICES**)PeiServices) == EFI_SUCCESS) {\r
86 BootMode = BOOT_ON_FLASH_UPDATE;\r
87 Status = (*PeiServices)->SetBootMode((const EFI_PEI_SERVICES **)PeiServices, BootMode);\r
88 ASSERT_EFI_ERROR (Status);\r
89 }\r
90 }\r
91 }\r
92\r
93 return Status;\r
94}\r
95\r
3cbfba02
DW
96#ifdef NOCS_S3_SUPPORT\r
97EFI_STATUS\r
98UpdateBootMode (\r
99 IN CONST EFI_PEI_SERVICES **PeiServices\r
100 )\r
101{\r
102 EFI_STATUS Status;\r
103 EFI_BOOT_MODE BootMode;\r
104 UINT16 SleepType;\r
105 CHAR16 *strBootMode;\r
106\r
107 Status = (*PeiServices)->GetBootMode(PeiServices, &BootMode);\r
108 ASSERT_EFI_ERROR (Status);\r
109 if (BootMode == BOOT_IN_RECOVERY_MODE){\r
110 return Status;\r
111 }\r
112\r
113 //\r
114 // Let's assume things are OK if not told otherwise\r
115 //\r
116 BootMode = BOOT_WITH_FULL_CONFIGURATION;\r
117\r
118 if (GetSleepTypeAfterWakeup (PeiServices, &SleepType)) {\r
119 switch (SleepType) {\r
120 case V_PCH_ACPI_PM1_CNT_S3:\r
121 BootMode = BOOT_ON_S3_RESUME;\r
122 Status = (*PeiServices)->NotifyPpi (PeiServices, &mCapsuleNotifyList[0]);\r
123 ASSERT_EFI_ERROR (Status);\r
124 break;\r
125\r
126 case V_PCH_ACPI_PM1_CNT_S4:\r
127 BootMode = BOOT_ON_S4_RESUME;\r
128 break;\r
129\r
130 case V_PCH_ACPI_PM1_CNT_S5:\r
131 BootMode = BOOT_ON_S5_RESUME;\r
132 break;\r
133 } // switch (SleepType)\r
134 }\r
135\r
a4712bea 136 if (IsFastBootEnabled (PeiServices)) {\r
3cbfba02
DW
137 DEBUG ((EFI_D_INFO, "Prioritizing Boot mode to BOOT_WITH_MINIMAL_CONFIGURATION\n"));\r
138 PrioritizeBootMode (&BootMode, BOOT_WITH_MINIMAL_CONFIGURATION);\r
139 }\r
140\r
141 switch (BootMode) {\r
142 case BOOT_WITH_FULL_CONFIGURATION:\r
143 strBootMode = L"BOOT_WITH_FULL_CONFIGURATION";\r
144 break;\r
145 case BOOT_WITH_MINIMAL_CONFIGURATION:\r
146 strBootMode = L"BOOT_WITH_MINIMAL_CONFIGURATION";\r
147 break;\r
148 case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:\r
149 strBootMode = L"BOOT_ASSUMING_NO_CONFIGURATION_CHANGES";\r
150 break;\r
151 case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS:\r
152 strBootMode = L"BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS";\r
153 break;\r
154 case BOOT_WITH_DEFAULT_SETTINGS:\r
155 strBootMode = L"BOOT_WITH_DEFAULT_SETTINGS";\r
156 break;\r
157 case BOOT_ON_S4_RESUME:\r
158 strBootMode = L"BOOT_ON_S4_RESUME";\r
159 break;\r
160 case BOOT_ON_S5_RESUME:\r
161 strBootMode = L"BOOT_ON_S5_RESUME";\r
162 break;\r
163 case BOOT_ON_S2_RESUME:\r
164 strBootMode = L"BOOT_ON_S2_RESUME";\r
165 break;\r
166 case BOOT_ON_S3_RESUME:\r
167 strBootMode = L"BOOT_ON_S3_RESUME";\r
168\r
169 break;\r
170 case BOOT_ON_FLASH_UPDATE:\r
171 strBootMode = L"BOOT_ON_FLASH_UPDATE";\r
172 break;\r
173 case BOOT_IN_RECOVERY_MODE:\r
174 strBootMode = L"BOOT_IN_RECOVERY_MODE";\r
175 break;\r
176 default:\r
177 strBootMode = L"Unknown boot mode";\r
178 } // switch (BootMode)\r
179\r
180 DEBUG ((EFI_D_ERROR, "Setting BootMode to %s\n", strBootMode));\r
181 Status = (*PeiServices)->SetBootMode(PeiServices, BootMode);\r
182 ASSERT_EFI_ERROR (Status);\r
183\r
184 return Status;\r
185}\r
186#endif\r
187\r
188/**\r
189 Get sleep type after wakeup\r
190\r
191 @param PeiServices Pointer to the PEI Service Table.\r
192 @param SleepType Sleep type to be returned.\r
193\r
194 @retval TRUE A wake event occured without power failure.\r
195 @retval FALSE Power failure occured or not a wakeup.\r
196\r
197**/\r
198BOOLEAN\r
199GetSleepTypeAfterWakeup (\r
200 IN CONST EFI_PEI_SERVICES **PeiServices,\r
201 OUT UINT16 *SleepType\r
202 )\r
203{\r
204 UINT16 Pm1Sts;\r
205 UINT16 Pm1Cnt;\r
206 UINT16 GenPmCon1;\r
207 //\r
208 // VLV BIOS Specification 0.6.2 - Section 18.4, "Power Failure Consideration"\r
209 //\r
210 // When the SUS_PWR_FLR bit is set, it indicates the SUS well power is lost.\r
211