2 Definitions to install Multiple Processor PPI.
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
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.
15 #ifndef _CPU_MP_PEI_H_
16 #define _CPU_MP_PEI_H_
20 #include <Ppi/MpServices.h>
21 #include <Ppi/SecPlatformInformation.h>
22 #include <Ppi/SecPlatformInformation2.h>
24 #include <Register/LocalApic.h>
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>
40 #include "Microcode.h"
52 // AP reset code information
55 UINT8
*RendezvousFunnelAddress
;
56 UINTN PModeEntryOffset
;
57 UINTN LModeEntryOffset
;
58 UINTN RendezvousFunnelSize
;
59 } MP_ASSEMBLY_ADDRESS_MAP
;
62 // CPU exchange information for switch BSP
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
;
71 typedef struct _PEI_CPU_MP_DATA PEI_CPU_MP_DATA
;
87 UINT32 DefaultSize
: 1;
88 UINT32 Granularity
: 1;
95 // MP CPU exchange information for AP reset code
102 IA32_DESCRIPTOR GdtrProfile
;
103 IA32_DESCRIPTOR IdtrProfile
;
106 UINTN NumApsExecuting
;
109 PEI_CPU_MP_DATA
*PeiCpuMpData
;
110 } MP_CPU_EXCHANGE_INFO
;
116 EFI_HEALTH_FLAGS Health
;
122 // PEI CPU MP Data save in memory
124 struct _PEI_CPU_MP_DATA
{
128 UINTN CpuApStackSize
;
129 MP_ASSEMBLY_ADDRESS_MAP AddressMap
;
132 UINTN BackupBufferSize
;
134 UINTN ApFunctionArgument
;
135 volatile UINT32 FinishedCount
;
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
;
143 extern EFI_PEI_PPI_DESCRIPTOR mPeiCpuMpPpiDesc
;
147 Assembly code to get starting address and size of the rendezvous entry for APs.
148 Information for fixing a jump instruction in the code is also returned.
150 @param AddressMap Output buffer for address map information.
155 OUT MP_ASSEMBLY_ADDRESS_MAP
*AddressMap
159 Assembly code to load GDT table and update segment accordingly.
161 @param Gdtr Pointer to GDT descriptor
166 IN IA32_DESCRIPTOR
*Gdtr
170 Assembly code to do CLI-HALT loop.
180 This function will be called by BSP to wakeup AP.
182 @param PeiCpuMpData Pointer to PEI CPU MP Data
183 @param Broadcast TRUE: Send broadcast IPI to all APs
184 FALSE: Send IPI to AP by ApicId
185 @param ApicId Apic ID for the processor to be waked
186 @param Procedure The function to be invoked by AP
187 @param ProcedureArgument The argument to be passed into AP function
191 IN PEI_CPU_MP_DATA
*PeiCpuMpData
,
192 IN BOOLEAN Broadcast
,
194 IN EFI_AP_PROCEDURE Procedure
, OPTIONAL
195 IN VOID
*ProcedureArgument OPTIONAL
199 Get CPU MP Data pointer from the Guided HOB.
201 @return Pointer to Pointer to PEI CPU MP Data
209 Find the current Processor number by APIC ID.
211 @param PeiCpuMpData Pointer to PEI CPU MP Data
212 @param ProcessorNumber Return the pocessor number found
214 @retval EFI_SUCCESS ProcessorNumber is found and returned.
215 @retval EFI_NOT_FOUND ProcessorNumber is not found.
219 IN PEI_CPU_MP_DATA
*PeiCpuMpData
,
220 OUT UINTN
*ProcessorNumber
224 Collects BIST data from PPI.
226 This function collects BIST data from Sec Platform Information2 PPI
227 or SEC Platform Information PPI.
229 @param PeiServices Pointer to PEI Services Table
230 @param PeiCpuMpData Pointer to PEI CPU MP Data
234 CollectBistDataFromPpi (
235 IN CONST EFI_PEI_SERVICES
**PeiServices
,
236 IN PEI_CPU_MP_DATA
*PeiCpuMpData
240 Implementation of the PlatformInformation2 service in EFI_SEC_PLATFORM_INFORMATION2_PPI.
242 @param PeiServices The pointer to the PEI Services Table.
243 @param StructureSize The pointer to the variable describing size of the input buffer.
244 @param PlatformInformationRecord2 The pointer to the EFI_SEC_PLATFORM_INFORMATION_RECORD2.
246 @retval EFI_SUCCESS The data was successfully returned.
247 @retval EFI_BUFFER_TOO_SMALL The buffer was too small. The current buffer size needed to
248 hold the record is returned in StructureSize.
253 SecPlatformInformation2 (
254 IN CONST EFI_PEI_SERVICES
**PeiServices
,
255 IN OUT UINT64
*StructureSize
,
256 OUT EFI_SEC_PLATFORM_INFORMATION_RECORD2
*PlatformInformationRecord2