summaryrefslogtreecommitdiff
path: root/ReferenceCode/Chipset/SystemAgent/Ppi/SaPlatformPolicy/SaPlatformPolicy.h
blob: d70d5da1a898948b4aefc97bdff1302adef377bd (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
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
/** @file
  Interface definition details between MRC and platform drivers during PEI phase.

@copyright
  Copyright (c) 2010 - 2013 Intel Corporation. All rights reserved
  This software and associated documentation (if any) is furnished
  under a license and may only be used or copied in accordance
  with the terms of the license. Except as permitted by such
  license, no part of this software or documentation may be
  reproduced, stored in a retrieval system, or transmitted in any
  form or by any means without the express written consent of
  Intel Corporation.

  This file contains an 'Intel Peripheral Driver' and uniquely
  identified as "Intel Reference Module" and is
  licensed for Intel CPUs and chipsets under the terms of your
  license agreement with Intel or your vendor.  This file may
  be modified by the user, subject to additional terms of the
  license agreement
**/
#ifndef _SA_PLATFORM_POLICY_PPI_H_
#define _SA_PLATFORM_POLICY_PPI_H_

#include "MrcApi.h"
#include "SaAccess.h"

///
/// SA Platform Policy for PEI phase {573EAF99-F445-46b5-A5D5-BC4A933598F3}
///
#define SA_PLATFORM_POLICY_PPI_GUID \
  { \
    0x573eaf99, 0xf445, 0x46b5, 0xa5, 0xd5, 0xbc, 0x4a, 0x93, 0x35, 0x98, 0xf3 \
  }

///
/// Extern the GUID for protocol users.
///
extern EFI_GUID gSaPlatformPolicyPpiGuid;

///
/// PPI revision number
/// Any backwards compatible changes to this PPI will result in an update in the revision number
/// Major changes will require publication of a new PPI
///
/// Revision 1: Initial version.
///             Included in SA RC 0.5.0.0
///
#define SA_PLATFORM_POLICY_PPI_REVISION   1
///
/// Revision 2: Added PCIE_CONFIGURATION.PegGen3PresetSearchVoltageMarginSteps
///                   PCIE_CONFIGURATION.PegGen3PresetSearchVoltageStartMargin
///                   PCIE_CONFIGURATION.PegGen3PresetSearchFavorTiming
///                   PCIE_CONFIGURATION.PegDataPtr
///                   PCIE_CONFIGURATION.PegGen3ForcePresetSearch
///                   PCIE_CONFIGURATION.InitPcieAspmAfterOprom
///                   PCIE_CONFIGURATION.SaIotrapSmiAddress
///             Added MEMORY_CONFIGURATION.DqPinsInterleaved
///                   MEMORY_CONFIGURATION.DIMMODTT1D
///                   MEMORY_CONFIGURATION.WRSRT
///                   MEMORY_CONFIGURATION.DIMMRONT
///
#define SA_PLATFORM_POLICY_PPI_REVISION_2 2
///
/// Revision 3: Added SA_PLATFORM_DATA.SgMode
///                   SA_PLATFORM_DATA.SgSubSystemId
///             Added SA_PLATFORM_POLICY_PPI.SgGpioData
///                   PCIE_CONFIGURATION.PegGpioData
///                   PCIE_CONFIGURATION.PegGen3PresetSearchErrorTarget
///                   PCIE_CONFIGURATION.RxCEMLoopback
///                   PCIE_CONFIGURATION.RxCEMLoopbackLane
///                   PCIE_CONFIGURATION.Gen3RxCtleP[SA_PEG_MAX_LANE >> 1]
///             Obsoleted PCIE_CONFIGURATION.PegGen3PresetSearchMarginSteps
///                       PCIE_CONFIGURATION.PegGen3PresetSearchVoltageMarginSteps
///                       PCIE_CONFIGURATION.PegGen3PresetSearchFavorTiming
///                       MEMORY_CONFIGURATION.ForceColdReset
///             Added OVERCLOCKING_CONFIGURATION.GtVoltageMode
///                   OVERCLOCKING_CONFIGURATION.OcSupport
///                   MEMORY_CONFIGURATION.MrcUltPoSafeConfig
///
#define SA_PLATFORM_POLICY_PPI_REVISION_3 3
///
/// Revision 4: Added MEMORY_CONFIGURATION.CMDVC
///                   MEMORY_CONFIGURATION.PowerDownMode
///                   MEMORY_CONFIGURATION.PwdwnIdleCounter
///                   MEMORY_CONFIGURATION.RankInterleave
///                   MEMORY_CONFIGURATION.EnhancedInterleave
///                   MEMORY_CONFIGURATION.WeaklockEn;
///                   MEMORY_CONFIGURATION.EnCmdRate
///                   MEMORY_CONFIGURATION.CmdTriStateDis
///
#define SA_PLATFORM_POLICY_PPI_REVISION_4 4
///
/// Revision 5: Added MEMORY_CONFIGURATION.BClkFrequency
///                   OVERCLOCKING_CONFIGURATION.IoaVoltageOffset
///                   OVERCLOCKING_CONFIGURATION.IodVoltageOffset
///
#define SA_PLATFORM_POLICY_PPI_REVISION_5 5
///
/// Revision 6: Added MEMORY_CONFIGURATION.tRPab
///                   MEMORY_CONFIGURATION.ALIASCHK
///             Obsoleted MEMORY_CONFIGURATION.WRXTCT
///                       PCIE_CONFIGURATION.PegGen3EqualizationPhase2
///             Added GT_CONFIGURATION.GttMmAdr
///
#define SA_PLATFORM_POLICY_PPI_REVISION_6 6
///
/// Revision 7: Obsoleted MEMORY_CONFIGURATION.B2BXTT
///                       MEMORY_CONFIGURATION.C2CXTT
///             Added     MEMORY_CONFIGURATION.MemoryTrace
///
#define SA_PLATFORM_POLICY_PPI_REVISION_7 7
///
/// Revision 8: Added PCIE_CONFIGURATION.PowerDownUnusedBundles[SA_PEG_MAX_FUN]
///
#define SA_PLATFORM_POLICY_PPI_REVISION_8 8
///
/// Revision 9: Added SA_PLATFORM_DATA.IedSize
///                   MEMORY_CONFIGURATION.RefreshRate2x
///                   MEMORY_CONFIGURATION.ChHashEnable
///                   MEMORY_CONFIGURATION.ChHashMask
///                   MEMORY_CONFIGURATION.ChHashInterleaveBit
///
#define SA_PLATFORM_POLICY_PPI_REVISION_9 9
///
/// Revision 10: Added MEMORY_CONFIGURATION.EnableExtts
///                    MEMORY_CONFIGURATION.EnableCltm
///                    MEMORY_CONFIGURATION.EnableOltm
///                    MEMORY_CONFIGURATION.EnablePwrDn
///                    MEMORY_CONFIGURATION.EnablePwrDnLpddr
///                    MEMORY_CONFIGURATION.Refresh2X
///                    MEMORY_CONFIGURATION.LpddrThermalSensor
///                    MEMORY_CONFIGURATION.LockPTMregs
///                    MEMORY_CONFIGURATION.UserPowerWeightsEn
///                    MEMORY_CONFIGURATION.EnergyScaleFact
///                    MEMORY_CONFIGURATION.RaplPwrFlCh1
///                    MEMORY_CONFIGURATION.RaplPwrFlCh0
///                    MEMORY_CONFIGURATION.RaplLim2Lock
///                    MEMORY_CONFIGURATION.RaplLim2WindX
///                    MEMORY_CONFIGURATION.RaplLim2WindY
///                    MEMORY_CONFIGURATION.RaplLim2Ena
///                    MEMORY_CONFIGURATION.RaplLim2Pwr
///                    MEMORY_CONFIGURATION.RaplLim1WindX
///                    MEMORY_CONFIGURATION.RaplLim1WindY
///                    MEMORY_CONFIGURATION.RaplLim1Ena
///                    MEMORY_CONFIGURATION.RaplLim1Pwr
///                    MEMORY_CONFIGURATION.WarmThresholdCh0Dimm0
///                    MEMORY_CONFIGURATION.WarmThresholdCh0Dimm1
///                    MEMORY_CONFIGURATION.WarmThresholdCh1Dimm0
///                    MEMORY_CONFIGURATION.WarmThresholdCh1Dimm1
///                    MEMORY_CONFIGURATION.HotThresholdCh0Dimm0
///                    MEMORY_CONFIGURATION.HotThresholdCh0Dimm1
///                    MEMORY_CONFIGURATION.HotThresholdCh1Dimm0
///                    MEMORY_CONFIGURATION.HotThresholdCh1Dimm1
///                    MEMORY_CONFIGURATION.WarmBudgetCh0Dimm0
///                    MEMORY_CONFIGURATION.WarmBudgetCh0Dimm1
///                    MEMORY_CONFIGURATION.WarmBudgetCh1Dimm0
///                    MEMORY_CONFIGURATION.WarmBudgetCh1Dimm1
///                    MEMORY_CONFIGURATION.HotBudgetCh0Dimm0
///                    MEMORY_CONFIGURATION.HotBudgetCh0Dimm1
///                    MEMORY_CONFIGURATION.HotBudgetCh1Dimm0
///                    MEMORY_CONFIGURATION.HotBudgetCh1Dimm1
///                    MEMORY_CONFIGURATION.IdleEnergyCh0Dimm1
///                    MEMORY_CONFIGURATION.IdleEnergyCh0Dimm0
///                    MEMORY_CONFIGURATION.PdEnergyCh0Dimm1
///                    MEMORY_CONFIGURATION.PdEnergyCh0Dimm0
///                    MEMORY_CONFIGURATION.ActEnergyCh0Dimm1
///                    MEMORY_CONFIGURATION.ActEnergyCh0Dimm0
///                    MEMORY_CONFIGURATION.RdEnergyCh0Dimm1
///                    MEMORY_CONFIGURATION.RdEnergyCh0Dimm0
///                    MEMORY_CONFIGURATION.WrEnergyCh0Dimm1
///                    MEMORY_CONFIGURATION.WrEnergyCh0Dimm0
///                    MEMORY_CONFIGURATION.IdleEnergyCh1Dimm1
///                    MEMORY_CONFIGURATION.IdleEnergyCh1Dimm0
///                    MEMORY_CONFIGURATION.PdEnergyCh1Dimm1
///                    MEMORY_CONFIGURATION.PdEnergyCh1Dimm0
///                    MEMORY_CONFIGURATION.ActEnergyCh1Dimm1
///                    MEMORY_CONFIGURATION.ActEnergyCh1Dimm0
///                    MEMORY_CONFIGURATION.RdEnergyCh1Dimm1
///                    MEMORY_CONFIGURATION.RdEnergyCh1Dimm0
///                    MEMORY_CONFIGURATION.WrEnergyCh1Dimm1
///                    MEMORY_CONFIGURATION.WrEnergyCh1Dimm0
///                    MEMORY_CONFIGURATION.SrefCfgEna
///                    MEMORY_CONFIGURATION.SrefCfgIdleTmr
///                    MEMORY_CONFIGURATION.ThrtCkeMinDefeat
///                    MEMORY_CONFIGURATION.ThrtCkeMinTmr
///                    MEMORY_CONFIGURATION.ThrtCkeMinDefeatLpddr
///                    MEMORY_CONFIGURATION.ThrtCkeMinTmrLpddr
#define SA_PLATFORM_POLICY_PPI_REVISION_10 10
///
/// Revision 11: Added MEMORY_CONFIGURATION.CAVrefCtlOffset
///                    MEMORY_CONFIGURATION.Ch0VrefCtlOffset
///                    MEMORY_CONFIGURATION.Ch1VrefCtlOffset
///                    MEMORY_CONFIGURATION.Ch0ClkPiCodeOffset
///                    MEMORY_CONFIGURATION.Ch1ClkPiCodeOffset
///                    MEMORY_CONFIGURATION.Ch0RcvEnOffset
///                    MEMORY_CONFIGURATION.Ch0RxDqsOffset
///                    MEMORY_CONFIGURATION.Ch0TxDqOffset
///                    MEMORY_CONFIGURATION.Ch0TxDqsOffset
///                    MEMORY_CONFIGURATION.Ch0VrefOffset
///                    MEMORY_CONFIGURATION.Ch1RcvEnOffset
///                    MEMORY_CONFIGURATION.Ch1RxDqsOffset
///                    MEMORY_CONFIGURATION.Ch1TxDqOffset
///                    MEMORY_CONFIGURATION.Ch1TxDqsOffset
///                    MEMORY_CONFIGURATION.Ch1VrefOffset
///                    PCIE_CONFIGURATION.PegComplianceTestingMode
///                    MEMORY_CONFIGURATION.MaxRttWr
#define SA_PLATFORM_POLICY_PPI_REVISION_11 11
///
/// Revision 12: Added MEMORY_CONFIGURATION.RCVENC1D
///
#define SA_PLATFORM_POLICY_PPI_REVISION_12 12
///
/// Revision 13: Added MEMORY_CONFIGURATION.MCREGOFFSET
///
#define SA_PLATFORM_POLICY_PPI_REVISION_13 13
///
/// Revision 14: Added GT_CONFIGURATION.PanelPowerEnable
///          Obsoleted MEMORY_CONFIGURATION.CAVrefCtlOffset
///                    MEMORY_CONFIGURATION.Ch0VrefCtlOffset
///                    MEMORY_CONFIGURATION.Ch1VrefCtlOffset
///                    MEMORY_CONFIGURATION.Ch0ClkPiCodeOffset
///                    MEMORY_CONFIGURATION.Ch1ClkPiCodeOffset
///                    MEMORY_CONFIGURATION.Ch0RcvEnOffset
///                    MEMORY_CONFIGURATION.Ch0RxDqsOffset
///                    MEMORY_CONFIGURATION.Ch0TxDqOffset
///                    MEMORY_CONFIGURATION.Ch0TxDqsOffset
///                    MEMORY_CONFIGURATION.Ch0VrefOffset
///                    MEMORY_CONFIGURATION.Ch1RcvEnOffset
///                    MEMORY_CONFIGURATION.Ch1RxDqsOffset
///                    MEMORY_CONFIGURATION.Ch1TxDqOffset
///                    MEMORY_CONFIGURATION.Ch1TxDqsOffset
///                    MEMORY_CONFIGURATION.Ch1VrefOffset
///                    MEMORY_CONFIGURATION.MCREGOFFSET
///
#define SA_PLATFORM_POLICY_PPI_REVISION_14 14
///
/// Revision 15: Added: MEMORY_CONFIGURATION.RMC
///
#define SA_PLATFORM_POLICY_PPI_REVISION_15 15

#ifndef SA_MC_MAX_SOCKETS
#define SA_MC_MAX_SOCKETS 4
#endif

#define S3_TIMING_DATA_LEN          9
#define S3_READ_TRAINING_DATA_LEN   16
#define S3_WRITE_TRAINING_DATA_LEN  12
#define SAVE_PRESET_SEARCH_DATA_LEN 3

#ifndef S3_RESTORE_DATA_LEN
#define S3_RESTORE_DATA_LEN (S3_TIMING_DATA_LEN + S3_READ_TRAINING_DATA_LEN + S3_WRITE_TRAINING_DATA_LEN)
#endif // S3_RESTORE_DATA_LEN

#pragma pack(1)
///
/// SA Platform Data Structure
///
typedef struct {
  UINT8   SpdAddressTable[SA_MC_MAX_SOCKETS];///< Memory DIMMs' SPD address for reading SPD data
  UINT32  MchBar;                            ///< Address of System Agent MCHBAR
  UINT32  DmiBar;                            ///< Address of System Agent DMIBAR
  UINT32  EpBar;                             ///< Address of System Agent EPBAR
  UINT32  PciExpressBar;                     ///< Address of System Agent PCI EXPRESS BAR
  UINT32  SmbusBar;                          ///< Address of System Agent SMBUS BAR
  UINT32  GdxcBar;                           ///< Address of System Agent GDXCBAR
  UINT32  TsegSize;                          ///< Size of TSEG in bytes
  UINT8   UserBd;                            ///< Mobile - 0; Desktop/UpServer - 1
  UINT8   FastBoot;                          ///< FastBoot option: enable or disable MRC FastBoot feature
  UINT32  EdramBar;                          ///< Address of System Agent EDRAMBAR. Default of 0xfed80000
  UINT16  BoardId;                           ///< Platform Board ID
  UINT8   SgMode;                            ///< SgMode (0=Disabled, 1=SG Muxed, 2=SG Muxless, 3=PEG)
  UINT16  SgSubSystemId;                     ///< Switchable Graphics Subsystem ID
  UINT32  IedSize;                           ///< Size of IED region in bytes
//AMI_OVERRIDE >> 
  UINT8 PXFixedDynamicMode;
//AMI_OVERRIDE <<
} SA_PLATFORM_DATA;

///
/// GT Configuration
///
typedef struct {
  UINT16  MmioSize;           ///< Reserved MMIO space for Graphics
  UINT16  GttSize;            ///< Gtt Memory size of IGD
  UINT8   IgdDvmt50PreAlloc;  ///< Pre-allocated memory for IGD
  UINT8   InternalGraphics;   ///< Control for enabling/disabling iGfx device
  UINT8   PrimaryDisplay;     ///< Selection of the primary display device (iGFX, External PCIe or PCI Graphics)
  UINT8   ApertureSize;       ///< Graphics aperture size
  UINT32  GttMmAdr;           ///< Address of System Agent GTTMMADR
  UINT8   PanelPowerEnable;   ///< Control for enabling/disabling VDD force bit (Required only for early enabling of eDP panel)
} GT_CONFIGURATION;

///
/// SA_SPD
///
typedef enum {
  Default,        ///< 0, Default SPD
  UserDefined,    ///< 1, User Defined profile
  XMPProfile1,    ///< 2, XMP Profile 1
  XMPProfile2     ///< 3, XMP Profile 2
} SA_SPD;

///
/// Memory Configuration
///
typedef struct {
  UINT8   EccSupport;             ///< Ecc Support option - for Desktop only
  UINT16  DdrFreqLimit;           ///< Memory Frequency setting
  UINT8   MaxTolud;               ///< Maximum top of memory size below 4G
  SA_SPD  SpdProfileSelected;     ///< SPD XMP profile selection - for XMP supported DIMM
  UINT16  tCL;                    ///< User defined Memory Timing tCL value, it's valid when SpdProfileSelected is CUSTOM_PROFILE
  UINT16  tRCD;                   ///< User defined Memory Timing tRCD value, it's valid when SpdProfileSelected is CUSTOM_PROFILE
  UINT16  tRP;                    ///< User defined Memory Timing tRP value, it's valid when SpdProfileSelected is CUSTOM_PROFILE
  UINT16  tRAS;                   ///< User defined Memory Timing tRAS value, it's valid when SpdProfileSelected is CUSTOM_PROFILE
  UINT8   NModeSupport;           ///< Memory N Mode Support - Enable user to select Auto, 1N or 2N
  UINT8   ScramblerSupport;       ///< Memory scrambler support
  UINT16  tWR;                    ///< User defined Memory Timing tWR value, it's valid when SpdProfileSelected is CUSTOM_PROFILE
  UINT16  tRFC;                   ///< User defined Memory Timing tRFC value, it's valid when SpdProfileSelected is CUSTOM_PROFILE
  UINT16  tRRD;                   ///< User defined Memory Timing tRRD value, it's valid when SpdProfileSelected is CUSTOM_PROFILE
  UINT16  tWTR;                   ///< User defined Memory Timing tWTR value, it's valid when SpdProfileSelected is CUSTOM_PROFILE
  UINT16  tRTP;                   ///< User defined Memory Timing tRP value, it's valid when SpdProfileSelected is CUSTOM_PROFILE
  UINT16  tRC;                    ///< User defined Memory Timing tRC value, it's valid when SpdProfileSelected is CUSTOM_PROFILE
  UINT16  tFAW;                   ///< User defined Memory Timing tFAW value, it's valid when SpdProfileSelected is CUSTOM_PROFILE
  UINT16  tCWL;                   ///< User defined Memory Timing tCWL value, it's valid when SpdProfileSelected is CUSTOM_PROFILE
  UINT16  tREFI;                  ///< User defined Memory Timing tREFI value, it's valid when SpdProfileSelected is CUSTOM_PROFILE
  //
  // Thermal Management
  //
  UINT8   ThermalManagement;      ///< Memory Thermal Management Support - Enable/Disable
  UINT8   PeciInjectedTemp;       ///< Enable/Disable memory temperatures to be injected to the processor via PECI
  UINT8   ExttsViaTsOnBoard;      ///< Enable/Disable routing TS-on-Board's ALERT# and THERM# to EXTTS# pins on the PCH
  UINT8   ExttsViaTsOnDimm;       ///< Enable/Disable routing TS-on-DIMM's ALERT# to EXTTS# pin on the PCH
  UINT8   VirtualTempSensor;      ///< Enable/Disable Virtual Temperature Sensor (VTS)
  BOOLEAN ForceColdReset;         ///< @deprecated since revision 3
  ///
  /// Disables a DIMM slot in the channel even if a DIMM is present. Array index represents
  /// the channel number (0 = channel 0, 1 = channel 1). 0x0 = DIMM 0 and DIMM 1 enabled.
  ///
  ///   0x1 = DIMM 0 disabled, DIMM 1 enabled.
  ///   0x2 = DIMM 0 enabled, DIMM 1 disabled.
  ///   0x3 = DIMM 0 and DIMM 1 disabled (will disable the whole channel)
  ///
  UINT8   DisableDimmChannel[SA_MC_MAX_CHANNELS];
  BOOLEAN RemapEnable;             ///< This option is used to control whether to enable/disable memory remap above 4GB
  ///
  /// Sets the serial debug message level.
  ///   0x00 = Disabled
  ///   0x01 = Errors only.
  ///   0x02 = Errors and Warnings
  ///   0x03 = Errors, Warnings, and Info
  ///   0x04 = Errors, Warnings, Info, and Events
  ///   0x05 = Displays Memory Init Execution Time Summary only.
  ///
  UINT8   SerialDebug;

  UINT8   McLock;                    ///< Enable/Disable memory configuration register locking.
  UINT8   GdxcEnable;                ///< Enable/Disable GDXC debug support feature.
  UINT8   GdxcIotSize;               ///< GDXC IOT Size in 8MB granularity
  UINT8   GdxcMotSize;               ///< GDXC MOT Size in 8MB granularity
  //
  // Training Algorithms
  //
  UINT8   ECT;                       ///< Enable/Disable Early Command Training. Note it is not recommended to change this setting from the default value
  UINT8   SOT;                       ///< Enable/Disable Sense Amp Offset Training. Note it is not recommended to change this setting from the default value
  UINT8   RDMPRT;                    ///< Enable/Disable Read MPR Training. Note it is not recommended to change this setting from the default value
  UINT8   RCVET;                     ///< Enable/Disable Receive Enable Training. Note it is not recommended to change this setting from the default value
  UINT8   JWRL;                      ///< Enable/Disable JEDEC Write Leveling Training. Note it is not recommended to change this setting from the default value
  UINT8   FWRL;                      ///< Enable/Disable Functional Write Leveling Training. Note it is not recommended to change this setting from the default value
  UINT8   WRTC1D;                    ///< Enable/Disable 1D Write Timing Centering Training. Note it is not recommended to change this setting from the default value
  UINT8   RDTC1D;                    ///< Enable/Disable 1D Read Timing Centering Training. Note it is not recommended to change this setting from the default value
  UINT8   DIMMODTT;                  ///< Enable/Disable DIMM ODT Training. Note it is not recommended to change this setting from the default value
  UINT8   WRDST;                     ///< Enable/Disable Write Drive Strength Training. Note it is not recommended to change this setting from the default value
  UINT8   WREQT;                     ///< Enable/Disable Write Equalization Training. Note it is not recommended to change this setting from the default value
  UINT8   WRXTCT;                    ///< @deprecated since revision 6
  UINT8   RDODTT;                    ///< Enable/Disable Read ODT Training. Note it is not recommended to change this setting from the default value
  UINT8   RDEQT;                     ///< Enable/Disable Read Equalization Training. Note it is not recommended to change this setting from the default value
  UINT8   RDAPT;                     ///< Enable/Disable Read Amplifier Power Training. Note it is not recommended to change this setting from the default value
  UINT8   WRTC2D;                    ///< Enable/Disable 2D Write Timing Centering Training. Note it is not recommended to change this setting from the default value
  UINT8   RDTC2D;                    ///< Enable/Disable 2D Read Timing Centering Training. Note it is not recommended to change this setting from the default value
  UINT8   WRVC2D;                    ///< Enable/Disable 2D Write Voltage Centering Training. Note it is not recommended to change this setting from the default value
  UINT8   RDVC2D;                    ///< Enable/Disable 2D Read Voltage Centering Training. Note it is not recommended to change this setting from the default value
  UINT8   B2BXTT;                    ///< @deprecated since revision 7
  UINT8   C2CXTT;                    ///< @deprecated since revision 7
  UINT8   LCT;                       ///< Enable/Disable Late Command Training. Note it is not recommended to change this setting from the default value
  UINT8   RTL;                       ///< Enable/Disable Round Trip Latency function. Note it is not recommended to change this setting from the default value
  UINT8   TAT;                       ///< Enable/Disable Turn Around Time function. Note it is not recommended to change this setting from the default value
  UINT8   RMT;                       ///< Enable/Disable Rank Margin Tool function
  UINT8   MEMTST;                    ///< Enable/Disable Memory Test function

  UINT16  DDR3Voltage;               ///< Indicates if platform supports DDR3L DIMMs
  UINT32  DDR3VoltageWaitTime;       ///< Amount of time in microseconds to wait for the DDR3 voltage to change from 1.5V to 1.35V

  BOOLEAN RmtBdatEnable;             ///< Enable/Disable creating the BIOS DATA ACPI tables and populating with the RMT data
  ///
  /// Selects the DDR base reference clock.
  ///   0x00 = Auto
  ///   0x01 = 133MHz
  ///   0x02 = 100MHz
  ///
  UINT8   RefClk;
  ///
  /// Selects the ratio to multiply the reference clock by for the DDR frequency.
  ///   0x00 = Auto
  ///   0x03 through 0x0A are valid values, all others are invalid.
  ///
  UINT8   Ratio;
  UINT8   MrcTimeMeasure;        ///< Enables serial debug level to display the MRC execution times only
  UINT8   MrcFastBoot;           ///< Enables the MRC fast boot path for faster cold boot execution
  BOOLEAN DqPinsInterleaved;     ///< Interleaving mode of DQ/DQS pins for HSW_ULT which depends on board routing
  UINT8   DIMMODTT1D;            ///< DIMM ODT 1D training switch
  UINT8   WRSRT;                 ///< Write Slew Rate traning switch
  UINT8   DIMMRONT;              ///< DIMM RON training switch
  BOOLEAN MrcUltPoSafeConfig;    ///< MRC ULT PO Safe Mode
  UINT8   CMDVC;                 ///< Command Vref Centering
  UINT8   PowerDownMode;         ///< REVISION_4 - Power Down Mode
  UINT8   PwdwnIdleCounter;      ///< REVISION_4 - Power Down Mode Idle Counter
  UINT8   RankInterleave;        ///< REVISION_4 - Rank Interleave Mode
  UINT8   EnhancedInterleave;    ///< REVISION_4 - Enhanced Interleave Mode
  UINT8   WeaklockEn;            ///< REVISION_4 - Weak Lock Enable
  UINT8   EnCmdRate;             ///< REVISION_4 - CMD Rate Enable
  UINT8   CmdTriStateDis;        ///< REVISION_4 - CMD Tri-State Disable
  UINT32  BClkFrequency;         ///< REVISION_5 - Base reference clock value, in Hertz.
  UINT16  tRPab;                 ///< REVISION_6 - User defined Memory Timing tRPab value, it's valid when SpdProfileSelected is CUSTOM_PROFILE
  UINT8   ALIASCHK;              ///< REVISION_6 - DIMM SPD Alias Check Switch
  UINT8   MemoryTrace;           ///< REVISION_7 - Memory Trace to second DDR channel using Stacked Mode
  BOOLEAN RefreshRate2x;         ///< REVISION_9 - 2x Refresh Rate Enable
  UINT8   ChHashEnable;          ///< REVISION_9 - Channel Hash Enable
  UINT16  ChHashMask;            ///< REVISION_9 - Channel Hash Mask
  UINT8   ChHashInterleaveBit;   ///< REVISION_9 - Channel Hash Enable
  UINT8   EnableExtts;           ///< REVISION_10 - Enable Extts
  UINT8   EnableCltm;            ///< REVISION_10 - Enable Closed Loop Thermal Management
  UINT8   EnableOltm;            ///< REVISION_10 - Enable Open Loop Thermal Management
  UINT8   EnablePwrDn;           ///< REVISION_10 - Enable Power Down
  UINT8   EnablePwrDnLpddr;      ///< REVISION_10 - Enable Power Down for LPDDR
  UINT8   Refresh2X;             ///< REVISION_10 - Refresh 2x
  UINT8   LpddrThermalSensor;    ///< REVISION_10 - Lpddr Thermal Sensore
  UINT8   LockPTMregs;           ///< REVISION_10 - Lock PCU Thermal Management registers
  UINT8   UserPowerWeightsEn;    ///< REVISION_10 - Allows user to explicitly set power weight, scale factor, and channel power floor values
  UINT8   EnergyScaleFact;       ///< REVISION_10 - Energy Scale Factor
  UINT8   RaplPwrFlCh1;          ///< REVISION_10 - Power Channel 1 Floor value
  UINT8   RaplPwrFlCh0;          ///< REVISION_10 - Power Channel 0 Floor value
  UINT8   RaplLim2Lock;          ///< REVISION_10 - Lock DDR_RAPL_LIMIT register
  UINT8   RaplLim2WindX;         ///< REVISION_10 - Power Limit 2 Time Window X value
  UINT8   RaplLim2WindY;         ///< REVISION_10 - Power Limit 2 Time Window Y value
  UINT8   RaplLim2Ena;           ///< REVISION_10 - Enable Power Limit 2
  UINT16  RaplLim2Pwr;           ///< REVISION_10 - Power Limit 2
  UINT8   RaplLim1WindX;         ///< REVISION_10 - Power Limit 1 Time Window X value
  UINT8   RaplLim1WindY;         ///< REVISION_10 - Power Limit 1 Time Window Y value
  UINT8   RaplLim1Ena;           ///< REVISION_10 - Enable Power Limit 1
  UINT16  RaplLim1Pwr;           ///< REVISION_10 - Power Limit 1
  UINT8   WarmThresholdCh0Dimm0; ///< REVISION_10 - Warm Threshold (Channel 0, Dimm 0)
  UINT8   WarmThresholdCh0Dimm1; ///< REVISION_10 - Warm Threshold (Channel 0, Dimm 1)
  UINT8   WarmThresholdCh1Dimm0; ///< REVISION_10 - Warm Threshold (Channel 1, Dimm 0)
  UINT8   WarmThresholdCh1Dimm1; ///< REVISION_10 - Warm Threshold (Channel 1, Dimm 1)
  UINT8   HotThresholdCh0Dimm0;  ///< REVISION_10 - Hot Threshold (Channel 0, Dimm 0)
  UINT8   HotThresholdCh0Dimm1;  ///< REVISION_10 - Hot Threshold (Channel 0, Dimm 1)
  UINT8   HotThresholdCh1Dimm0;  ///< REVISION_10 - Hot Threshold (Channel 1, Dimm 0)
  UINT8   HotThresholdCh1Dimm1;  ///< REVISION_10 - Hot Threshold (Channel 1, Dimm 1)
  UINT8   WarmBudgetCh0Dimm0;    ///< REVISION_10 - Warm Budget (Channel 0, Dimm 0)
  UINT8   WarmBudgetCh0Dimm1;    ///< REVISION_10 - Warm Budget (Channel 0, Dimm 1)
  UINT8   WarmBudgetCh1Dimm0;    ///< REVISION_10 - Warm Budget (Channel 1, Dimm 0)
  UINT8   WarmBudgetCh1Dimm1;    ///< REVISION_10 - Warm Budget (Channel 1, Dimm 1)
  UINT8   HotBudgetCh0Dimm0;     ///< REVISION_10 - Hot Budget (Channel 0, Dimm 0)
  UINT8   HotBudgetCh0Dimm1;     ///< REVISION_10 - Hot Budget (Channel 0, Dimm 1)
  UINT8   HotBudgetCh1Dimm0;     ///< REVISION_10 - Hot Budget (Channel 1, Dimm 0)
  UINT8   HotBudgetCh1Dimm1;     ///< REVISION_10 - Hot Budget (Channel 1, Dimm 1)
  UINT8   IdleEnergyCh0Dimm1;    ///< REVISION_10 - Idle Energy (Channel 0, Dimm 1)
  UINT8   IdleEnergyCh0Dimm0;    ///< REVISION_10 - Idle Energy (Channel 0, Dimm 0)
  UINT8   PdEnergyCh0Dimm1;      ///< REVISION_10 - Power Down Energy (Channel 0, Dimm 1)
  UINT8   PdEnergyCh0Dimm0;      ///< REVISION_10 - Power Down Energy (Channel 0, Dimm 0)
  UINT8   ActEnergyCh0Dimm1;     ///< REVISION_10 - Activation Energy (Channel 0, Dimm 1)
  UINT8   ActEnergyCh0Dimm0;     ///< REVISION_10 - Activation Energy (Channel 0, Dimm 0)
  UINT8   RdEnergyCh0Dimm1;      ///< REVISION_10 - Read Energy (Channel 0, Dimm 1)
  UINT8   RdEnergyCh0Dimm0;      ///< REVISION_10 - Read Energy (Channel 0, Dimm 0)
  UINT8   WrEnergyCh0Dimm1;      ///< REVISION_10 - Write Energy (Channel 0, Dimm 1)
  UINT8   WrEnergyCh0Dimm0;      ///< REVISION_10 - Write Energy (Channel 0, Dimm 0)
  UINT8   IdleEnergyCh1Dimm1;    ///< REVISION_10 - Idle Energy (Channel 1, Dimm 1)
  UINT8   IdleEnergyCh1Dimm0;    ///< REVISION_10 - Idle Energy (Channel 1, Dimm 0)
  UINT8   PdEnergyCh1Dimm1;      ///< REVISION_10 - Power Down Energy (Channel 1, Dimm 1)
  UINT8   PdEnergyCh1Dimm0;      ///< REVISION_10 - Power Down Energy (Channel 1, Dimm 0)
  UINT8   ActEnergyCh1Dimm1;     ///< REVISION_10 - Activation Energy (Channel 1, Dimm 1)
  UINT8   ActEnergyCh1Dimm0;     ///< REVISION_10 - Activation Energy (Channel 1, Dimm 0)
  UINT8   RdEnergyCh1Dimm1;      ///< REVISION_10 - Read Energy (Channel 1, Dimm 1)
  UINT8   RdEnergyCh1Dimm0;      ///< REVISION_10 - Read Energy (Channel 1, Dimm 0)
  UINT8   WrEnergyCh1Dimm1;      ///< REVISION_10 - Write Energy (Channel 1, Dimm 1)
  UINT8   WrEnergyCh1Dimm0;      ///< REVISION_10 - Write Energy (Channel 1, Dimm 0)
  UINT8   SrefCfgEna;            ///< REVISION_10 - Enable Self Refresh
  UINT16  SrefCfgIdleTmr;        ///< REVISION_10 - Self Refresh idle timer
  UINT8   ThrtCkeMinDefeat;      ///< REVISION_10 - Throttler CKE min defeature
  UINT8   ThrtCkeMinTmr;         ///< REVISION_10 - Throttler CKE min timer
  UINT8   ThrtCkeMinDefeatLpddr; ///< REVISION_10 - Throttler CKE min defeature for LPDDR
  UINT8   ThrtCkeMinTmrLpddr;    ///< REVISION_10 - Throttler CKE min timer for LPDDR
  UINT8   CAVrefCtlOffset;       ///< @deprecated since revision 14
  UINT8   Ch0VrefCtlOffset;      ///< @deprecated since revision 14
  UINT8   Ch1VrefCtlOffset;      ///< @deprecated since revision 14
  UINT8   Ch0ClkPiCodeOffset;    ///< @deprecated since revision 14
  UINT8   Ch1ClkPiCodeOffset;    ///< @deprecated since revision 14
  UINT8   Ch0RcvEnOffset;        ///< @deprecated since revision 14
  UINT8   Ch0RxDqsOffset;        ///< @deprecated since revision 14
  UINT8   Ch0TxDqOffset;         ///< @deprecated since revision 14
  UINT8   Ch0TxDqsOffset;        ///< @deprecated since revision 14
  UINT8   Ch0VrefOffset;         ///< @deprecated since revision 14
  UINT8   Ch1RcvEnOffset;        ///< @deprecated since revision 14
  UINT8   Ch1RxDqsOffset;        ///< @deprecated since revision 14
  UINT8   Ch1TxDqOffset;         ///< @deprecated since revision 14
  UINT8   Ch1TxDqsOffset;        ///< @deprecated since revision 14
  UINT8   Ch1VrefOffset;         ///< @deprecated since revision 14
  BOOLEAN AutoSelfRefreshSupport;///< REVISION_11 - FALSE = No auto self refresh support, TRUE = auto self refresh support.
  BOOLEAN ExtTemperatureSupport; ///< REVISION_11 - FALSE = No extended temperature support, TRUE = extended temperature support.
  UINT8   MaxRttWr;              ///< REVISION_11 - Maximum DIMM RTT_WR to use in power training 0 = Off, 1 = 120 ohms
  UINT8   RCVENC1D;              ///< REVISION_12 - Receive Enable Centering Training.  LPDDR Only.
  UINT8   MCREGOFFSET;           ///< @deprecated since revision 14
  UINT8   RMC;                   ///< REVISION_15 - Retrain Margin Check Enable/Disable
} MEMORY_CONFIGURATION;

typedef struct {
  UINTN   CpuId;
  UINTN   CapIda;
  UINTN   CapIdb;
  UINT16  Peg0VenId;
  UINT16  Peg0DevId;
  UINT16  Peg1VenId;
  UINT16  Peg1DevId;
  UINT16  Peg2VenId;
  UINT16  Peg2DevId;
} PRESET_SEARCH_SIGNATURE;

///
/// SA GPIO Data Structure
///
typedef struct {
  UINT8   Value;  ///< GPIO Value
  BOOLEAN Active; ///< 0=Active Low; 1=Active High
} SA_GPIO_INFO;

///
/// SA Board PEG GPIO Info
///
typedef struct {
  BOOLEAN       GpioSupport;  ///< 1=Supported; 0=Not Supported
  SA_GPIO_INFO  *SaPegReset;  ///< PEG PERST# GPIO assigned
} PEG_GPIO_DATA;

///
/// Information for PCI Express controller configuration and DMI VC enable/disable control
///
typedef struct {
  UINT8             DmiVc1;                                ///< DMI Virtual channel 1 control (enable or disable)
  UINT8             DmiVcp;                                ///< DMI Virtual channel P control (enable or disable)
  UINT8             DmiVcm;                                ///< DMI Virtual channel M control (enable or disable)
  UINT8             DmiGen2;                               ///< DMI Gen2 support control (enable or disable)
  UINT8             AlwaysEnablePeg;                       ///< Force PEG controllers to always be enabled
  UINT8             PegGenx[SA_PEG_MAX_FUN];               ///< PEG Port PCIE GenX control (Gen1, Gen2 or Gen3)
  UINT8             PegGen3Equalization;                   ///< Enable PEG Gen3 static Presets programming. 0=Disable and 1=Enable (Default)
  UINT8             Gen3RootPortPreset[SA_PEG_MAX_LANE];   ///< Used for programming PEG Gen3 preset values per lane. Range: 0 to 9, 8 is default for each lane
  UINT8             Gen3EndPointPreset[SA_PEG_MAX_LANE];   ///< Used for programming PEG Gen3 preset values per lane. Range: 0 to 9, 7 is default for each lane
  UINT8             Gen3EndPointHint[SA_PEG_MAX_LANE];     ///< Hint value per lane for GEN3 end point device. Range: 0 to 6, 2 is default for each lane
  UINT8             PegSamplerCalibrate;                   ///< Enable/Disable PEG Sampler Calibration. 0=Disable (Default) and 1=Enable
  UINT8             PegGen3EqualizationPhase2;             ///< @deprecated since revision 6
  ///
  /// Note: An attack on the PresetSearch policies could result in an apparent hang,
  ///   but the system will eventually boot.  These variables should be protected.
  ///
  UINT8             PegGen3PresetSearch;                   ///< Enable/Disable PEG Gen3 Preset Search algorithm which improves GEN3 link quality. 0=Disable and 1=Enable (Default)
  UINT16            PegGen3PresetSearchDwellTime;          ///< Used for PEG Gen3 Preset Search algorithm. Range: 0 to 65535, default is 1000
  UINT8             PegGen3PresetSearchMarginSteps;        ///< @deprecated since revision 3
  UINT8             PegGen3PresetSearchStartMargin;        ///< Used for PEG Gen3 Preset Search algorithm. Range: 4 to 255, default is 15
  UINT8             PegSwingControl;                       ///< Used for PEG Swing Control in PCIe Recipe steps. 1=Half and 2=Full (Default)
  UINT8             PegGen3PresetSearchVoltageMarginSteps; ///< @deprecated since revision 3
  UINT8             PegGen3PresetSearchVoltageStartMargin; ///< The starting value for the Gen3 preset search voltage backward margin search. Range: 4 to 255, default is 20
  UINT8             PegGen3PresetSearchFavorTiming;        ///< @deprecated since revision 3
  ///
  /// This is a memory data pointer for saved preset search results. The reference code will store
  ///   the Gen3 Preset Search results in the SaDataHob's PegData structure. In order to skip the Gen3
  ///   preset search on boots where the PEG card configuration has not changed since the previous boot,
  ///   platform code can save the contents of the SaDataHob's PegData structure in DXE and provide a
  ///   pointer to a restored copy of that data. Default value is NULL, which results in a full
  ///   preset search every boot.
  ///
  /// Note: An attack on this policy could prevent the PEG display from working until a boot when
  ///   PegDataPtr is NULL or PegGen3ForcePresetSearch is enabled.  The variable used to save the
  ///   preset search results should be protected in a way that it can only be modified by the
  ///   platform manufacturer.
  ///
  VOID              *PegDataPtr;
  ///
  /// When enabled, Gen3 preset search will be executed each boot. Otherwise, it will be skipped
  ///   and the previous Preset value will be re-used in the following boot. 0=Disable (Default)
  ///   and 1=Enable
  ///
  BOOLEAN           PegGen3ForcePresetSearch;
  ///
  /// Set to 1 to do the PCIe ASPM programming after Oprom. This will require one SMM IO Trap handler
  ///   implemented so ensure the build flag "SA_PCIE_ASPM_IN_SMM=1" is defined in compiling parameter.
  ///   Set to 0 to do the PCIe ASPM programming before Oprom. ("SA_PCIE_ASPM_IN_DXE=1" should be
  ///   defined in compiling parameter)
  ///
  /// Note:  Platform designer may include both SMM and DXE implementation (both build switch defined
  ///   as 1) and provide a setup option to support different scenarios by this policy. It is required
  ///   to have at least one implementation (either DXE or SMM implementation) included and working
  ///   on platform or it may have security concern.
  ///
  BOOLEAN           InitPcieAspmAfterOprom;
  ///
  /// This IO Trap address is required to support PCIe ASPM programming after Oprom. When build switch
  ///   "SA_PCIE_ASPM_IN_SMM=1" defined in compiling parameter this IO Trap address must be provided
  ///   and should not conflict with any other IO address used by platform
  ///
  UINT16            SaIotrapSmiAddress;
  ///
  /// This is a memory data pointer to PCIe PERST# GPIO information.  This structure is required
  ///   for PCIe Gen3 operation. The reference code will use the information in this structure in
  ///   order to reset PCIe Gen3 devices during equalization, if necessary.  Refer to the Platform
  ///   Developer's Guide (PDG) for additional details.  The default value of NULL is only valid
  ///   for systems without PCIe Gen3 devices connected to the PEG controllers.
  ///
  PEG_GPIO_DATA     *PegGpioData;
  UINT16            PegGen3PresetSearchErrorTarget;        ///< Used for PEG Gen3 Preset Search algorithm. Range: 0 to 65535, default is 4
  BOOLEAN           RxCEMLoopback;                         ///< Enable/Disable RxCEMLoopback Test Mode. 0=Disable (default) and 1=Enable
  UINT8             RxCEMLoopbackLane;                     ///< When RxCEMLoopback Test Mode enabled, a lane (0 ~ 15) has to be specified by this policy. Default is lane0 (0)
  ///
  /// PCIe Gen3 RxCTLEp per-Bundle control support. The range of the setting is (0~15). This setting
  ///   has to be specified based upon platform design and must follow the guideline. Default is 12.
  ///
  UINT8             Gen3RxCtleP[SA_PEG_MAX_BUNDLE];
  ///
  /// PCIe power down unused bundles support. It has 3 policies.
  ///   Disabled (0x0)     : No power saving.
  ///   Auto (0xFF)        : Bios will decide unused bundles to power down [if the controller max-linkwidth is greater than the endpoint max-linkwidth
  ///                        then bios will calculate the unused bundles to power down].
  ///   1-n bundles (0x1-n): Number of bundles to power down via user selection [n depends on HW configuration].
  ///
  UINT8             PowerDownUnusedBundles[SA_PEG_MAX_FUN];
  ///
  /// PCIe compliance testing mode. Set this bit to when running a PCIe compliance test. Leave disabled during normal operation.
  ///  - Disabled (0x0)     : Normal Operation          - Disable PCIe compliance testing
  ///  - Enabled  (0x1)     : PCIe Compliance Test Mode - PEG controller is in compliance testing mode, should only be set when doing PCIe compliance testing
  /// @since Added in revision 11
  UINT8             PegComplianceTestingMode;
} PCIE_CONFIGURATION;

///
/// Defines the overclocking configuration parameters for System Agent.
///
typedef struct {
  INT16   GtVoltageOffset;      ///< The voltage offset applied to GT. Valid range from -1000mv to 1000mv
  UINT16  GtVoltageOverride;    ///< The GT voltage override which is applied to the entire range of GT frequencies
  UINT16  GtExtraTurboVoltage;  ///< The adaptive voltage applied during turbo frequencies. Valid range from 0 to 2000mV
  UINT16  GtMaxOcTurboRatio;    ///< Maximum GT turbo ratio override
  INT16   SaVoltageOffset;      ///< The voltage offset applied to the SA. Valid range from -1000mv to 1000mv
  UINT8   GtVoltageMode;        ///< Specifies whether GT voltage is operating in Adaptive or Override mode - 0: Adaptive, 1: Override
  UINT8   OcSupport;            ///< Enable disable of SA overclocking mailbox commands
  INT16   IoaVoltageOffset;     ///< The voltage offset applied to the IOA domain. Valid Range -1000mv to 1000mv
  INT16   IodVoltageOffset;     ///< The voltage offset applied to the IOD domain. Valid Range -1000mv to 1000mv
} OVERCLOCKING_CONFIGURATION;

///
/// Defines the Switchable Graphics configuration parameters for System Agent.
///
typedef struct {
  BOOLEAN       GpioSupport;        ///< 1=Supported; 0=Not Supported
  SA_GPIO_INFO  *SgDgpuPwrOK;       ///< This field contain dGPU PWROK GPIO value and Level information
  SA_GPIO_INFO  *SgDgpuHoldRst;     ///< This field contain dGPU HLD RESET GPIO value and level information
  SA_GPIO_INFO  *SgDgpuPwrEnable;   ///< This field contain dGPU_PWR Enable GPIO value and level information
  SA_GPIO_INFO  *SgDgpuPrsnt;       ///< This field contain dGPU_PRSNT# GPIO value and level information
} SG_GPIO_DATA;

///
/// SA Platform Policy PPI
///
/// Note: User must initialize the policy "UserBd" based on the customer platform
/// (Mobile - 0; Desktop/UpServer - 1) in customer BIOS before executing MRC. This policy
/// isn't initialized in the Sample Code.
///
typedef struct _SA_PLATFORM_POLICY_PPI {
  ///
  /// This field specifies the revision of the PPI.  The PPI is expected to change in a
  /// backwards compatible manner as the chipset configuration options are added or removed.
  /// Major changes will result in new PPI definitions/GUID.  The PPI producer must update this
  /// field at build time.
  ///
  /// Please ensure to use SA_PLATFORM_POLICY_PPI_REVISION macro to define the protocol revision
  /// as input for this version
  ///
  UINT8                       Revision;
  SA_PLATFORM_DATA            *PlatformData;             ///< Platform specific data
  GT_CONFIGURATION            *GtConfig;                 ///< Contains the information for Graphic configurations
  MEMORY_CONFIGURATION        *MemConfig;                ///< Contains the information for Memory configurations
  PCIE_CONFIGURATION          *PcieConfig;               ///< Contains the information for PCI Express controller configurations
  OVERCLOCKING_CONFIGURATION  *OcConfig;                 ///< Contains the information for Overclocking configurations
  VOID                        *S3DataPtr;                ///< Memory data save pointer for S3 resume. The memory space should be allocated and filled with proper S3 resume data on a resume path
  UINT8                       ScramblerSeedCmosLocation; ///< @deprecated since revision 2
  SG_GPIO_DATA                *SgGpioData;               ///< Switchable Graphics GPIO data (REVISION_3)
} SA_PLATFORM_POLICY_PPI;

#pragma pack()

#endif // _SA_PLATFORM_POLICY_PPI_H_