]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
UefiCpuPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / UefiCpuPkg / Library / RegisterCpuFeaturesLib / RegisterCpuFeatures.h
CommitLineData
80c4b236
JF
1/** @file\r
2 CPU Register Table Library definitions.\r
3\r
6214ffb4 4 Copyright (c) 2017 - 2019, 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
46 UINT8 *BeforeFeatureBitMask;\r
47 UINT8 *AfterFeatureBitMask;\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 ConsoleLogLock; // Spinlock used to control console.\r
62 volatile UINTN MemoryMappedLock; // Spinlock used to program mmio\r
63 volatile UINT32 *CoreSemaphoreCount; // Semaphore containers used to program Core semaphore.\r
64 volatile UINT32 *PackageSemaphoreCount; // Semaphore containers used to program Package semaphore.\r
b3c71b47
ED
65} PROGRAM_CPU_REGISTER_FLAGS;\r
66\r
7217b879
ED
67typedef union {\r
68 EFI_MP_SERVICES_PROTOCOL *Protocol;\r
69 EFI_PEI_MP_SERVICES_PPI *Ppi;\r
70} MP_SERVICES;\r
71\r
80c4b236
JF
72typedef struct {\r
73 UINTN FeaturesCount;\r
74 UINT32 BitMaskSize;\r
80c4b236
JF
75 LIST_ENTRY FeatureList;\r
76\r
77 CPU_FEATURES_INIT_ORDER *InitOrder;\r
7d3a7c22 78 UINT8 *CapabilityPcd;\r
7d3a7c22 79 UINT8 *SettingPcd;\r
80c4b236 80\r
b3c71b47
ED
81 UINT32 NumberOfCpus;\r
82 ACPI_CPU_DATA *AcpiCpuData;\r
83\r
80c4b236
JF
84 CPU_REGISTER_TABLE *RegisterTable;\r
85 CPU_REGISTER_TABLE *PreSmmRegisterTable;\r
86 UINTN BspNumber;\r
b3c71b47
ED
87\r
88 PROGRAM_CPU_REGISTER_FLAGS CpuFlags;\r
7217b879
ED
89\r
90 MP_SERVICES MpService;\r
80c4b236
JF
91} CPU_FEATURES_DATA;\r
92\r
93#define CPU_FEATURE_ENTRY_FROM_LINK(a) \\r
94 CR ( \\r
95 (a), \\r
96 CPU_FEATURES_ENTRY, \\r
97 Link, \\r
98 CPU_FEATURE_ENTRY_SIGNATURE \\r
99 )\r
100\r
101/**\r
102 Worker function to get CPU_FEATURES_DATA pointer.\r
103\r
104 @return Pointer to CPU_FEATURES_DATA.\r
105**/\r
106CPU_FEATURES_DATA *\r
107GetCpuFeaturesData (\r
108 VOID\r
109 );\r
110\r
80c4b236
JF
111/**\r
112 Worker function to return processor index.\r
113\r
7217b879
ED
114 @param CpuFeaturesData Cpu Feature Data structure.\r
115\r
80c4b236
JF
116 @return The processor index.\r
117**/\r
118UINTN\r
119GetProcessorIndex (\r
7217b879 120 IN CPU_FEATURES_DATA *CpuFeaturesData\r
80c4b236
JF
121 );\r
122\r
123/**\r
124 Gets detailed MP-related information on the requested processor at the\r
125 instant this call is made.\r
126\r
127 @param[in] ProcessorNumber The handle number of processor.\r
128 @param[out] ProcessorInfoBuffer A pointer to the buffer where information for\r
129 the requested processor is deposited.\r
130\r
131 @return Status of MpServices->GetProcessorInfo().\r
132**/\r
133EFI_STATUS\r
134GetProcessorInformation (\r
135 IN UINTN ProcessorNumber,\r
136 OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer\r
137 );\r
138\r
139/**\r
140 Worker function to execute a caller provided function on all enabled APs.\r
141\r
142 @param[in] Procedure A pointer to the function to be run on\r
143 enabled APs of the system.\r
b3c71b47
ED
144 @param[in] MpEvent A pointer to the event to be used later\r
145 to check whether procedure has done.\r
80c4b236
JF
146**/\r
147VOID\r
148StartupAPsWorker (\r
b3c71b47
ED
149 IN EFI_AP_PROCEDURE Procedure,\r
150 IN EFI_EVENT MpEvent\r
80c4b236
JF
151 );\r
152\r
153/**\r
154 Worker function to retrieve the number of logical processor in the platform.\r
155\r
156 @param[out] NumberOfCpus Pointer to the total number of logical\r
157 processors in the system, including the BSP\r
158 and disabled APs.\r
159 @param[out] NumberOfEnabledProcessors Pointer to the number of enabled logical\r
160 processors that exist in system, including\r
161 the BSP.\r
162**/\r
163VOID\r
164GetNumberOfProcessor (\r
165 OUT UINTN *NumberOfCpus,\r
166 OUT UINTN *NumberOfEnabledProcessors\r
167 );\r
168\r
169/**\r
170 Worker function to switch the requested AP to be the BSP from that point onward.\r
171\r
172 @param[in] ProcessorNumber The handle number of AP that is to become the new BSP.\r
173**/\r
174VOID\r
175SwitchNewBsp (\r
176 IN UINTN ProcessorNumber\r
177 );\r
178\r
179/**\r
180 Function that uses DEBUG() macros to display the contents of a a CPU feature bit mask.\r
181\r
182 @param[in] FeatureMask A pointer to the CPU feature bit mask.\r
183**/\r
184VOID\r
185DumpCpuFeatureMask (\r
186 IN UINT8 *FeatureMask\r
187 );\r
188\r
189/**\r
190 Dump CPU feature name or CPU feature bit mask.\r
191\r
192 @param[in] CpuFeature Pointer to CPU_FEATURES_ENTRY\r
193**/\r
194VOID\r
195DumpCpuFeature (\r
196 IN CPU_FEATURES_ENTRY *CpuFeature\r
197 );\r
198\r
b3c71b47
ED
199/**\r
200 Return feature dependence result.\r
201\r
1475b83f
ED
202 @param[in] CpuFeature Pointer to CPU feature.\r
203 @param[in] Before Check before dependence or after.\r
204 @param[in] NextCpuFeatureMask Pointer to next CPU feature Mask.\r
b3c71b47
ED
205\r
206 @retval return the dependence result.\r
207**/\r
208CPU_FEATURE_DEPENDENCE_TYPE\r
209DetectFeatureScope (\r
210 IN CPU_FEATURES_ENTRY *CpuFeature,\r
1475b83f 211 IN BOOLEAN Before,\r
a6eb94ee 212 IN UINT8 *NextCpuFeatureMask\r
b3c71b47
ED
213 );\r
214\r
c1528b85
ED
215/**\r
216 Return feature dependence result.\r
217\r
218 @param[in] CpuFeature Pointer to CPU feature.\r
219 @param[in] Before Check before dependence or after.\r
220 @param[in] FeatureList Pointer to CPU feature list.\r
221\r
222 @retval return the dependence result.\r
223**/\r
224CPU_FEATURE_DEPENDENCE_TYPE\r
225DetectNoneNeighborhoodFeatureScope (\r
226 IN CPU_FEATURES_ENTRY *CpuFeature,\r
227 IN BOOLEAN Before,\r
228 IN LIST_ENTRY *FeatureList\r
229 );\r
230\r
b3c71b47
ED
231/**\r
232 Programs registers for the calling processor.\r
233\r
234 @param[in,out] Buffer The pointer to private data buffer.\r
235\r
236**/\r
237VOID\r
238EFIAPI\r
239SetProcessorRegister (\r
240 IN OUT VOID *Buffer\r
241 );\r
242\r
243/**\r
244 Return ACPI_CPU_DATA data.\r
245\r
246 @return Pointer to ACPI_CPU_DATA data.\r
247**/\r
248ACPI_CPU_DATA *\r
249GetAcpiCpuData (\r
250 VOID\r
251 );\r
252\r
7217b879
ED
253/**\r
254 Worker function to get MP service pointer.\r
255\r
256 @return MP_SERVICES variable.\r
257**/\r
258MP_SERVICES\r
259GetMpService (\r
260 VOID\r
261 );\r
262\r
80c4b236 263#endif\r