summaryrefslogtreecommitdiff
path: root/Core/CPU/CPU.h
blob: 87955247d9f636f218384f548054e837a508622a (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
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
//*************************************************************************
//*************************************************************************
//**                                                                     **
//**        (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/CPU.h 3     10/17/12 2:20a Davidhsieh $
//
// $Revision: 3 $
//
//
// $Date: 10/17/12 2:20a $
//**********************************************************************
// Revision History
// ----------------
// $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/Haswell/AMI Cpu PKG/CPU Core/CPU.h $
// 
// 3     10/17/12 2:20a Davidhsieh
// [TAG]                None
// [Category]         Improvement
// [Description]      Setup items CTDP BIOS, C8, C9 and C10 created
// 
// 2     9/26/12 10:53a Davidhsieh
// [TAG]              None
// [Description]    Add CPU APIC ID data variable for S3 resume
// 
// 1     2/07/12 3:58a Davidhsieh
// 
//
//**********************************************************************

//<AMI_FHDR_START>
//---------------------------------------------------------------------------
// Name:		Cpu.h
//
// Description:	Common header for the CPU.
//
//---------------------------------------------------------------------------
//<AMI_FHDR_END>

#ifndef __CPU_H__
#define __CPU_H__


#ifdef __cplusplus
extern "C" {
#endif

#include <efi.h>

#ifdef PEI_COMPILE		//In PEI, this must be defined before including this file.
#include <pei.h>
#include <Ppi/Stall.h>
#endif

#define MP_CPU_APIC_ID_DATA_GUID \
    {0x1456cc6e, 0x22ac, 0x5289, 0x33, 0xba, 0x2e, 0x13, 0xbb, 0xda, 0xba, 0xee}
    
// Define the equates here
//CPU APIC includes
#define APIC_ALL_EXCLUDING_SELF	(3 << 18)
#define APIC_SIPI			    (6 << 8)
#define APIC_INIT			    (5 << 8)
#define APIC_SMI                (2 << 8)
#define APIC_DELIVERY_STATUS    (1 << 12)
#define APIC_LEVEL_ASSERT	    (1 << 14)
#define APIC_LEVEL_DEASSERT	    (0 << 14)
#define APIC_NO_SHORT_HAND      (0 << 18)


#define	MSR_XAPIC_BASE				0x1B
#define		XAPIC_BASE_BSP_BIT		8
#define     XAPIC_X2APIC_ENABLE_BIT 10
#define		XAPIC_GLOBAL_ENABLE_BIT	11


#define	XAPIC_ENABLE_BIT			8	// SVR SW APIC Enable/Disable Bit
#define	APIC_PRESENT_BIT			9	// APIC Present bit in Feature Flags

#define	MASK_ICR_CLEAR				0xFFF33000	// AND mask for ICR reserved bit
#define	OR_MASK_INIT_IPI			0x00004500	// OR mask to send INIT IPI
#define	OR_MASK_USE_DEST_FIELD		0x00000000	// OR mask to set dest field = "Dest Field"

//Cstate
#define C1_SUB_STATES_MASK	  0x000000f0
#define C3_SUB_STATES_MASK	  0x00000f00
#define	C6_SUB_STATES_MASK	  0x0000f000
#define	C7_SUB_STATES_MASK	  0x000f0000
#define	C8_SUB_STATES_MASK	  0x00f00000
#define	C9_SUB_STATES_MASK	  0x0f000000
#define	C10_SUB_STATES_MASK	  0xf0000000

//-----------------------------------------------------------------------------
//              Local APIC Register Equates
//-----------------------------------------------------------------------------
#define	LOCAL_APIC_ID               0x20
#define	LOCAL_APIC_VERSION          0x30
#define	LOCAL_APIC_TASK_PRI         0x80
#define	LOCAL_APIC_ARB_PRI          0x90
#define	LOCAL_APIC_PROC_PRI         0xa0
#define	LOCAL_APIC_EOI              0xb0
#define	LOCAL_APIC_LDR              0xd0
#define	LOCAL_APIC_DEST_FORMAT      0xe0
#define	LOCAL_APIC_SVR              0xf0
#define	LOCAL_APIC_ISR0             0x100
#define	LOCAL_APIC_TMR0             0x180
#define	LOCAL_APIC_IRR0             0x200
#define	LOCAL_APIC_ERR_STAT         0x280
#define	LOCAL_APIC_ICR_LO           0x300
#define	LOCAL_APIC_ICR_HI           0x310
#define	LOCAL_APIC_LVT              0x320
#define	LOCAL_APIC_PERF             0x340
#define	LOCAL_APIC_LVT_LINT0        0x350
#define	LOCAL_APIC_LVT_LINT1        0x360
#define	LOCAL_APIC_LVT_ERR          0x370
#define	LOCAL_APIC_ITC              0x380
#define	LOCAL_APIC_TIMER            0x390
#define	LOCAL_APIC_TMR_DIV          0x3e0

#define PSD_SW_ALL  0xfc
#define PSD_SW_ANY  0xfd
#define PSD_HW_ALL  0xfe

#define TSD_HW_ALL  0xfe

#define MSR_IA32_PLATFORM_ID        0x17
#define MSR_CHL_CONTROLS            0x2d
  #define  B_FORWARD_CODE_DISABLE       (1<<9)
#define MSR_IA32_CR_PIC_MSG_CONTROL 0x2e
#define MSR_CORE_THREAD_COUNT       0x35
#define MSR_IA32_FEATURE_CONTROL    0x3a
  #define SMRR_LOCK_BIT                 0x1
  #define SMRR_ENABLE_BIT               0x3
  #define SMRR_ENABLE_MASK              (1<<3)
#define MSR_SMM_SAVE_CONTROL        0x3e  
#define MSR_IA32_BIOS_UPDT_TRIG     0x79
#define MSR_IA32_BIOS_SIGN_ID       0x8b
#define MSR_PMG_CST_CONFIG_CONTROL  0xe2
#define MSR_PMG_IO_CAPTURE_ADDR     0xe4
#define MSR_PLATFORM_INFO           0xce
  #define TCC_ACTIVE_OFFSET_PROGRAMMABLE_BIT 30
  #define XE_TDP_TDC_PROGRAMMABLE_BIT		29
  #define XE_CORE_RATIO_PROGRAMMABLE_BIT	28
  #define SMM_SAVE_CONTROL_BIT	16
  #define MAX_NON_TURBO_RATIO_OFFSET	8
  #define MAX_NON_TURBO_RATIO_MASK	0xff 
#define MSR_FEATURE_CONFIG       0x13c
  #define MSR_FEATURE_CONFIG_LOCK   1
#define MSR_IA32_MCG_CAP         0x179
#define MSR_IA32_MCG_CTL         0x17b
#define MSR_FLEX_RATIO           0x194
#define MSR_IA32_PERF_STATUS     0x198
#define MSR_IA32_PERF_CTL        0x199
#define MSR_IA32_CLOCK_MODULATION 0x19a
  #define CLK_MOD_ENABLE             0x10
#define MSR_IA32_MISC_ENABLE     0x1a0
  #define TURBO_DISABLE_MASK         ((UINT64)1 << 38)
  #define TURBO_MODE_DISABLE_BIT 38
#define MSR_MISC_FEATURE_CONTROL	0x1a4
  #define DATA_REUSE_OPT            0x40
  #define DCU_IP_PREFETCHER         0x8
  #define DCU_STREAMER_PREFETCHER   0x4
  #define MLC_SPATIAL_PREFETCHER	0x2
  #define MLC_STREAMER_PREFETCHER   0x1
#define MSR_MISC_PWR_MGMT       0x1aa
  #define EIST_HW_COORD_DIS_BIT 0
  #define ENG_PERF_BIAS_EN_BIT  1
  #define LOCK_TM_INT_BIT       22
#define MSR_TURBO_POWER_CURRENT_LIMIT 0x1ac
  #define TDC_LIMIT_OVERRIDE_ENABLE_BIT	31
  #define TDC_LIMIT_MASK		0x7FFF0000
  #define TDC_LIMIT_OFFSET	16
  #define TDP_LIMIT_OVERRIDE_ENABLE_BIT	15
  #define TDP_LIMIT_MASK		0x7FFF
  #define TDP_LIMIT_OFFSET	0 
#define MSR_TURBO_RATIO_LIMIT		0x1ad
  #define MAX_RATIO_LIMIT_8C_OFFSET	56
  #define MAX_RATIO_LIMIT_7C_OFFSET	48
  #define MAX_RATIO_LIMIT_6C_OFFSET	40
  #define MAX_RATIO_LIMIT_5C_OFFSET	32
  #define MAX_RATIO_LIMIT_4C_OFFSET	24
  #define MAX_RATIO_LIMIT_3C_OFFSET	16
  #define MAX_RATIO_LIMIT_2C_OFFSET	8
  #define MAX_RATIO_LIMIT_1C_OFFSET	0
  #define MAX_RATIO_LIMIT_MASK		0xff
#define MSR_IA32_ENERGY_PERF_BIAS   0x1b0
#define MSR_FERR_CAPABILITY         0x1f1
#define MSR_EMRR_PHYSBASE           0x1f4
#define MSR_EMRR_PHYSMASK           0x1f5
#define  B_EMRR_VALID                (1 << 11)
#define MSR_IA32_PLATFORM_DCA_CAP   0x1f8
#define MSR_IA32_DCA_CAP            0x1f9
#define MSR_IA32_DCA_0_CAP          0x1fa
#define MSR_POWER_CTL               0x1fc
#define MSR_IA32_MC0_CTL            0x400
#define MSR_IA32_MC0_STATUS         0x401

// Generic MTRR equates
#define MTRR_ATTRIB_WB           6

#define MSR_IA32_MTRR_CAP        0xfe
  #define SMRR_SUPPORT_BIT       11
  #define SMRR_SUPPORT_MASK      (1 << 11)
  #define EMRR_SUPPORT_MASK      (1 << 12)
#define	MTRR_PHYS_BASE_0		0x200
#define	MTRR_PHYS_MASK_0		0x201
#define	MTRR_PHYS_BASE_1		0x202
#define	MTRR_PHYS_MASK_1		0x203
#define	MTRR_PHYS_BASE_2		0x204
#define	MTRR_PHYS_MASK_2		0x205
#define	MTRR_PHYS_BASE_3		0x206
#define	MTRR_PHYS_MASK_3		0x207
#define	MTRR_PHYS_BASE_4		0x208
#define	MTRR_PHYS_MASK_4		0x209
#define	MTRR_PHYS_BASE_5		0x20a
#define	MTRR_PHYS_MASK_5		0x20b
#define	MTRR_PHYS_BASE_6		0x20c
#define	MTRR_PHYS_MASK_6		0x20d
#define	MTRR_PHYS_BASE_7		0x20e
#define	MTRR_PHYS_MASK_7		0x20f
#define	MTRR_FIX_64K_00000		0x250
#define	MTRR_FIX_16K_80000		0x258
#define	MTRR_FIX_16K_A0000		0x259
#define	MTRR_FIX_4K_C0000		0x268
#define	MTRR_FIX_4K_C8000		0x269
#define	MTRR_FIX_4K_D0000		0x26a
#define	MTRR_FIX_4K_D8000		0x26b
#define	MTRR_FIX_4K_E0000		0x26c
#define	MTRR_FIX_4K_E8000		0x26d
#define	MTRR_FIX_4K_F0000		0x26e
#define	MTRR_FIX_4K_F8000		0x26f
#define MSR_IA32_MC8_CTL2       0x288
#define	MTRR_DEF_TYPE			0x2ff
#define MSR_NO_EVICT_MODE       0x2e0
#define   B_MSR_NO_EVICT_MODE_SETUP 1
#define   B_MSR_NO_EVICT_MODE_RUN   2
#define MSR_UNCORE_CR_MEMLOCK_COMMANDS  0x2e2

#define MSR_PP0_CURRENT_CONFIG      0x601
#define MSR_PP1_CURRENT_CONFIG      0x602
#define MSR_PACKAGE_POWER_SKU_LIMIT 0x606
#define MSR_PKGC3_IRTL              0x60a
#define MSR_PKGC6_IRTL              0x60b
#define MSR_PKGC7_IRTL              0x60c
#define MSR_TURBO_POWER_LIMIT       0x610
  #define POWER_LIMIT_1_MASK	    0x7fff
  #define POWER_LIMIT_1_TIME_MASK   0xfe0000
  #define POWER_LIMIT_2_MASK        (UINT64)0x7fff00000000
#define MSR_PACKAGE_POWER_SKU       0x614
#define MSR_PP0_POWER_LIMIT         0x638
#define MSR_PP1_POWER_LIMIT         0x640

#define MSR_EXT_XAPIC_LOGICAL_APIC_ID   0x802
#define MSR_EXT_XAPIC_VERSION           0x803
#define MSR_EXT_XAPIC_SVR               0x80f
#define  B_MSR_XAPIC_SVR_SOFTWARE_ENABLE    (1 << 8)
#define MSR_EXT_XAPIC_ICR               0x830
#define MSR_EXT_XAPIC_LVT_LINT0         0x835
#define MSR_EXT_XAPIC_LVT_LINT1         0x836

#define GAINESTOWN      0x106a0
#define WESTMERE        0x206c0
#define NEHALEM_EX      0x206e0
#define WESTMERE_EX     0x206f0
#define SANDY_BRIDGE    0x206a0
#define JAKETOWN        0x206d0
#define IVY_BRIDGE      0x306a0

#define NUM_OF_FIXED_MTRRS      11

VOID LockInc32(UINT32 *);

typedef struct {
    UINT32 SmrrSupport:1;
    UINT32 DcaSupport:1;
    UINT32 Rsv1:30;
    UINT32 Rsv2:32;
} BOARD_ADDITIONAL_FEATURE_FLAGS;

typedef struct {
    UINT32 FeatureEcx;
    UINT32 FeatureEdx;
    UINT32 ExtFeatureEax;
    UINT32 ExtFeatureEbx;
    UINT32 ExtFeatureEcx;
    UINT32 ExtFeatureEdx;
    BOARD_ADDITIONAL_FEATURE_FLAGS Flags;
} BOARD_CPU_FEATURES;

UINT32 GetMinCpuFeatures(
    IN UINT8                NumCpus,
    IN VOID                 *MpData,
    IN BOARD_CPU_FEATURES   *AllFeatures,
    OUT BOARD_CPU_FEATURES  *Feature
);


#pragma pack (1)
typedef struct {
	UINT16	Limit;
	UINTN   Base;       //This shared between 32 bit and 64 bit.
} DESCRIPTOR_TABLE;

typedef struct _MP_CPU_APICID_DATA {
  UINT8  NumberOfCpu;
  UINT8  ApicId[32];
} MP_CPU_APICID_DATA;
#pragma pack()

#define MP_AP_ONLY 0
#define MP_BSP_AP 1

#define MP_PARALLEL  0
#define MP_SERIALIZE 1

#define MP_FREERUN 0
#define MP_WAIT    1
UINT32 StartCpus(
#ifdef PEI_COMPILE
	IN EFI_PEI_SERVICES		**PeiServices,
	IN EFI_PEI_STALL_PPI	*PeiStall,
#endif
	IN VOID		            *ApGlobalData OPTIONAL,
	IN BOOLEAN				AllCpus,
	IN UINT32				ApicId,		//If only 1 cpu
    IN VOID                 *Address
);

VOID StartAllAps(
#ifdef PEI_COMPILE
	IN EFI_PEI_SERVICES	**PeiServices,
	IN EFI_PEI_STALL_PPI *PeiStall,
#endif
	OUT VOID **MpData
);
VOID PrepareApsForNormalExec(
#ifdef PEI_COMPILE
    IN EFI_PEI_SERVICES     **PeiServices,
#endif
    IN VOID    *MpData
);
VOID EarlyExecuteFunctionOnRunningCpus(
    IN VOID     *MpData,
    IN VOID 	(*Function)(UINT32, VOID *Context), //First parameters will always be 0.
    IN VOID     *Context
);
VOID RestartAp(
#ifdef PEI_COMPILE
	IN EFI_PEI_SERVICES		**PeiServices,
	IN EFI_PEI_STALL_PPI	*PeiStall,
#endif
	IN VOID		*MpData,
	IN UINT32	Cpu
);

VOID SetHaltFunction(
	IN VOID *MpData,
    IN VOID *Function
);

UINT32 GetNumCpus(VOID *MpData);
VOID ExecuteFunctionOnRunningCpus(
	IN VOID 	*MpData,
	IN BOOLEAN	ExecuteOnBsp,
	IN BOOLEAN	Serialize,
	IN BOOLEAN	Block,
	IN VOID 	(*Function)(UINT32 Cpu, VOID *Context),
	IN VOID 	*Context
);
BOOLEAN ExecuteFunctionOnCpu(
	IN VOID 	*MpData,
	IN UINT32 	Cpu,
	IN BOOLEAN	Block,
	IN VOID 	(*Function)(UINT32 Cpu, VOID *Context),
	IN VOID 	*Context
);
VOID HaltAllAps(
	IN VOID *MpData,
	IN BOOLEAN WaitUntilHalted
);
VOID HaltCpu(
	IN VOID *MpData,
	IN UINT32 Cpu,
	IN BOOLEAN WaitUntilHalted
);
BOOLEAN IsCpuHalted(
	IN VOID   *MpData,
	IN UINT32 Cpu
);

BOOLEAN IsCpuIdle(
	IN VOID   *MpData,
	IN UINT32 Cpu
);

BOOLEAN AreCpusIdle(
	IN VOID *MpData
);

UINT32 WhoIsBsp(VOID *MpData);

UINT32 GetCpuBist(IN VOID *MpData, IN UINT32 Cpu);
UINT32 GetCpuNumByApicId(VOID *MpData, UINT32 ApicId);

VOID SwitchBsp(
#ifdef PEI_COMPILE
	IN EFI_PEI_SERVICES	**PeiServices,
	IN EFI_PEI_STALL_PPI *PeiStall,
#endif
    IN VOID *MpData,
    IN UINT32 NewBsp
);

VOID ProgramLocalApic(IN UINT32 Cpu, IN VOID *Context);

/****** 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                         **
//**                                                                     **
//*************************************************************************
//*************************************************************************