]> git.proxmox.com Git - mirror_edk2.git/blob - UefiCpuPkg/CpuMpPei/CpuMpPei.h
d8ee2ee5fb11a7f110995bc4fd46319de3d584c5
[mirror_edk2.git] / UefiCpuPkg / CpuMpPei / CpuMpPei.h
1 /** @file
2 Definitions to install Multiple Processor PPI.
3
4 Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #ifndef _CPU_MP_PEI_H_
16 #define _CPU_MP_PEI_H_
17
18 #include <PiPei.h>
19
20 #include <Ppi/MpServices.h>
21 #include <Ppi/SecPlatformInformation.h>
22 #include <Ppi/SecPlatformInformation2.h>
23
24 #include <Register/LocalApic.h>
25
26 #include <Library/BaseLib.h>
27 #include <Library/BaseMemoryLib.h>
28 #include <Library/DebugLib.h>
29 #include <Library/HobLib.h>
30 #include <Library/LocalApicLib.h>
31 #include <Library/MtrrLib.h>
32 #include <Library/PcdLib.h>
33 #include <Library/PeimEntryPoint.h>
34 #include <Library/PeiServicesLib.h>
35 #include <Library/ReportStatusCodeLib.h>
36 #include <Library/SynchronizationLib.h>
37 #include <Library/TimerLib.h>
38 #include <Library/UefiCpuLib.h>
39
40 #include "Microcode.h"
41
42 //
43 // AP state
44 //
45 typedef enum {
46 CpuStateIdle,
47 CpuStateBusy,
48 CpuStateDisabled
49 } CPU_STATE;
50
51 //
52 // AP reset code information
53 //
54 typedef struct {
55 UINT8 *RendezvousFunnelAddress;
56 UINTN PModeEntryOffset;
57 UINTN LModeEntryOffset;
58 UINTN RendezvousFunnelSize;
59 } MP_ASSEMBLY_ADDRESS_MAP;
60
61 //
62 // CPU exchange information for switch BSP
63 //
64 typedef struct {
65 UINT8 State; // offset 0
66 UINTN StackPointer; // offset 4 / 8
67 IA32_DESCRIPTOR Gdtr; // offset 8 / 16
68 IA32_DESCRIPTOR Idtr; // offset 14 / 26
69 } CPU_EXCHANGE_ROLE_INFO;
70
71 typedef struct _PEI_CPU_MP_DATA PEI_CPU_MP_DATA;
72
73 #pragma pack()
74
75 typedef union {
76 struct {
77 UINT32 LimitLow : 16;
78 UINT32 BaseLow : 16;
79 UINT32 BaseMid : 8;
80 UINT32 Type : 4;
81 UINT32 System : 1;
82 UINT32 Dpl : 2;
83 UINT32 Present : 1;
84 UINT32 LimitHigh : 4;
85 UINT32 Software : 1;
86 UINT32 Reserved : 1;
87 UINT32 DefaultSize : 1;
88 UINT32 Granularity : 1;
89 UINT32 BaseHigh : 8;
90 } Bits;
91 UINT64 Uint64;
92 } IA32_GDT;
93
94 //
95 // MP CPU exchange information for AP reset code
96 //
97 typedef struct {
98 UINTN Lock;
99 UINTN StackStart;
100 UINTN StackSize;
101 UINTN CFunction;
102 IA32_DESCRIPTOR GdtrProfile;
103 IA32_DESCRIPTOR IdtrProfile;
104 UINTN BufferStart;
105 UINTN PmodeOffset;
106 UINTN NumApsExecuting;
107 UINTN LmodeOffset;
108 UINTN Cr3;
109 PEI_CPU_MP_DATA *PeiCpuMpData;
110 } MP_CPU_EXCHANGE_INFO;
111
112 #pragma pack()
113
114 typedef struct {
115 UINT32 ApicId;
116 EFI_HEALTH_FLAGS Health;
117 CPU_STATE State;
118 BOOLEAN CpuHealthy;
119 } PEI_CPU_DATA;
120
121 //
122 // PEI CPU MP Data save in memory
123 //
124 struct _PEI_CPU_MP_DATA {
125 UINT32 CpuCount;
126 UINT32 BspNumber;
127 UINTN Buffer;
128 UINTN CpuApStackSize;
129 MP_ASSEMBLY_ADDRESS_MAP AddressMap;
130 UINTN WakeupBuffer;
131 UINTN BackupBuffer;
132 UINTN BackupBufferSize;
133 UINTN ApFunction;
134 UINTN ApFunctionArgument;
135 volatile UINT32 FinishedCount;
136 BOOLEAN InitFlag;
137 CPU_EXCHANGE_ROLE_INFO BSPInfo;
138 CPU_EXCHANGE_ROLE_INFO APInfo;
139 MTRR_SETTINGS MtrrTable;
140 PEI_CPU_DATA *CpuData;
141 volatile MP_CPU_EXCHANGE_INFO *MpCpuExchangeInfo;
142 };
143
144 /**
145 Assembly code to get starting address and size of the rendezvous entry for APs.
146 Information for fixing a jump instruction in the code is also returned.
147
148 @param AddressMap Output buffer for address map information.
149 **/
150 VOID
151 EFIAPI
152 AsmGetAddressMap (
153 OUT MP_ASSEMBLY_ADDRESS_MAP *AddressMap
154 );
155
156 /**
157 Assembly code to load GDT table and update segment accordingly.
158
159 @param Gdtr Pointer to GDT descriptor
160 **/
161 VOID
162 EFIAPI
163 AsmInitializeGdt (
164 IN IA32_DESCRIPTOR *Gdtr
165 );
166
167
168 /**
169 This function will be called by BSP to wakeup AP.
170
171 @param PeiCpuMpData Pointer to PEI CPU MP Data
172 @param Broadcast TRUE: Send broadcast IPI to all APs
173 FALSE: Send IPI to AP by ApicId
174 @param ApicId Apic ID for the processor to be waked
175 @param Procedure The function to be invoked by AP
176 @param ProcedureArgument The argument to be passed into AP function
177 **/
178 VOID
179 WakeUpAP (
180 IN PEI_CPU_MP_DATA *PeiCpuMpData,
181 IN BOOLEAN Broadcast,
182 IN UINT32 ApicId,
183 IN EFI_AP_PROCEDURE Procedure, OPTIONAL
184 IN VOID *ProcedureArgument OPTIONAL
185 );
186
187 /**
188 Get CPU MP Data pointer from the Guided HOB.
189
190 @return Pointer to Pointer to PEI CPU MP Data
191 **/
192 PEI_CPU_MP_DATA *
193 GetMpHobData (
194 VOID
195 );
196
197 /**
198 Find the current Processor number by APIC ID.
199
200 @param PeiCpuMpData Pointer to PEI CPU MP Data
201 @param ProcessorNumber Return the pocessor number found
202
203 @retval EFI_SUCCESS ProcessorNumber is found and returned.
204 @retval EFI_NOT_FOUND ProcessorNumber is not found.
205 **/
206 EFI_STATUS
207 GetProcessorNumber (
208 IN PEI_CPU_MP_DATA *PeiCpuMpData,
209 OUT UINTN *ProcessorNumber
210 );
211
212 /**
213 Collects BIST data from PPI.
214
215 This function collects BIST data from Sec Platform Information2 PPI
216 or SEC Platform Information PPI.
217
218 @param PeiServices Pointer to PEI Services Table
219 @param PeiCpuMpData Pointer to PEI CPU MP Data
220
221 **/
222 VOID
223 CollectBistDataFromPpi (
224 IN CONST EFI_PEI_SERVICES **PeiServices,
225 IN PEI_CPU_MP_DATA *PeiCpuMpData
226 );
227
228 /**
229 Implementation of the PlatformInformation2 service in EFI_SEC_PLATFORM_INFORMATION2_PPI.
230
231 @param PeiServices The pointer to the PEI Services Table.
232 @param StructureSize The pointer to the variable describing size of the input buffer.
233 @param PlatformInformationRecord2 The pointer to the EFI_SEC_PLATFORM_INFORMATION_RECORD2.
234
235 @retval EFI_SUCCESS The data was successfully returned.
236 @retval EFI_BUFFER_TOO_SMALL The buffer was too small. The current buffer size needed to
237 hold the record is returned in StructureSize.
238
239 **/
240 EFI_STATUS
241 EFIAPI
242 SecPlatformInformation2 (
243 IN CONST EFI_PEI_SERVICES **PeiServices,
244 IN OUT UINT64 *StructureSize,
245 OUT EFI_SEC_PLATFORM_INFORMATION_RECORD2 *PlatformInformationRecord2
246 );
247
248 #endif