summaryrefslogtreecommitdiff
path: root/Include/Protocol/MpService/MpService.h
blob: e5dec6ac38f34940221afd2b9c5e7a3d7a20094b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
//*************************************************************************
//*************************************************************************
//**                                                                     **
//**        (C)Copyright 1987-2013, American Megatrends, Inc.            **
//**                                                                     **
//**                       All Rights Reserved.                          **
//**                                                                     **
//**      5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093           **
//**                                                                     **
//**                       Phone: (770)-246-8600                         **
//**                                                                     **
//*************************************************************************
//*************************************************************************

//**********************************************************************
// $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/Haswell/AMI Cpu PKG/CPU Core/CpuProtocols/MpService/MpService.h 2     2/23/12 2:05a Davidhsieh $
//
// $Revision: 2 $
//
// $Date: 2/23/12 2:05a $
//*****************************************************************************
// Revision History
// ----------------
// $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/Haswell/AMI Cpu PKG/CPU Core/CpuProtocols/MpService/MpService.h $
// 
// 2     2/23/12 2:05a Davidhsieh
// [TAG]  		EIP72056
// [Category]  	Improvement
// [Description]  	Change EFI_MP_PROC_CONTEXT to follow Intel CPU driver
// 
// 1     2/07/12 3:59a Davidhsieh
// 
// 1     7/07/11 4:41a Davidhsieh
// 
// 1     5/06/11 6:08a Davidhsieh
// First release
// 
// 3     8/03/09 4:04p Markw
// Add GetProcessorContext update.
// 
// 2     3/04/09 10:45a Markw
// Update copyright header.
// 
// 1     11/02/07 1:59p Markw
// 
// 1     11/02/07 1:45p Markw
// 
// 2     7/23/07 7:33p Markw
// Make EFI_MP_SERVICES_PROTOCOL output parameters optional.
// 
// 1     3/28/06 1:07p Markw
// 
// 
//*****************************************************************************
//<AMI_FHDR_START>
//
// Name:	MpService.h
//
// Description:	This file is an include file used to define the Protocol for the
//		        DXE Mp Service Protocol.
//
//<AMI_FHDR_END>
//*****************************************************************************

#ifndef _MP_SERVICES_H_
#define _MP_SERVICES_H_

#include "efi.h"

#ifdef __cplusplus
extern "C" {
#endif

//This Protocol has been significantly changed by the PI spec. If this protocol is used,
//be prepared to update your code accordingly.

#define EFI_MP_SERVICES_PROTOCOL_GUID \
	{0xf33261e7,0x23cb,0x11d5,0xbd,0x5c,0x0,0x80,0xc7,0x3c,0x88,0x81}

typedef VOID (*EFI_AP_PROCEDURE) (
	IN VOID	*Buffer
);

//*******************************************************
// Processor Context Buffer Definitions.
//*******************************************************
//EFI_MP_PROC_CONTEXT is copyied from Intel CPU RC, it's different from Aptio CPU module
//
typedef union {
  struct {
    UINT32  Status : 2;
    UINT32  Tested : 1;
    UINT32  Reserved1 : 13;
    UINT32  VirtualMemoryUnavailable : 1;
    UINT32  Ia32ExecutionUnavailable : 1;
    UINT32  FloatingPointUnavailable : 1;
    UINT32  MiscFeaturesUnavailable : 1;
    UINT32  Reserved2 : 12;
  } Bits;
  UINT32  Uint32;
} EFI_MP_HEALTH_FLAGS;

#define EFI_MP_HEALTH_FLAGS_STATUS_HEALTHY                  0x0
#define EFI_MP_HEALTH_FLAGS_STATUS_PERFORMANCE_RESTRICTED   0x1
#define EFI_MP_HEALTH_FLAGS_STATUS_FUNCTIONALLY_RESTRICTED  0x2

typedef struct {
  EFI_MP_HEALTH_FLAGS Flags;
  UINT32              TestStatus;
} EFI_MP_HEALTH;

typedef enum {
  EfiCpuAP                = 0,
  EfiCpuBSP,
  EfiCpuDesignationMaximum
} EFI_CPU_DESIGNATION;

typedef struct {
  UINT32  Package;
  UINT32  Die;
  UINT32  Core;
  UINT32  Thread;
} PHYSICAL_LOCATION;

typedef struct {
  UINT32              ApicID;
  BOOLEAN             Enabled;
  EFI_CPU_DESIGNATION Designation;
  EFI_MP_HEALTH       Health;
  UINTN               PackageNumber;
  UINTN               NumberOfCores;
  UINTN               NumberOfThreads;
  UINT64              ProcessorPALCompatibilityFlags;
  UINT64              ProcessorTestMask;
} EFI_MP_PROC_CONTEXT;

#define EFI_MP_PROC_CONTEXT_VERSION \
    {0x4DCFD87B, 0x2C99, 0x11d6, 0xAF, 0x22,0x00,0xA0, 0xC9, 0x44, 0xA0, 0x5B}


typedef struct _EFI_MP_SERVICES_PROTOCOL EFI_MP_SERVICES_PROTOCOL;

typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_GET_GENERAL_MP_INFO) (
	IN EFI_MP_SERVICES_PROTOCOL	*This,
	OUT UINTN	*NumberOfCPUs           OPTIONAL,
	OUT UINTN	*MaximumNumberOfCPUs    OPTIONAL,
	OUT UINTN	*NumberOfEnabledCPUs    OPTIONAL,
	OUT UINTN	*RendezvousIntNumber    OPTIONAL,
	OUT UINTN	*RendezvousProcLength   OPTIONAL
);

typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_GET_PROCESSOR_CONTEXT) (
	IN EFI_MP_SERVICES_PROTOCOL	*This,
	IN UINTN		ProcessorNumber,
	IN OUT UINTN	*BufferLength,
	IN OUT VOID		*ProcessorContextBuffer
);

typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_STARTUP_ALL_APS) (
	IN EFI_MP_SERVICES_PROTOCOL	*This,
	IN EFI_AP_PROCEDURE	Procedure,
	IN BOOLEAN		SingleThread,
	IN EFI_EVENT	WaitEvent OPTIONAL,
	IN UINTN		TimeoutInMicroSecs OPTIONAL,
	IN OUT VOID		*ProcArguments OPTIONAL,  
	OUT UINTN		*FailedCPUList OPTIONAL
);

typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_STARTUP_THIS_AP) (
	IN EFI_MP_SERVICES_PROTOCOL    *This,
	IN EFI_AP_PROCEDURE	Procedure,
	IN UINTN			ProcessorNumber,
	IN EFI_EVENT		WaitEvent OPTIONAL,
	IN UINTN			TimeoutInMicroSecs OPTIONAL,
	IN OUT VOID			*ProcArguments OPTIONAL
);

typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_SWITCH_BSP) (
	IN EFI_MP_SERVICES_PROTOCOL	*This,
	IN UINTN	ProcessorNumber,
	IN BOOLEAN	EnableOldBSP
);

typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_SEND_IPI) (
	IN EFI_MP_SERVICES_PROTOCOL    *This,
	IN UINTN	ProcessorNumber,
	IN UINTN	VectorNumber,
	IN UINTN	DeliveryMode
);

typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_ENABLEDISABLEAP) (
	IN EFI_MP_SERVICES_PROTOCOL    *This,
	IN UINTN	ProcessorNumber,
	IN BOOLEAN	Enable,
	IN VOID		*HealthState OPTIONAL
);

typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_WHOAMI) (
	IN EFI_MP_SERVICES_PROTOCOL	*This,
	OUT UINTN	*ProcessorNumber
);

typedef struct _EFI_MP_SERVICES_PROTOCOL {
	EFI_MP_SERVICES_GET_GENERAL_MP_INFO		GetGeneralMPInfo;
	EFI_MP_SERVICES_GET_PROCESSOR_CONTEXT	GetProcessorContext;
	EFI_MP_SERVICES_STARTUP_ALL_APS			StartupAllAPs;
	EFI_MP_SERVICES_STARTUP_THIS_AP			StartupThisAP;
	EFI_MP_SERVICES_SWITCH_BSP				SwitchBSP;
	EFI_MP_SERVICES_SEND_IPI				SendIPI;
	EFI_MP_SERVICES_ENABLEDISABLEAP			EnableDisableAP;
	EFI_MP_SERVICES_WHOAMI					WhoAmI;
};

/****** DO NOT WRITE BELOW THIS LINE *******/
#ifdef __cplusplus
}
#endif
#endif

//*************************************************************************
//*************************************************************************
//**                                                                     **
//**        (C)Copyright 1987-2013, American Megatrends, Inc.            **
//**                                                                     **
//**                       All Rights Reserved.                          **
//**                                                                     **
//**      5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093           **
//**                                                                     **
//**                       Phone: (770)-246-8600                         **
//**                                                                     **
//*************************************************************************
//*************************************************************************