]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
UefiCpuPkg/RegisterCpuFeaturesLib: Avoid AP calls PeiService.
[mirror_edk2.git] / UefiCpuPkg / Library / RegisterCpuFeaturesLib / RegisterCpuFeatures.h
CommitLineData
80c4b236
JF
1/** @file\r
2 CPU Register Table Library definitions.\r
3\r
4 Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>\r
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\r
15#ifndef _REGISTER_CPU_FEATURES_H_\r
16#define _REGISTER_CPU_FEATURES_H_\r
7217b879
ED
17#include <PiPei.h>\r
18#include <PiDxe.h>\r
19#include <Ppi/MpServices.h>\r
20#include <Protocol/MpService.h>\r
80c4b236
JF
21\r
22#include <Library/BaseLib.h>\r
23#include <Library/DebugLib.h>\r
24#include <Library/PcdLib.h>\r
25#include <Library/RegisterCpuFeaturesLib.h>\r
26#include <Library/BaseMemoryLib.h>\r
27#include <Library/MemoryAllocationLib.h>\r
28#include <Library/SynchronizationLib.h>\r
29#include <Library/IoLib.h>\r
b3c71b47 30#include <Library/LocalApicLib.h>\r
80c4b236
JF
31\r
32#include <AcpiCpuData.h>\r
33\r
34#define CPU_FEATURE_ENTRY_SIGNATURE SIGNATURE_32 ('C', 'F', 'E', 'S')\r
35\r
36#define CPU_FEATURE_NAME_SIZE 128\r
37\r
38typedef struct {\r
39 REGISTER_CPU_FEATURE_INFORMATION CpuInfo;\r
40 UINT8 *FeaturesSupportedMask;\r
41 LIST_ENTRY OrderList;\r
42} CPU_FEATURES_INIT_ORDER;\r
43\r
44typedef struct {\r
45 UINT32 Signature;\r
46 LIST_ENTRY Link;\r
47 UINT8 *FeatureMask;\r
48 CHAR8 *FeatureName;\r
49 CPU_FEATURE_GET_CONFIG_DATA GetConfigDataFunc;\r
50 CPU_FEATURE_SUPPORT SupportFunc;\r
51 CPU_FEATURE_INITIALIZE InitializeFunc;\r
52 UINT8 *BeforeFeatureBitMask;\r
53 UINT8 *AfterFeatureBitMask;\r
b3c71b47
ED
54 UINT8 *CoreBeforeFeatureBitMask;\r
55 UINT8 *CoreAfterFeatureBitMask;\r
56 UINT8 *PackageBeforeFeatureBitMask;\r
57 UINT8 *PackageAfterFeatureBitMask;\r
80c4b236
JF
58 VOID *ConfigData;\r
59 BOOLEAN BeforeAll;\r
60 BOOLEAN AfterAll;\r
61} CPU_FEATURES_ENTRY;\r
62\r
b3c71b47
ED
63//\r
64// Flags used when program the register.\r
65//\r
66typedef struct {\r
91ff5bba
ED
67 volatile UINTN ConsoleLogLock; // Spinlock used to control console.\r
68 volatile UINTN MemoryMappedLock; // Spinlock used to program mmio\r
69 volatile UINT32 *CoreSemaphoreCount; // Semaphore containers used to program Core semaphore.\r
70 volatile UINT32 *PackageSemaphoreCount; // Semaphore containers used to program Package semaphore.\r
b3c71b47
ED
71} PROGRAM_CPU_REGISTER_FLAGS;\r
72\r
7217b879
ED
73typedef union {\r
74 EFI_MP_SERVICES_PROTOCOL *Protocol;\r
75 EFI_PEI_MP_SERVICES_PPI *Ppi;\r
76} MP_SERVICES;\r
77\r
80c4b236
JF
78typedef struct {\r
79 UINTN FeaturesCount;\r
80 UINT32 BitMaskSize;\r
80c4b236
JF
81 LIST_ENTRY FeatureList;\r
82\r
83 CPU_FEATURES_INIT_ORDER *InitOrder;\r
7d3a7c22
SB
84 UINT8 *SupportPcd;\r
85 UINT8 *CapabilityPcd;\r
86 UINT8 *ConfigurationPcd;\r
87 UINT8 *SettingPcd;\r
80c4b236 88\r
b3c71b47
ED
89 UINT32 NumberOfCpus;\r
90 ACPI_CPU_DATA *AcpiCpuData;\r
91\r
80c4b236
JF
92 CPU_REGISTER_TABLE *RegisterTable;\r
93 CPU_REGISTER_TABLE *PreSmmRegisterTable;\r
94 UINTN BspNumber;\r
b3c71b47
ED
95\r
96 PROGRAM_CPU_REGISTER_FLAGS CpuFlags;\r
7217b879
ED
97\r
98 MP_SERVICES MpService;\r
80c4b236
JF
99} CPU_FEATURES_DATA;\r
100\r
101#define CPU_FEATURE_ENTRY_FROM_LINK(a) \\r
102 CR ( \\r
103 (a), \\r
104 CPU_FEATURES_ENTRY, \\r
105 Link, \\r
106 CPU_FEATURE_ENTRY_SIGNATURE \\r
107 )\r
108\r
109/**\r
110 Worker function to get CPU_FEATURES_DATA pointer.\r
111\r
112 @return Pointer to CPU_FEATURES_DATA.\r
113**/\r
114CPU_FEATURES_DATA *\r
115GetCpuFeaturesData (\r
116 VOID\r
117 );\r
118\r
80c4b236
JF
119/**\r
120 Worker function to return processor index.\r
121\r
7217b879
ED
122 @param CpuFeaturesData Cpu Feature Data structure.\r
123\r
80c4b236
JF
124 @return The processor index.\r
125**/\r
126UINTN\r
127GetProcessorIndex (\r
7217b879 128 IN CPU_FEATURES_DATA *CpuFeaturesData\r
80c4b236
JF
129 );\r
130\r
131/**\r
132 Gets detailed MP-related information on the requested processor at the\r
133 instant this call is made.\r
134\r
135 @param[in] ProcessorNumber The handle number of processor.\r
136 @param[out] ProcessorInfoBuffer A pointer to the buffer where information for\r
137 the requested processor is deposited.\r
138\r
139 @return Status of MpServices->GetProcessorInfo().\r
140**/\r
141EFI_STATUS\r
142GetProcessorInformation (\r
143 IN UINTN ProcessorNumber,\r
144 OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer\r
145 );\r
146\r
147/**\r
148 Worker function to execute a caller provided function on all enabled APs.\r
149\r
150 @param[in] Procedure A pointer to the function to be run on\r
151 enabled APs of the system.\r
b3c71b47
ED
152 @param[in] MpEvent A pointer to the event to be used later\r
153 to check whether procedure has done.\r
80c4b236
JF
154**/\r
155VOID\r
156StartupAPsWorker (\r
b3c71b47
ED
157 IN EFI_AP_PROCEDURE Procedure,\r
158 IN EFI_EVENT MpEvent\r
80c4b236
JF
159 );\r
160\r
161/**\r
162 Worker function to retrieve the number of logical processor in the platform.\r
163\r
164 @param[out] NumberOfCpus Pointer to the total number of logical\r
165 processors in the system, including the BSP\r
166 and disabled APs.\r
167 @param[out] NumberOfEnabledProcessors Pointer to the number of enabled logical\r
168 processors that exist in system, including\r
169 the BSP.\r
170**/\r
171VOID\r
172GetNumberOfProcessor (\r
173 OUT UINTN *NumberOfCpus,\r
174 OUT UINTN *NumberOfEnabledProcessors\r
175 );\r
176\r
177/**\r
178 Worker function to switch the requested AP to be the BSP from that point onward.\r
179\r
180 @param[in] ProcessorNumber The handle number of AP that is to become the new BSP.\r
181**/\r
182VOID\r
183SwitchNewBsp (\r
184 IN UINTN ProcessorNumber\r
185 );\r
186\r
187/**\r
188 Function that uses DEBUG() macros to display the contents of a a CPU feature bit mask.\r
189\r
190 @param[in] FeatureMask A pointer to the CPU feature bit mask.\r
191**/\r
192VOID\r
193DumpCpuFeatureMask (\r
194 IN UINT8 *FeatureMask\r
195 );\r
196\r
197/**\r
198 Dump CPU feature name or CPU feature bit mask.\r
199\r
200 @param[in] CpuFeature Pointer to CPU_FEATURES_ENTRY\r
201**/\r
202VOID\r
203DumpCpuFeature (\r
204 IN CPU_FEATURES_ENTRY *CpuFeature\r
205 );\r
206\r
b3c71b47
ED
207/**\r
208 Return feature dependence result.\r
209\r
1475b83f
ED
210 @param[in] CpuFeature Pointer to CPU feature.\r
211 @param[in] Before Check before dependence or after.\r
212 @param[in] NextCpuFeatureMask Pointer to next CPU feature Mask.\r
b3c71b47
ED
213\r
214 @retval return the dependence result.\r
215**/\r
216CPU_FEATURE_DEPENDENCE_TYPE\r
217DetectFeatureScope (\r
218 IN CPU_FEATURES_ENTRY *CpuFeature,\r
1475b83f 219 IN BOOLEAN Before,\r
a6eb94ee 220 IN UINT8 *NextCpuFeatureMask\r
b3c71b47
ED
221 );\r
222\r
c1528b85
ED
223/**\r
224 Return feature dependence result.\r
225\r
226 @param[in] CpuFeature Pointer to CPU feature.\r
227 @param[in] Before Check before dependence or after.\r
228 @param[in] FeatureList Pointer to CPU feature list.\r
229\r
230 @retval return the dependence result.\r
231**/\r
232CPU_FEATURE_DEPENDENCE_TYPE\r
233DetectNoneNeighborhoodFeatureScope (\r
234 IN CPU_FEATURES_ENTRY *CpuFeature,\r
235 IN BOOLEAN Before,\r
236 IN LIST_ENTRY *FeatureList\r
237 );\r
238\r
b3c71b47
ED
239/**\r
240 Programs registers for the calling processor.\r
241\r
242 @param[in,out] Buffer The pointer to private data buffer.\r
243\r
244**/\r
245VOID\r
246EFIAPI\r
247SetProcessorRegister (\r
248 IN OUT VOID *Buffer\r
249 );\r
250\r
251/**\r
252 Return ACPI_CPU_DATA data.\r
253\r
254 @return Pointer to ACPI_CPU_DATA data.\r
255**/\r
256ACPI_CPU_DATA *\r
257GetAcpiCpuData (\r
258 VOID\r
259 );\r
260\r
7217b879
ED
261/**\r
262 Worker function to get MP service pointer.\r
263\r
264 @return MP_SERVICES variable.\r
265**/\r
266MP_SERVICES\r
267GetMpService (\r
268 VOID\r
269 );\r
270\r
80c4b236 271#endif\r