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