AGESA F15: AMD family15 AGESA code
[coreboot.git] / src / vendorcode / amd / agesa / f15 / Legacy / agesa.inc
1 ; ****************************************************************************
2 ; *
3 ; * @file
4 ; *
5 ; * Agesa structures and definitions
6 ; *
7 ; * Contains AMD AGESA core interface
8 ; *
9 ; * @xrefitem bom "File Content Label" "Release Content"
10 ; * @e project:      AGESA
11 ; * @e sub-project:  Include
12 ; * @e \$Revision: 60222 $   @e \$Date: 2011-10-10 23:39:36 -0600 (Mon, 10 Oct 2011) $
13 ;
14 ; ****************************************************************************
15 ; *
16 ; * Copyright (C) 2012 Advanced Micro Devices, Inc.
17 ; * All rights reserved.
18 ; *
19 ; * Redistribution and use in source and binary forms, with or without
20 ; * modification, are permitted provided that the following conditions are met:
21 ; *     * Redistributions of source code must retain the above copyright
22 ; *       notice, this list of conditions and the following disclaimer.
23 ; *     * Redistributions in binary form must reproduce the above copyright
24 ; *       notice, this list of conditions and the following disclaimer in the
25 ; *       documentation and/or other materials provided with the distribution.
26 ; *     * Neither the name of Advanced Micro Devices, Inc. nor the names of
27 ; *       its contributors may be used to endorse or promote products derived
28 ; *       from this software without specific prior written permission.
29 ; *
30 ; * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
31 ; * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
32 ; * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
33 ; * DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY
34 ; * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
35 ; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
36 ; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
37 ; * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
38 ; * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
39 ; * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40 ; *
41 ; *
42 ; **************************************************************************
43
44 INCLUDE amd.inc
45 UINT64    TEXTEQU     <QWORD>
46 UINT32    TEXTEQU     <DWORD>
47 UINT16    TEXTEQU     <WORD>
48 UINT8     TEXTEQU     <BYTE>
49 CHAR8     TEXTEQU     <BYTE>
50 BOOLEAN   TEXTEQU     <BYTE>
51 POINTER   TEXTEQU     <DWORD>
52
53  ; AGESA Types and Definitions
54
55
56
57  ; AGESA BASIC CALLOUTS
58     AGESA_MEM_RELEASE           EQU    00028000h
59
60  ; AGESA ADVANCED CALLOUTS, Processor
61     AGESA_CHECK_UMA             EQU    00028100h
62     AGESA_DO_RESET              EQU    00028101h
63     AGESA_ALLOCATE_BUFFER       EQU    00028102h
64     AGESA_DEALLOCATE_BUFFER     EQU    00028103h
65     AGESA_LOCATE_BUFFER         EQU    00028104h
66     AGESA_RUNFUNC_ONAP          EQU    00028105h
67
68  ; AGESA ADVANCED CALLOUTS, HyperTransport
69
70  ; AGESA ADVANCED CALLOUTS, Memory
71     AGESA_READ_SPD              EQU    00028140h
72     AGESA_HOOKBEFORE_DRAM_INIT  EQU    00028141h
73     AGESA_HOOKBEFORE_DQS_TRAINING       EQU    00028142h
74     AGESA_READ_SPD_RECOVERY     EQU    00028143h
75     AGESA_HOOKBEFORE_EXIT_SELF_REF      EQU    00028144h
76     AGESA_HOOKBEFORE_DRAM_INIT_RECOVERY      EQU    00028145h
77     AGESA_EXTERNAL____TRAIN_VREF_CHANGE  EQU   00028146h
78
79  ; AGESA IDS CALLOUTS
80     AGESA_GET_IDS_INIT_DATA     EQU    00028200h
81
82  ; AGESA GNB CALLOUTS
83     AGESA_GNB_PCIE_SLOT_RESET   EQU    00028301h
84
85  ; AGESA FCH CALLOUTS
86     AGESA_FCH_OEM_CALLOUT       EQU    00028401h
87
88 ; ------------------------------------------------------------------------
89
90  ; HyperTransport Interface
91
92
93
94 ; -----------------------------------------------------------------------------
95                          ; HT DEFINITIONS AND MACROS
96
97 ; -----------------------------------------------------------------------------
98
99
100  ; Width equates for call backs
101     HT_WIDTH_8_BITS             EQU    8
102     HT_WIDTH_16_BITS            EQU    16
103     HT_WIDTH_4_BITS             EQU    4
104     HT_WIDTH_2_BITS             EQU    2
105     HT_WIDTH_NO_LIMIT           EQU    HT_WIDTH_16_BITS
106
107  ; Frequency Limit equates for call backs which take a frequency supported mask.
108     HT_FREQUENCY_LIMIT_200M     EQU    1
109     HT_FREQUENCY_LIMIT_400M     EQU    7
110     HT_FREQUENCY_LIMIT_600M     EQU    1Fh
111     HT_FREQUENCY_LIMIT_800M     EQU    3Fh
112     HT_FREQUENCY_LIMIT_1000M    EQU    7Fh
113     HT_FREQUENCY_LIMIT_HT1_ONLY EQU    7Fh
114     HT_FREQUENCY_LIMIT_1200M    EQU    0FFh
115     HT_FREQUENCY_LIMIT_1400M    EQU    1FFh
116     HT_FREQUENCY_LIMIT_1600M    EQU    3FFh
117     HT_FREQUENCY_LIMIT_1800M    EQU    7FFh
118     HT_FREQUENCY_LIMIT_2000M    EQU    0FFFh
119     HT_FREQUENCY_LIMIT_2200M    EQU    1FFFh
120     HT_FREQUENCY_LIMIT_2400M    EQU    3FFFh
121     HT_FREQUENCY_LIMIT_2600M    EQU    7FFFh
122     HT_FREQUENCY_LIMIT_2800M    EQU    27FFFh
123     HT_FREQUENCY_LIMIT_3000M    EQU    67FFFh
124     HT_FREQUENCY_LIMIT_3200M    EQU    0E7FFFh
125     HT_FREQUENCY_LIMIT_3600M    EQU    1E7FFFh
126     HT_FREQUENCY_LIMIT_MAX      EQU    HT_FREQUENCY_LIMIT_3600M
127     HT_FREQUENCY_NO_LIMIT       EQU    0FFFFFFFFh
128
129  ; Unit ID Clumping special values
130     HT_CLUMPING_DISABLE         EQU    00000000h
131     HT_CLUMPING_NO_LIMIT        EQU    0FFFFFFFFh
132
133     HT_LIST_TERMINAL            EQU    0FFh
134     HT_LIST_MATCH_ANY           EQU    0FEh
135     HT_LIST_MATCH_INTERNAL_LINK EQU    0FDh
136
137  ; Event Notify definitions
138
139  ; Event definitions.
140
141  ; Coherent subfunction events
142     HT_EVENT_COH_EVENTS         EQU    10001000h
143     HT_EVENT_COH_NO_TOPOLOGY    EQU    10011000h
144     HT_EVENT_COH_OBSOLETE000    EQU    10021000h
145     HT_EVENT_COH_PROCESSOR_TYPE_MIX     EQU    10031000h
146     HT_EVENT_COH_NODE_DISCOVERED        EQU    10041000h
147     HT_EVENT_COH_MPCAP_MISMATCH EQU    10051000h
148
149  ; Non-coherent subfunction events
150     HT_EVENT_NCOH_EVENTS        EQU    10002000h
151     HT_EVENT_NCOH_BUID_EXCEED   EQU    10012000h
152     HT_EVENT_NCOH_OBSOLETE000   EQU    10022000h
153     HT_EVENT_NCOH_BUS_MAX_EXCEED        EQU    10032000h
154     HT_EVENT_NCOH_CFG_MAP_EXCEED        EQU    10042000h
155     HT_EVENT_NCOH_DEVICE_FAILED EQU    10052000h
156     HT_EVENT_NCOH_AUTO_DEPTH    EQU    10062000h
157
158  ; Optimization subfunction events
159     HT_EVENT_OPT_EVENTS         EQU    10003000h
160     HT_EVENT_OPT_REQUIRED_CAP_RETRY     EQU    10013000h
161     HT_EVENT_OPT_REQUIRED_CAP_GEN3      EQU    10023000h
162     HT_EVENT_OPT_UNUSED_LINKS   EQU    10033000h
163     HT_EVENT_OPT_LINK_PAIR_EXCEED       EQU    10043000h
164
165  ; HW Fault events
166     HT_EVENT_HW_EVENTS          EQU    10004000h
167     HT_EVENT_HW_SYNCFLOOD       EQU    10014000h
168     HT_EVENT_HW_HTCRC           EQU    10024000h
169
170  ; The Recovery HT component uses 0x10005000 for events.
171  ; For consistency, we avoid that range here.
172
173     HT_MAX_NC_BUIDS             EQU    32
174 ; ----------------------------------------------------------------------------
175                          ; HT TYPEDEFS, STRUCTURES, ENUMS
176
177 ; ----------------------------------------------------------------------------
178 MATCHED                 EQU     0               ; < The link matches the requested customization.
179 POWERED_OFF             EQU     1               ; < Power the link off.
180 UNMATCHED               EQU     2               ; < The link should be processed according to normal defaults.
181 MaxFinalLinkState       EQU     3               ; < Not a final link state, use for limit checking.
182 FINAL_LINK_STATE        TEXTEQU <DWORD>
183
184  ; Swap a device from its current id to a new one.
185
186 BUID_SWAP_ITEM    STRUCT
187   FromId                        UINT8 ?         ; < The device responding to FromId,
188   ToId                          UINT8 ?         ; < will be moved to ToId.
189 BUID_SWAP_ITEM    ENDS
190
191
192  ; Each Non-coherent chain may have a list of device swaps.  After performing the swaps,
193  ; the final in order list of device ids is provided. (There can be more swaps than devices.)
194  ; The unused entries in both are filled with 0xFF.
195
196 BUID_SWAP_LIST    STRUCT
197   Swaps                         BUID_SWAP_ITEM (HT_MAX_NC_BUIDS) DUP ({})       ; < The BUID Swaps to perform
198   FinalIds                      UINT8 (HT_MAX_NC_BUIDS) DUP (?)         ; < The ordered final BUIDs, resulting from the swaps
199 BUID_SWAP_LIST    ENDS
200
201
202  ; Control Manual Initialization of Non-Coherent Chains
203
204  ; This interface is checked every time a non-coherent chain is
205  ; processed.  BUID assignment may be controlled explicitly on a
206  ; non-coherent chain. Provide a swap list.  Swaps controls the
207  ; BUID assignment and FinalIds provides the device to device
208  ; Linking.  Device orientation can be detected automatically, or
209  ; explicitly.  See interface documentation for more details.
210
211  ; If a manual swap list is not supplied,
212  ; automatic non-coherent init assigns BUIDs starting at 1 and incrementing sequentially
213  ; based on each device's unit count.
214
215 MANUAL_BUID_SWAP_LIST    STRUCT
216    ; Match fields
217   Socket                        UINT8 ?         ; < The Socket on which this chain is located
218   Link                          UINT8 ?         ; < The Link on the host for this chain
219    ; Override fields
220   SwapList                      BUID_SWAP_LIST {}       ; < The swap list
221 MANUAL_BUID_SWAP_LIST    ENDS
222
223
224  ; Override options for DEVICE_CAP_OVERRIDE.
225
226  ; Specify which override actions should be performed.  For Checks, 1 means to check the item
227  ; and 0 means to skip the check.  For the override options, 1 means to apply the override and
228  ; 0 means to ignore the override.
229
230 DEVICE_CAP_OVERRIDE_OPTIONS    STRUCT
231   IsCheckDevVenId               UINT32 ?
232 ;   IN       UINT32  IsCheckDevVenId:1;        ; < Check Match on Device/Vendor id
233 ;   IN       UINT32  IsCheckRevision:1;         ; < Check Match on device Revision
234 ;   IN       UINT32  IsOverrideWidthIn:1;       ; < Override Width In
235 ;   IN       UINT32  IsOverrideWidthOut:1;      ; < Override Width Out
236 ;   IN       UINT32  IsOverrideFreq:1;          ; < Override Frequency
237 ;   IN       UINT32  IsOverrideClumping:1;      ; < Override Clumping
238 ;   IN       UINT32  IsDoCallout:1;             ; < Make the optional callout
239 DEVICE_CAP_OVERRIDE_OPTIONS    ENDS
240
241  ; Override capabilities of a device.
242
243  ; This interface is checked once for every Link on every IO device.
244  ; Provide the width and frequency capability if needed for this device.
245  ; This is used along with device capabilities, the limit interfaces, and northbridge
246  ; limits to compute the default settings.  The components of the device's PCI config
247  ; address are provided, so its settings can be consulted if need be.
248  ; The optional callout is a catch all.
249
250 DEVICE_CAP_OVERRIDE    STRUCT
251    ; Match fields
252   HostSocket                    UINT8 ?         ; < The Socket on which this chain is located.
253   HostLink                      UINT8 ?         ; < The Link on the host for this chain.
254   Depth                         UINT8 ?         ; < The Depth in the I/O chain from the Host.
255   DevVenId                      UINT32 ?        ; < The Device's PCI Vendor + Device ID (offset 0x00).
256   Revision                      UINT8 ?         ; < The Device's PCI Revision field (offset 0x08).
257   Link                          UINT8 ?         ; < The Device's Link number (0 or 1).
258   Options                       DEVICE_CAP_OVERRIDE_OPTIONS {}          ; < The options for this device override.
259    ; Override fields
260   LinkWidthIn                   UINT8 ?         ; < modify to change the Link Width In.
261   LinkWidthOut                  UINT8 ?         ; < modify to change the Link Width Out.
262   FreqCap                       UINT32 ?        ; < modify to change the Link's frequency capability.
263   Clumping                      UINT32 ?        ; < modify to change Unit ID clumping support.
264   Callout                       CALLOUT_ENTRY ?         ; < optional call for really complex cases, or NULL.
265 DEVICE_CAP_OVERRIDE    ENDS
266
267  ; Callout param struct for override capabilities of a device.
268
269  ; If the optional callout is implemented this param struct is passed to it.
270
271 DEVICE_CAP_CALLOUT_PARAMS    STRUCT
272   StdHeader                     AMD_CONFIG_PARAMS {}     ; < The header
273    ; Match fields
274   HostSocket                    UINT8 ?         ; < The Socket on which this chain is located.
275   HostLink                      UINT8 ?         ; < The Link on the host for this chain.
276   Depth                         UINT8 ?         ; < The Depth in the I/O chain from the Host.
277   DevVenId                      UINT32 ?        ; < The Device's PCI Vendor + Device ID (offset 0x00).
278   Revision                      UINT8 ?         ; < The Device's PCI Revision field (offset 0x08).
279   Link                          UINT8 ?         ; < The Device's Link number (0 or 1).
280   PciAddress                    PCI_ADDR {}      ; < The Device's PCI Address.
281    ; Override fields
282      LinkWidthIn                POINTER ?       ; < modify to change the Link Width In.
283      LinkWidthOut               POINTER ?       ; < modify to change the Link Width Out.
284      FreqCap                    POINTER ?       ; < modify to change the Link's frequency capability.
285      Clumping                   POINTER ?       ; < modify to change Unit ID clumping support.
286 DEVICE_CAP_CALLOUT_PARAMS    ENDS
287
288   ; Limits for CPU to CPU Links.
289
290   ; For each coherent connection this interface is checked once.
291   ; Provide the frequency and width if needed for this Link (usually based on board
292   ; restriction).  This is used with CPU device capabilities and northbridge limits
293   ; to compute the default settings.
294
295 CPU_TO_CPU_PCB_LIMITS    STRUCT
296    ; Match fields
297   SocketA                       UINT8 ?         ; < One Socket on which this Link is located
298   LinkA                         UINT8 ?         ; < The Link on this Node
299   SocketB                       UINT8 ?         ; < The other Socket on which this Link is located
300   LinkB                         UINT8 ?         ; < The Link on that Node
301    ; Limit fields
302   ABLinkWidthLimit              UINT8 ?         ; < modify to change the Link Width A->B
303   BALinkWidthLimit              UINT8 ?         ; < modify to change the Link Width B-<A
304   PcbFreqCap                    UINT32 ?        ; < modify to change the Link's frequency capability
305 CPU_TO_CPU_PCB_LIMITS    ENDS
306
307   ; Get limits for non-coherent Links.
308
309  ; For each non-coherent connection this interface is checked once.
310  ; Provide the frequency and width if needed for this Link (usually based on board
311  ; restriction).  This is used with device capabilities, device overrides, and northbridge limits
312  ; to compute the default settings.
313
314 IO_PCB_LIMITS    STRUCT
315    ; Match fields
316   HostSocket                    UINT8 ?         ; < The Socket on which this Link is located
317   HostLink                      UINT8 ?         ; < The Link about to be initialized
318   Depth                         UINT8 ?         ; < The Depth in the I/O chain from the Host
319    ; Limit fields
320   DownstreamLinkWidthLimit      UINT8 ?         ; < modify to change the Link Width going away from processor
321   UpstreamLinkWidthLimit        UINT8 ?         ; < modify to change the Link Width moving toward processor
322   PcbFreqCap                    UINT32 ?        ; < modify to change the Link's frequency capability
323 IO_PCB_LIMITS    ENDS
324
325   ; Manually control bus number assignment.
326
327  ; This interface is checked every time a non-coherent chain is processed.
328  ; If a system can not use the auto Bus numbering feature for non-coherent chain bus
329  ; assignments, this interface can provide explicit control.  For each chain, provide
330  ; the bus number range to use.
331
332 OVERRIDE_BUS_NUMBERS    STRUCT
333    ; Match fields
334   Socket                        UINT8 ?         ; < The Socket on which this chain is located
335   Link                          UINT8 ?         ; < The Link on the host for this chain
336    ; Override fields
337   SecBus                        UINT8 ?         ; < Secondary Bus number for this non-coherent chain
338   SubBus                        UINT8 ?         ; < Subordinate Bus number
339 OVERRIDE_BUS_NUMBERS    ENDS
340
341
342   ; Ignore a Link.
343
344   ; This interface is checked every time a coherent Link is found and then every
345   ; time a non-coherent Link from a CPU is found.
346   ; Any coherent or non-coherent Link from a CPU can be ignored and not used
347   ; for discovery or initialization.  Useful for connection based systems.
348   ; (Note: not checked for IO device to IO Device Links.)
349
350 IGNORE_LINK    STRUCT
351    ; Match fields
352   Socket                        UINT8 ?         ; < The Socket on which this Link is located
353   Link                          UINT8 ?         ; < The Link about to be initialized
354    ; Customization fields
355   LinkState                     FINAL_LINK_STATE ? ; < The link may be left unitialized, or powered off.
356 IGNORE_LINK    ENDS
357
358
359   ; Skip reganging of subLinks.
360
361   ; This interface is checked whenever two subLinks are both connected to the same CPUs.
362   ; Normally, unganged sublinks between the same two CPUs are reganged.
363   ; Provide a matching structure to leave the Links unganged.
364
365 SKIP_REGANG    STRUCT
366    ; Match fields
367   SocketA                       UINT8 ?         ; < One Socket on which this Link is located
368   LinkA                         UINT8 ?         ; < The Link on this Node
369   SocketB                       UINT8 ?         ; < The other Socket on which this Link is located
370   LinkB                         UINT8 ?         ; < The Link on that Node
371    ; Customization fields
372   LinkState                     FINAL_LINK_STATE ? ; < The paired sublink may be active, or powered off.
373 SKIP_REGANG    ENDS
374
375   ; The System Socket layout, which sockets are physically connected.
376
377   ; The hardware method for Socket naming is preferred.  Use this software method only
378   ; if required.
379
380 SYSTEM_PHYSICAL_SOCKET_MAP    STRUCT
381   CurrentSocket                 UINT8 ?         ; < The socket from which this connection originates.
382   CurrentLink                   UINT8 ?         ; < The Link from the source socket connects to another socket.
383   TargetSocket                  UINT8 ?         ; < The target socket which is connected on that link.
384 SYSTEM_PHYSICAL_SOCKET_MAP    ENDS
385
386 ; ----------------------------------------------------------------------------
387
388  ; This is the input structure for AmdHtInitialize.
389
390 AMD_HT_INTERFACE    STRUCT
391    ; Basic level customization
392   AutoBusStart                  UINT8 ?         ; < For automatic bus number assignment, starting bus number usually zero.
393   AutoBusMax                    UINT8 ?         ; < For automatic bus number assignment, do not assign above max.
394   AutoBusIncrement              UINT8 ?         ; < For automatic bus number assignment, each chain gets this many busses.
395
396    ; Advanced Level Customization
397   ManualBuidSwapList            POINTER ?       ; < Provide Manual Swap List, if any.
398   DeviceCapOverrideList         POINTER ?       ; < Provide Device Overrides, if any.
399   CpuToCpuPcbLimitsList         POINTER ?       ; < Provide CPU PCB Limits, if any.
400   IoPcbLimitsList               POINTER ?       ; < Provide IO PCB Limits, if any.
401   OverrideBusNumbersList        POINTER ?       ; < Provide manual Bus Number assignment, if any.
402                                                  ; < Use either auto bus numbering or override bus
403                                                  ; < numbers, not both.
404
405   IgnoreLinkList                POINTER ?       ; < Provide links to ignore, if any.
406   SkipRegangList                POINTER ?       ; < Provide links to remain unganged, if any.
407
408    ; Expert Level Customization
409   Topolist                      POINTER ?       ; < Use this topology list in addition to the built in, if not NULL.
410   SystemPhysicalSocketMap       POINTER ?
411                                                      ; < The hardware socket naming method is preferred,
412                                                      ; <  If it can't be used, this provides a software method.
413 AMD_HT_INTERFACE    ENDS
414
415 ; -----------------------------------------------------------------------------
416
417  ; HT Recovery Interface
418
419
420
421 ; -----------------------------------------------------------------------------
422 ; *              HT Recovery DEFINITIONS AND MACROS
423 ; *
424 ; *-----------------------------------------------------------------------------
425 ;
426
427  ; BBHT subfunction events
428     HT_EVENT_BB_EVENTS          EQU    10005000h
429     HT_EVENT_BB_BUID_EXCEED     EQU    10015000h
430     HT_EVENT_BB_DEVICE_FAILED   EQU    10055000h
431     HT_EVENT_BB_AUTO_DEPTH      EQU    10065000h
432
433 ; ----------------------------------------------------------------------------
434 ; *                      HT Recovery   TYPEDEFS, STRUCTURES, ENUMS
435 ; *
436 ; *----------------------------------------------------------------------------
437 ;
438
439
440  ; The Interface structure to Recovery HT.
441
442 AMD_HT_RESET_INTERFACE    STRUCT
443   ManualBuidSwapList            POINTER ?       ; < Option to manually control SB link init
444      Depth                      UINT32 ?        ; < If auto init was used this is set to the depth of the chain,
445                                    ; < else, for manual init unmodified.
446 AMD_HT_RESET_INTERFACE    ENDS
447
448
449 ;-----------------------------------------------------------------------------
450 ;                     FCH DEFINITIONS AND MACROS
451 ;
452 ;-----------------------------------------------------------------------------
453
454 ; Configuration values for SdConfig
455   SdDisable         EQU     0            ; Disabled
456   SdAmda            EQU     1            ; AMDA,  set 24,18,16,  default
457   SdDma             EQU     2            ; DMA clear 24, 16, set 18
458   SdPio             EQU     3            ; PIO clear 24,18,16
459 SD_MODE          TEXTEQU <DWORD>
460
461 ; Configuration values for SdClockControl
462   Sd50MhzTraceCableLengthWithinSixInches           EQU  4    ; 50Mhz, default
463   Sd40MhzTraceCableLengthSix2ElevenInches          EQU  6    ; 40Mhz
464   Sd25MhzTraceCableLengthEleven2TwentyfourInches   EQU  7    ; 25Mhz
465 SD_CLOCK_CONTROL  TEXTEQU <DWORD>
466
467 ; Configuration values for AzaliaController
468   AzAuto            EQU     0            ; Auto - Detect Azalia controller automatically
469   AzDisable         EQU     1            ; Diable - Disable Azalia controller
470   AzEnable          EQU     2            ; Enable - Enable Azalia controller
471 HDA_CONFIG       TEXTEQU <DWORD>
472
473 ; Configuration values for IrConfig
474   IrDisable         EQU     0            ; Disable
475   IrRxTx0           EQU     1            ; Rx and Tx0
476   IrRxTx1           EQU     2            ; Rx and Tx1
477   IrRxTx0Tx1        EQU     3            ; Rx and both Tx0,Tx1
478 IR_CONFIG        TEXTEQU <DWORD>
479
480 ; Configuration values for SataClass
481   SataNativeIde     EQU     0            ; Native IDE mode
482   SataRaid          EQU     1            ; RAID mode
483   SataAhci          EQU     2            ; AHCI mode
484   SataLegacyIde     EQU     3            ; Legacy IDE mode
485   SataIde2Ahci      EQU     4            ; IDE->AHCI mode
486   SataAhci7804      EQU     5            ; AHCI mode as 7804 ID (AMD driver)
487   SataIde2Ahci7804  EQU     6            ; IDE->AHCI mode as 7804 ID (AMD driver)
488 SATA_CLASS       TEXTEQU <DWORD>
489
490 ; Configuration values for GppLinkConfig
491   PortA4            EQU     0            ; 4:0:0:0
492   PortA2B2          EQU     2            ; 2:2:0:0
493   PortA2B1C1        EQU     3            ; 2:1:1:0
494   PortA1B1C1D1      EQU     4            ; 1:1:1:1
495 GPP_LINKMODE       TEXTEQU <DWORD>
496
497 ; Configuration values for FchPowerFail
498   AlwaysOff         EQU     0            ; Always power off after power resumes
499   AlwaysOn          EQU     1            ; Always power on after power resumes
500   UsePrevious       EQU     3            ; Resume to same setting when power fails
501 POWER_FAIL    TEXTEQU <DWORD>
502
503 ; Configuration values for SATA Link Speed
504   Gen1      EQU   1                      ; SATA port GEN1 speed
505   Gen2      EQU   2                      ; SATA port GEN2 speed
506   Gen3      EQU   3                      ; SATA port GEN3 speed
507 SATA_SPEED     TEXTEQU <DWORD>
508
509 ; Configuration values for GPIO function
510   Function0     EQU     0                ; GPIO Function 1
511   Function1     EQU     1                ; GPIO Function 1
512   Function2     EQU     2                ; GPIO Function 2
513   Function3     EQU     3                ; GPIO Function 3
514 GPIO_FUN      TEXTEQU <DWORD>
515
516 ; Configuration values for GPIO_CFG
517   OwnedByEc     EQU     1                ; This bit can only be written by EC
518   OwnedByHost   EQU     2                ; This bit can only be written by host (BIOS)
519   Sticky        EQU     4                ; If set, [6:3] are sticky
520   PullUpB       EQU     8                ; 0: Pullup enable; 1: Pullup disabled
521   PullDown      EQU     16               ; 0: Pulldown disabled; 1: Pulldown enable
522   GpioOutEnB    EQU     32               ; 0: Output enable; 1: Output disable
523   GpioOut       EQU     64               ; Output state when GpioOutEnB is 0
524   GpioIn        EQU     128              ; This bit is read only - current pin state
525 CFG_BYTE      TEXTEQU <DWORD>
526
527 ; FCH GPIO CONTROL
528 GPIO_CONTROL   STRUCT
529   GpioPin        UINT8     ?             ; Gpio Pin, valid range: 0-67, 128-150, 160-228
530   PinFunction    GPIO_FUN  ?             ; Multi-function selection
531   CfgByte        CFG_BYTE  ?             ; GPIO Register value
532 GPIO_CONTROL   ENDS
533
534 ; FCH SCI MAP CONTROL
535 SCI_MAP_CONTROL   STRUCT
536   InputPin        UINT8    ?             ; Input Pin, valid range 0-63
537   GpeMap          UINT8    ?             ; Gpe Map, valid range 0-31
538 SCI_MAP_CONTROL   ENDS
539
540 ; FCH SATA PHY CONTROL
541 SATA_PHY_CONTROL   STRUCT
542   CommonPhy       BOOLEAN      ?         ; Common PHY or not
543   Gen             SATA_SPEED   ?         ; SATA speed
544   Port            UINT8        ?         ; Port number, valid range: 0-7
545   PhyData         UINT32       ?         ; SATA PHY data, valid range: 0-0xFFFFFFFF
546 SATA_PHY_CONTROL   ENDS
547
548 ;
549 ; FCH Component Data Structure in InitReset stage
550 ;
551 FCH_RESET_INTERFACE    STRUCT
552   UmiGen2         BOOLEAN    ?      ; Enable Gen2 data rate of UMI
553                                     ;   FALSE - Disable Gen2
554                                     ;   TRUE  - Enable Gen2
555
556   SataEnable      BOOLEAN    ?      ; SATA controller function
557                                     ;   FALSE - SATA controller is disabled
558                                     ;   TRUE  - SATA controller is enabled
559
560   IdeEnable       BOOLEAN    ?      ; SATA IDE controller mode enabled/disabled
561                                     ;   FALSE - IDE controller is disabled
562                                     ;   TRUE  - IDE controller is enabled
563
564   GppEnable       BOOLEAN    ?      ; Master switch of GPP function
565                                     ;   FALSE - GPP disabled
566                                     ;   TRUE  - GPP enabled
567
568   Xhci0Enable     BOOLEAN    ?      ; XHCI0 controller function
569                                     ;   FALSE - XHCI0 controller disabled
570                                     ;   TRUE  - XHCI0 controller enabled
571
572   Xhci1Enable     BOOLEAN    ?      ; XHCI1 controller function
573                                     ;   FALSE - XHCI1 controller disabled
574                                     ;   TRUE  - XHCI1 controller enabled
575
576 FCH_RESET_INTERFACE    ENDS
577
578
579 ;
580 ; FCH Component Data Structure from InitEnv stage
581 ;
582 FCH_INTERFACE        STRUCT
583   SdConfig             SD_MODE      ?    ; Secure Digital (SD) controller mode
584   AzaliaController     HDA_CONFIG   ?    ; Azalia HD Audio Controller
585   IrConfig             IR_CONFIG    ?    ; Infrared (IR) Configuration
586   UmiGen2              BOOLEAN      ?    ; Enable Gen2 data rate of UMI
587                                          ;   FALSE - Disable Gen2
588                                          ;   TRUE  - Enable Gen2
589   SataClass            SATA_CLASS   ?    ; SATA controller mode
590   SataEnable           BOOLEAN      ?    ; SATA controller function
591                                          ;   FALSE - SATA controller is disabled
592                                          ;   TRUE  - SATA controller is enabled
593   IdeEnable            BOOLEAN      ?    ; SATA IDE controller mode enabled/disabled
594                                          ;   FALSE - IDE controller is disabled
595                                          ;   TRUE  - IDE controller is enabled
596   SataIdeMode          BOOLEAN      ?    ; Native mode of SATA IDE controller
597                                          ;   FALSE - Legacy IDE mode
598                                          ;   TRUE  - Native IDE mode
599   Ohci1Enable          BOOLEAN      ?    ; OHCI controller #1 Function
600                                          ;   FALSE - OHCI1 is disabled
601                                          ;   TRUE  - OHCI1 is enabled
602   Ohci2Enable          BOOLEAN      ?    ; OHCI controller #2 Function
603                                          ;   FALSE - OHCI2 is disabled
604                                          ;   TRUE  - OHCI2 is enabled
605   Ohci3Enable          BOOLEAN      ?    ; OHCI controller #3 Function
606                                          ;   FALSE - OHCI3 is disabled
607                                          ;   TRUE  - OHCI3 is enabled
608   Ohci4Enable          BOOLEAN      ?    ; OHCI controller #4 Function
609                                          ;   FALSE - OHCI4 is disabled
610                                          ;   TRUE  - OHCI4 is enabled
611   XhciSwitch           BOOLEAN      ?    ; XHCI controller Function
612                                          ;   FALSE - XHCI is disabled
613                                          ;   TRUE  - XHCI is enabled
614   GppEnable            BOOLEAN      ?    ; Master switch of GPP function
615                                          ;   FALSE - GPP disabled
616                                          ;   TRUE  - GPP enabled
617   FchPowerFail         POWER_FAIL   ?    ; FCH power failure option
618 FCH_INTERFACE        ENDS
619
620
621 ; ---------------------------------------------------------------------------
622 ;  CPU Feature related info
623 ; ---------------------------------------------------------------------------
624  ; Build Configuration values for BLDCFG_PLATFORM_C1E_MODE
625   C1eModeDisabled                   EQU    0    ; < Disabled
626   C1eModeAuto                       EQU    1    ; < Auto mode enables the best C1e method for the
627                                                 ; < currently installed processor
628   C1eModeHardware                   EQU    2    ; < Hardware method
629   C1eModeMsgBased                   EQU    3    ; < Message-based method
630   C1eModeSoftwareDeprecated         EQU    4    ; < Deprecated software SMI method
631   C1eModeHardwareSoftwareDeprecated EQU    5    ; < Hardware or Deprecated software SMI method
632   MaxC1eMode                        EQU    6    ; < Not a valid value, used for verifying input
633 PLATFORM_C1E_MODES TEXTEQU  <DWORD>
634
635  ; Build Configuration values for BLDCFG_PLATFORM_CSTATE_MODE
636   CStateModeDisabled       EQU 0        ; < Disabled
637   CStateModeC6             EQU 1        ; < C6 State
638   MaxCStateMode            EQU 2        ; < Not a valid value, used for verifying input
639 PLATFORM_CSTATE_MODES TEXTEQU  <DWORD>
640
641  ; Build Configuration values for BLDCFG_PLATFORM_CPB_MODE
642   CpbModeAuto              EQU 0        ; < Auto
643   CpbModeDisabled          EQU 1        ; < Disabled
644   MaxCpbMode               EQU 2        ; < Not a valid value, used for verifying input
645 PLATFORM_CPB_MODES TEXTEQU  <DWORD>
646
647  ; Build Configuration values for BLDCFG_LOW_POWER_PSTATE_FOR_PROCHOT_MODE
648   LOW_POWER_PSTATE_FOR_PROCHOT_AUTO       EQU 0        ; < Auto
649   LOW_POWER_PSTATE_FOR_PROCHOT_DISABLE    EQU 1        ; < Disabled
650   MAX_LOW_POWER_PSTATE_FOR_PROCHOT_MODE   EQU 2        ; < Not a valid value, used for verifying input
651 PLATFORM_LOW_POWER_PSTATE_MODES TEXTEQU  <DWORD>
652
653 ;----------------------------------------------------------------------------
654 ;   GNB PCIe configuration info
655 ;----------------------------------------------------------------------------
656
657 GNB_EVENT_INVALID_CONFIGURATION                 EQU  20010000h   ; User configuration invalid
658 GNB_EVENT_INVALID_PCIE_TOPOLOGY_CONFIGURATION   EQU  20010001h   ; Requested lane allocation for PCIe port can not be supported
659 GNB_EVENT_INVALID_PCIE_PORT_CONFIGURATION       EQU  20010002h   ; Requested incorrect PCIe port device address
660 GNB_EVENT_INVALID_DDI_LINK_CONFIGURATION        EQU  20010003h   ; Incorrect parameter in DDI link configuration
661 GNB_EVENT_INVALID_LINK_WIDTH_CONFIGURATION      EQU  20010004h   ; Invalid with for PCIe port or DDI link
662 GNB_EVENT_INVALID_LANES_CONFIGURATION           EQU  20010005h   ; Lane double subscribe lanes
663 GNB_EVENT_INVALID_DDI_TOPOLOGY_CONFIGURATION    EQU  20010006h   ; Requested lane allocation for DDI link(s) can not be supported
664 GNB_EVENT_LINK_TRAINING_FAIL                    EQU  20020000h   ; PCIe Link training fail
665 GNB_EVENT_BROKEN_LANE_RECOVERY                  EQU  20030000h   ; Broken lane workaround applied to recover link training
666 GNB_EVENT_GEN2_SUPPORT_RECOVERY                 EQU  20040000h   ; Scale back to GEN1 to recover link training
667
668 DESCRIPTOR_TERMINATE_LIST                       EQU  80000000h
669 DESCRIPTOR_IGNORE                               EQU  40000000h
670
671 PCIe_PORT_MISC_CONTROL          STRUCT
672   LinkComplianceMode            UINT8  ?
673  ;IN      UINT8  LinkComplianceMode :1;                   ;< Force port into compliance mode (device will not be trained, port output compliance pattern)
674 PCIe_PORT_MISC_CONTROL          ENDS
675
676 PCIe_PORT_DATA                  STRUCT
677   PortPresent                   UINT8  ?                  ; < Enable PCIe port for initialization.
678   ChannelType                   UINT8  ?                  ; < Channel type.
679                                                           ;  0 - "lowLoss",
680                                                           ;  1 - "highLoss",
681                                                           ;  2 - "mob0db",
682                                                           ;  3 - "mob3db",
683                                                           ;  4 - "extnd6db"
684                                                           ;  5 - "extnd8db"
685                                                           ;
686   DeviceNumber                  UINT8  ?                  ; < Device number for port. Available device numbers may very on different CPUs.
687   FunctionNumber                UINT8  ?                  ; < Reserved for future use
688   LinkSpeedCapability           UINT8  ?                  ; < Advertised Gen Capability
689                                                           ;  0 - Maximum supported by silicon
690                                                           ;  1 - Gen1
691                                                           ;  2 - Gen2
692                                                           ;  3 - Gen3
693                                                           ;
694   LinkAspm                      UINT8  ?                  ; < ASPM control. (see OemPcieLinkAspm for additional option to control ASPM)
695                                                           ;  0 - Disabled
696                                                           ;  1 - L0s only
697                                                           ;  2 - L1 only
698                                                           ;  2 - L0s and L1
699                                                           ;
700   LinkHotplug                   UINT8  ?                  ; < Hotplug control.
701                                                           ;  0 - Disabled
702                                                           ;  1 - Basic
703                                                           ;  2 - Server
704                                                           ;  3 - Enhanced
705                                                           ;
706   ResetId                       UINT8  ?                  ; < Arbitrary number greater than 0 assigned by platform firmware for GPIO
707                                                           ; identification which control reset for given port.
708                                                           ; Each port with unique GPIO should have unique ResetId assigned.
709                                                           ; All ports use same GPIO to control reset should have same ResetId assigned.
710                                                           ; see AgesaPcieSlotResetControl
711                                                           ;
712   MiscControls                  PCIe_PORT_MISC_CONTROL {} ; < Misc extended controls
713 PCIe_PORT_DATA                  ENDS
714
715 ;DDI channel lane mapping
716
717 CHANNEL_MAPPING             STRUCT                    ;
718   Lane0                         UINT8  ?                  ;
719     ;IN      UINT8              Lane0   :2;                 ;
720     ;IN      UINT8              Lane1   :2;                ///< Lane 1 mapping (see "Lane 0 mapping")
721     ;IN      UINT8              Lane2   :2;                ///< Lane 2 mapping (see "Lane 0 mapping")
722     ;IN      UINT8              Lane3   :2;                ///< Lane 3 mapping (see "Lane 0 mapping")
723 CHANNEL_MAPPING             ENDS                      ;
724
725 CONN_CHANNEL_MAPPING            UNION
726   ChannelMappingValue           UINT8  ?                  ; < Raw lane mapping
727   ChannelMapping                CHANNEL_MAPPING {}    ;
728 CONN_CHANNEL_MAPPING            ENDS                      ;
729
730 ; DDI Configuration
731 PCIe_DDI_DATA                   STRUCT
732   ConnectorType                 UINT8  ?                  ; < Display Connector Type
733                                                           ;  0 - DP
734                                                           ;  1 - eDP
735                                                           ;  2 - Single Link DVI
736                                                           ;  3 - Dual  Link DVI
737                                                           ;  4 - HDMI
738                                                           ;  5 - Travis DP-to-VGA
739                                                           ;  6 - Travis DP-to-LVDS
740                                                           ;  7 - Hudson-2 NutMeg DP-to-VGA
741                                                           ;  8 - Single Link DVI-I
742                                                           ;  9 - CRT (VGA)
743                                                           ;  10 - LVDS
744                                                           ;  11 - VBIOS auto detect connector type
745   AuxIndex                      UINT8  ?                  ; < Indicates which AUX or DDC Line is used
746                                                           ;  0 - AUX1
747                                                           ;  1 - AUX2
748                                                           ;  2 - AUX3
749                                                           ;  3 - AUX4
750                                                           ;  4 - AUX5
751                                                           ;  5 - AUX6
752                                                           ;
753   HdpIndex                      UINT8  ?                  ; < Indicates which HDP pin is used
754                                                           ;  0 - HDP1
755                                                           ;  1 - HDP2
756                                                           ;  2 - HDP3
757                                                           ;  3 - HDP4
758                                                           ;  4 - HDP5
759                                                           ;  5 - HDP6
760   Mapping                       CONN_CHANNEL_MAPPING (2) DUP ({})  ;< Set specific mapping of lanes to connector pins
761                                                                    ;Mapping[0] define mapping for group of 4 lanes starting at PCIe_ENGINE_DATA.StartLane
762                                                                    ;Mapping[1] define mapping for group of 4 lanes ending at PCIe_ENGINE_DATA.EndLane (only
763                                                                    ;applicable for Dual DDI link)
764                                                                    ;if Mapping[x] set to 0 than default mapping assumed
765   LanePnInversionMask           UINT8  ?                  ; < Specifies whether to invert the state of P and N for each lane. Each bit represents a PCIe lane on the DDI port
766                                                           ;  0 - Do not invert (default)
767                                                           ;  1 - Invert P and N on this lane
768 PCIe_DDI_DATA                   ENDS
769
770
771 ; Engine Configuration
772 PCIe_ENGINE_DATA                STRUCT
773   EngineType                    UINT8   ?                 ; < Engine type
774                                                           ;  0 -  Ignore engine configuration
775                                                           ;  1 -  PCIe port
776                                                           ;  2 -  DDI
777   StartLane                     UINT16  ?                 ; < Start lane number (in reversed configuration StartLane > EndLane).
778   EndLane                       UINT16  ?                 ; < End lane number (in reversed configuration StartLane > EndLane).
779 PCIe_ENGINE_DATA                ENDS
780
781 ; PCIe port descriptor
782 PCIe_PORT_DESCRIPTOR            STRUCT
783   Flags                         UINT32  ?                 ; < Descriptor flags
784                                                           ;  Bit31 - last descriptor in complex
785   EngineData                    PCIe_ENGINE_DATA {}       ; < Engine data
786   Port                          PCIe_PORT_DATA {}         ; < PCIe port specific configuration info
787 PCIe_PORT_DESCRIPTOR            ENDS
788
789 ; DDI descriptor
790 PCIe_DDI_DESCRIPTOR             STRUCT
791   Flags                         UINT32  ?                 ; < Descriptor flags
792   EngineData                    PCIe_ENGINE_DATA {}       ; < Engine data
793   Ddi                           PCIe_DDI_DATA {}          ; < DDI port specific configuration info
794 PCIe_DDI_DESCRIPTOR             ENDS
795
796 ; Slot Reset Info
797 PCIe_SLOT_RESET_INFO            STRUCT
798   StdHeader                     AMD_CONFIG_PARAMS {}      ; < AGESA Standard Header
799   ResetId                       UINT8  ?                  ; < Slot reset ID as specified in PCIe_PORT_DESCRIPTOR
800   ResetControl                  UINT8  ?                  ; < Reset control as defined by PCIE_RESET_CONTROL
801 PCIe_SLOT_RESET_INFO            ENDS
802
803
804 ; PCIe Complex descriptor
805 PCIe_COMPLEX_DESCRIPTOR         STRUCT
806   Flags                         UINT32  ?                 ; < Descriptor flags
807                                                           ; Bit31 - last descriptor in topology
808                                                           ;
809                                                           ;
810   SocketId                      UINT32  ?                 ; < Socket Id
811   PciePortList                  POINTER ?                 ;< Pointer to array of PCIe port descriptors or NULL (Last element of array must be terminated with DESCRIPTOR_TERMINATE_LIST).
812   DdiLinkList                   POINTER ?                 ;< Pointer to array DDI link descriptors (Last element of array must be terminated with DESCRIPTOR_TERMINATE_LIST).
813   Reserved                      POINTER ?         ;< Reserved for future use
814 PCIe_COMPLEX_DESCRIPTOR         ENDS
815
816   AssertSlotReset               EQU  0
817   DeassertSlotReset             EQU  1
818 PCIE_RESET_CONTROL TEXTEQU  <DWORD>
819
820   PcieUnusedEngine              EQU  0
821   PciePortEngine                EQU  1
822   PcieDdiEngine                 EQU  2
823   MaxPcieEngine                 EQU  3                    ; < Not a valid value, used for verifying input
824 PCIE_ENGINE_TYPE   TEXTEQU  <DWORD>
825
826   PcieGenMaxSupported           EQU  0
827   PcieGen1                      EQU  1
828   PcieGen2                      EQU  2
829   MaxPcieGen                    EQU  3                    ; < Not a valid value, used for verifying input
830 PCIE_LINK_SPEED_CAP      TEXTEQU  <DWORD>
831
832   PsppDisabled                  EQU  0
833   PsppPerformance               EQU  1
834   PsppBalanceHigh               EQU  2
835   PsppBalanceLow                EQU  3
836   PsppPowerSaving               EQU  4
837   MaxPspp                       EQU  5                     ; < Not a valid value, used for verifying input
838 PCIE_PSPP_POLICY      TEXTEQU  <DWORD>
839
840   ConnectorTypeDP               EQU  0
841   ConnectorTypeEDP              EQU  1
842   ConnectorTypeSingleLinkDVI    EQU  2
843   ConnectorTypeDualLinkDVI      EQU  3
844   ConnectorTypeHDMI             EQU  4
845   ConnectorTypeTravisDpToVga    EQU  5
846   ConnectorTypeTravisDpToLvds   EQU  6
847   ConnectorTypeNutmegDpToVga    EQU  7
848   ConnectorTypeSingleLinkDviI   EQU  8
849   ConnectorTypeCrt              EQU  9
850   ConnectorTypeLvds             EQU  10
851   ConnectorTypeAutoDetect       EQU  11
852   MaxConnectorType              EQU  12                    ; < Not a valid value, used for verifying input
853 PCIE_CONNECTOR_TYPE      TEXTEQU  <DWORD>
854
855   ChannelTypeLowLoss            EQU  0
856   ChannelTypeHighLoss           EQU  1
857   ChannelTypeMob0db             EQU  2
858   ChannelTypeMob3db             EQU  3
859   ChannelTypeExt6db             EQU  4
860   ChannelTypeExt8db             EQU  5
861   MaxChannelType                EQU  6                    ; < Not a valid value, used for verifying input
862 PCIE_CHANNEL_TYPE  TEXTEQU  <DWORD>
863
864   AspmDisabled                  EQU  0
865   AspmL0s                       EQU  1
866   AspmL1                        EQU  2
867   AspmL0sL1                     EQU  3
868   MaxAspm                       EQU  4                    ; < Not a valid value, used for verifying input
869 PCIE_ASPM_TYPE  TEXTEQU  <DWORD>
870
871   HotplugDisabled               EQU  0
872   HotplugBasic                  EQU  1
873   HotplugServer                 EQU  2
874   HotplugEnhanced               EQU  3
875   HotplugInboard                EQU  4
876   MaxHotplug                    EQU  5                    ; < Not a valid value, used for verifying input
877 PCIE_HOTPLUG_TYPE TEXTEQU  <DWORD>
878
879   PortDisabled                  EQU  0
880   PortEnabled                   EQU  1
881 PCIE_PORT_ENABLE  TEXTEQU  <DWORD>
882
883   Aux1                          EQU  0
884   Aux2                          EQU  1
885   Aux3                          EQU  2
886   Aux4                          EQU  3
887   Aux5                          EQU  4
888   Aux6                          EQU  5
889   MaxAux                        EQU  6                    ; < Not a valid value, used for verifying input
890 PCIE_AUX_TYPE TEXTEQU  <DWORD>
891
892   Hdp1                          EQU  0
893   Hdp2                          EQU  1
894   Hdp3                          EQU  2
895   Hdp4                          EQU  3
896   Hdp5                          EQU  4
897   Hdp6                          EQU  5
898   MaxHdp                        EQU  6                   ; < Not a valid value, used for verifying input
899 PCIE_HDP_TYPE TEXTEQU  <DWORD>
900
901
902 ;IOMMU requestor ID
903 IOMMU_REQUESTOR_ID STRUCT
904    Bus              UINT16               ?               ; <[15:8] - Bus number, [7:3] - Device number, [2:0] - Function number
905 IOMMU_REQUESTOR_ID ENDS
906
907 ;IVMD exclusion range descriptor
908 IOMMU_EXCLUSION_RANGE_DESCRIPTOR STRUCT
909   Flags                  UINT32               ?           ; Descriptor flags
910                                                           ;  @li @b Flags[31] - Terminate descriptor array.
911                                                           ;  @li @b Flags[30] - Ignore descriptor.
912   RequestorIdStart       IOMMU_REQUESTOR_ID   {}          ; Requestor ID start
913   RequestorIdEnd         IOMMU_REQUESTOR_ID   {}          ; Requestor ID end (use same as start for single ID)
914   RangeBaseAddress       UINT64               ?           ; Phisical base address of exclusion range
915   RangeLength            UINT64               ?           ; Length of exclusion range in bytes
916 IOMMU_EXCLUSION_RANGE_DESCRIPTOR ENDS
917
918 ;----------------------------------------------------------------------------
919 ;   GNB configuration info
920 ;----------------------------------------------------------------------------
921 ;
922
923 ; LVDS Misc Control Field
924 LVDS_MISC_CONTROL_FIELD         STRUCT
925   FpdiMode          UINT8       ?
926     ;IN  UINT8     FpdiMode:1;
927     ;IN  UINT8     DlChSwap:1;
928     ;IN  UINT8     VsyncActiveLow:1;
929     ;IN  UINT8     HsyncActiveLow:1;
930     ;IN  UINT8     BLONActiveLow:1;
931     ;IN  UINT8     Reserved:3;
932 LVDS_MISC_CONTROL_FIELD         ENDS
933
934 ; LVDS Misc Control
935 LVDS_MISC_CONTROL           UNION
936   Field        LVDS_MISC_CONTROL_FIELD   {}
937   Value        UINT8  ?
938 LVDS_MISC_CONTROL           ENDS
939
940 ; Configuration settings for GNB.
941 GNB_ENV_CONFIGURATION          STRUCT
942   Gnb3dStereoPinIndex          UINT8  ?       ;< 3D Stereo Pin ID.
943                                               ;  @li 0 = Stereo 3D is disabled (default).
944                                               ;  @li 1 = Use processor pin HPD1.
945                                               ;  @li 2 = Use processor pin HPD2
946                                               ;  @li 3 = Use processor pin HPD3
947                                               ;  @li 4 = Use processor pin HPD4
948                                               ;  @li 5 = Use processor pin HPD5
949                                               ;  @li 6 = Use processor pin HPD6
950   IommuSupport                 BOOLEAN ?      ; IOMMU support.
951                                               ; TRUE  = Disable and hide IOMMU device.
952                                               ; FLASE = Initialize IOMMU subsystem. Generate ACPI IVRS table.
953   LvdsSpreadSpectrum           UINT16  ?      ; Spread spectrum value in 0.01 %
954   LvdsSpreadSpectrumRate       UINT16  ?      ; Spread spectrum frequency used by SS hardware logic in unit of 10Hz, 0 - default frequency 40kHz
955   LvdsPowerOnSeqDigonToDe      UINT8   ?      ; This item configures panel initialization timing.
956   LvdsPowerOnSeqDeToVaryBl     UINT8   ?      ; This item configures panel initialization timing.
957   LvdsPowerOnSeqDeToDigon      UINT8   ?      ; This item configures panel initialization timing.
958   LvdsPowerOnSeqVaryBlToDe     UINT8   ?      ; This item configures panel initialization timing.
959   LvdsPowerOnSeqOnToOffDelay   UINT8   ?      ; This item configures panel initialization timing.
960   LvdsPowerOnSeqVaryBlToBlon   UINT8   ?      ; This item configures panel initialization timing.
961   LvdsPowerOnSeqBlonToVaryBl   UINT8   ?      ; This item configures panel initialization timing.
962   LvdsMaxPixelClockFreq        UINT16  ?      ; This item configures the maximum pixel clock frequency supported.
963   LcdBitDepthControlValue      UINT32  ?      ; This item configures the LCD bit depth control settings.
964   Lvds24bbpPanelMode           UINT8   ?      ; This item configures the LVDS 24 BBP mode.
965   LvdsMiscControl              LVDS_MISC_CONTROL   {}      ; This item configures LVDS swap/Hsync/Vsync/BLON
966   PcieRefClkSpreadSpectrum     UINT16  ?      ; Spread spectrum value in 0.01 %
967   GnbRemoteDisplaySupport      BOOLEAN ?      ; This item enables Wireless Display Support
968 GNB_ENV_CONFIGURATION          ENDS
969
970 ; GNB configuration info
971 GNB_CONFIGURATION              STRUCT
972   PcieComplexList              POINTER ?      ; Pointer to array of PCIe_COMPLEX_DESCRIPTOR structures describe PCIe topology on each processor package or NULL.
973                                               ;  Last element of array must be terminated with DESCRIPTOR_TERMINATE_LIST
974                                               ;
975                                               ;
976                                               ;
977                                               ;  Topology organization definition assume PCIe_COMPLEX_DESCRIPTOR defined first following
978                                               ;  PCIe_PORT_DESCRIPTOR and  PCIe_DDI_DESCRIPTOR for given PCIe_COMPLEX_DESCRIPTOR
979                                               ;  defined in arbitrary sequence:
980                                               ;  Example of topology definition for single socket system:
981                                               ;    PlatfromTopology LABEL DWORD
982                                               ;
983                                               ;    Port0_2  PCIe_PORT_DESCRIPTOR <>;
984                                               ;    Port0_3  PCIe_PORT_DESCRIPTOR <DESCRIPTOR_TERMINATE_LIST> ;
985                                               ;    ...
986                                               ;    Ddi0_A   PCIe_DDI_DESCRIPTOR <>;
987                                               ;    Ddi0_B   PCIe_DDI_DESCRIPTOR <DESCRIPTOR_TERMINATE_LIST,>;
988                                               ;    ...
989                                               ;    Cpu0     PCIe_COMPLEX_DESCRIPTOR <DESCRIPTOR_TERMINATE_LIST, 0, Port0_2, Ddi0_A>
990                                               ;
991                                               ;
992   PsppPolicy                   UINT8  ?       ;< PSPP (PCIe Speed Power Policy)
993                                               ;  @li @b 0 - Disabled
994                                               ;  @li @b 1 - Performance
995                                               ;  @li @b 2 - Balance-High
996                                               ;  @li @b 3 - Balance-Low
997                                               ;  @li @b 4 - Power Saving
998                                               ;
999 GNB_CONFIGURATION              ENDS
1000
1001
1002 ; ---------------------------------------------------------------------------
1003
1004 ; MEMORY-SPECIFIC DATA STRUCTURES
1005
1006 ; ---------------------------------------------------------------------------
1007
1008
1009  ; AGESA MAXIMIUM VALUES
1010
1011    ; These Max values are used to define array sizes and associated loop
1012    ; counts in the code.  They reflect the maximum values that AGESA
1013    ; currently supports and does not necessarily reflect the hardware
1014    ; capabilities of configuration.
1015
1016
1017     MAX_SOCKETS_SUPPORTED       EQU    8       ; < Max number of sockets in system
1018     MAX_CHANNELS_PER_SOCKET     EQU    4       ; < Max Channels per sockets
1019     MAX_DIMMS_PER_CHANNEL       EQU    4       ; < Max DIMMs on a memory channel (independent of platform)
1020     NUMBER_OF_DELAY_TABLES      EQU    9       ; < Number of tables defined in CH_DEF_STRUCT.
1021                                                ; < Eg: UINT16  *RcvEnDlys;
1022                                                ; <     UINT8   *WrDqsDlys;
1023                                                ; <     UINT8   *RdDqsDlys;
1024                                                ; <     UINT8   *WrDatDlys;
1025                                                ; <     UINT8   *RdDqsMinDlys;
1026                                                ; <     UINT8   *RdDqsMaxDlys;
1027                                                ; <     UINT8   *WrDatMinDlys;
1028                                                ; <     UINT8   *WrDatMaxDlys;
1029     NUMBER_OF_FAILURE_MASK_TABLES EQU 1        ; < Number of failure mask tables
1030     MAX_PLATFORM_TYPES          EQU    16       ; < Platform types per system
1031
1032     MCT_TRNG_KEEPOUT_START      EQU    00004000h        ; < base [39:8]
1033     MCT_TRNG_KEEPOUT_END        EQU    00007FFFh        ; < base [39:8]
1034
1035     UMA_ATTRIBUTE_INTERLEAVE    EQU    80000000h    ; < Uma Region is interleaved
1036     UMA_ATTRIBUTE_ON_DCT0       EQU    40000000h    ; < UMA resides on memory that belongs to DCT0
1037     UMA_ATTRIBUTE_ON_DCT1       EQU    20000000h    ; < UMA resides on memory that belongs to DCT1
1038
1039     PSO_TABLE           TEXTEQU    <UINT8>; < Platform Configuration Table
1040
1041         ; AGESA DEFINITIONS
1042
1043         ; Many of these are derived from the platform and hardware specific definitions
1044
1045  ; EccSymbolSize override value
1046     ECCSYMBOLSIZE_USE_BKDG      EQU    0       ; < Use BKDG Recommended Value
1047     ECCSYMBOLSIZE_FORCE_X4      EQU    4       ; < Force to x4
1048     ECCSYMBOLSIZE_FORCE_X8      EQU    8       ; < Force to x8
1049  ; CPU Package Type
1050     PT_L1                       EQU    0                     ; < L1 Package type
1051     PT_M2                       EQU    1                     ; < AM Package type
1052     PT_S1                       EQU    2                     ; < S1 Package type
1053
1054  ; Structures use to pass system Logical CPU-ID
1055 CPU_LOGICAL_ID    STRUCT
1056   Family                        UINT64 ?        ; < Indicates logical ID Family
1057   Revision                      UINT64 ?        ; < Indicates logical ID Family
1058 CPU_LOGICAL_ID    ENDS
1059
1060  ; Build Configuration values for BLDCFG_AMD_PLATFORM_TYPE
1061
1062   AMD_PLATFORM_SERVER   EQU    8000h    ; < Server
1063   AMD_PLATFORM_DESKTOP  EQU    10000h   ; < Desktop
1064   AMD_PLATFORM_MOBILE   EQU    20000h   ; < Mobile
1065 AMD_PLATFORM_TYPE  TEXTEQU  <DWORD>
1066
1067  ; Dram technology type
1068
1069   DDR2_TECHNOLOGY       EQU    0        ; < DDR2 technology
1070   DDR3_TECHNOLOGY       EQU    1        ; < DDR3 technology
1071 TECHNOLOGY_TYPE  TEXTEQU  <DWORD>
1072
1073  ; Build Configuration values for BLDCFG_MEMORY_BUS_FREQUENCY_LIMIT & BLDCFG_MEMORY_CLOCK_SELECT
1074
1075   DDR400_FREQUENCY      EQU    200      ; < DDR 400
1076   DDR533_FREQUENCY      EQU    266      ; < DDR 533
1077   DDR667_FREQUENCY      EQU    333      ; < DDR 667
1078   DDR800_FREQUENCY      EQU    400      ; < DDR 800
1079   DDR1066_FREQUENCY     EQU    533      ; < DDR 1066
1080   DDR1333_FREQUENCY     EQU    667      ; < DDR 1333
1081   DDR1600_FREQUENCY     EQU    800      ; < DDR 1600
1082   DDR1866_FREQUENCY     EQU    933      ; < DDR 1866
1083   DDR2100_FREQUENCY     EQU    1050     ; < DDR 2100
1084   DDR2133_FREQUENCY     EQU    1066     ; < DDR 2133
1085   DDR2400_FREQUENCY     EQU    1200     ; < DDR 2400
1086   UNSUPPORTED_DDR_FREQUENCY     EQU    1201      ; < Highest limit of DDR frequency
1087 MEMORY_BUS_SPEED  TEXTEQU  <DWORD>
1088
1089  ; Build Configuration values for BLDCFG_MEMORY_QUADRANK_TYPE
1090
1091   QUADRANK_REGISTERED   EQU    0
1092   QUADRANK_UNBUFFERED   EQU    1
1093 QUANDRANK_TYPE  TEXTEQU  <DWORD>
1094
1095  ; Build Configuration values for BLDCFG_TIMING_MODE_SELECT
1096
1097   TIMING_MODE_AUTO      EQU    0        ; < Use best rate possible
1098   TIMING_MODE_LIMITED   EQU    1        ; < Set user top limit
1099   TIMING_MODE_SPECIFIC  EQU    2        ; < Set user specified speed
1100 USER_MEMORY_TIMING_MODE  TEXTEQU  <DWORD>
1101
1102  ; Build Configuration values for BLDCFG_POWER_DOWN_MODE
1103
1104   POWER_DOWN_BY_CHANNEL     EQU 0
1105   POWER_DOWN_BY_CHIP_SELECT EQU 1
1106   POWER_DOWN_AUTO           EQU 2
1107 POWER_DOWN_MODE  TEXTEQU  <DWORD>
1108
1109  ; Low voltage support
1110
1111   VOLT_INITIAL EQU 0             ; < Initial value for VDDIO
1112   VOLT1_5 EQU 1                  ; < 1.5 Volt
1113   VOLT1_35 EQU 2                 ; < 1.35 Volt
1114   VOLT1_25 EQU 3                 ; < 1.25 Volt
1115   VOLT_UNSUPPORTED EQU 0FFh      ; < No common voltage found
1116 DIMM_VOLTAGE   TEXTEQU  <DWORD>
1117
1118  ; UMA Mode
1119
1120   UMA_NONE       EQU    0        ; < UMA None
1121   UMA_SPECIFIED  EQU    1        ; < UMA Specified
1122   UMA_AUTO       EQU    2        ; < UMA Auto
1123 UMA_MODE  TEXTEQU  <DWORD>
1124
1125  ; Force Training Mode
1126
1127   FORCE_TRAIN_1D       EQU    0        ; < 1D Training only
1128   FORCE_TRAIN___       EQU    1        ; <
1129   FORCE_TRAIN_AUTO       EQU    2        ; < Auto
1130 FORCE_TRAIN_MODE  TEXTEQU  <DWORD>
1131
1132 ;  The possible DRAM prefetch mode settings.
1133   DRAM_PREFETCHER_AUTO             EQU  0           ; Use the recommended setting for the processor. In most cases, the recommended setting is enabled.
1134   DISABLE_DRAM_PREFETCH_FOR_IO     EQU  1           ; Disable DRAM prefetching for I/O requests only.
1135   DISABLE_DRAM_PREFETCH_FOR_CPU    EQU  2           ; Disable DRAM prefetching for requests from processor cores only.
1136   DISABLE_DRAM_PREFETCHER          EQU  3           ; Disable DRAM prefetching.
1137   MAX_DRAM_FREFETCH_MODE           EQU  4           ; Not a DRAM prefetch mode, use for limit checking.
1138 DRAM_PREFETCH_MODE     TEXTEQU  <DWORD>
1139
1140  ; Build Configuration values for BLDCFG_UMA_ALIGNMENT
1141
1142   NO_UMA_ALIGNED    EQU    00FFFFFFh
1143   UMA_4MB_ALIGNED   EQU    00FFFFC0h
1144   UMA_128MB_ALIGNED EQU    00FFF800h
1145   UMA_256MB_ALIGNED EQU    00FFF000h
1146   UMA_512MB_ALIGNED EQU    00FFE000h
1147 UMA_ALIGNMENT  TEXTEQU  <DWORD>
1148  ; ===============================================================================
1149    ; Global MCT Configuration Status Word (GStatus)
1150  ; ===============================================================================
1151
1152   GsbMTRRshort          EQU    0        ; < Ran out of MTRRs while mapping memory
1153   GsbAllECCDimms        EQU    1        ; < All banks of all Nodes are ECC capable
1154   GsbDramECCDis         EQU    2        ; < Dram ECC requested but not enabled.
1155   GsbSoftHole           EQU    3        ; < A Node Base gap was created
1156   GsbHWHole             EQU    4        ; < A HW dram remap was created
1157   GsbNodeIntlv          EQU    5        ; < Node Memory interleaving was enabled
1158   GsbSpIntRemapHole     EQU    6        ; < Special condition for Node Interleave and HW remapping
1159   GsbEnDIMMSpareNW      EQU    7        ; < Indicates that DIMM Spare can be used without a warm reset
1160
1161   GsbEOL                EQU    8        ; < End of list
1162 GLOBAL_STATUS_FIELD  TEXTEQU  <DWORD>
1163
1164 ; ===============================================================================
1165    ; Local Error Status (DIE_STRUCT.ErrStatus[31:0])
1166 ; ===============================================================================
1167
1168   EsbNoDimms            EQU    0        ; < No DIMMs
1169   EsbSpdChkSum          EQU    1        ; < SPD Checksum fail
1170   EsbDimmMismatchM      EQU    2        ; < dimm module type(buffer) mismatch
1171   EsbDimmMismatchT      EQU    3        ; < dimm CL/T mismatch
1172   EsbDimmMismatchO      EQU    4        ; < dimm organization mismatch (128-bit)
1173   EsbNoTrcTrfc          EQU    5        ; < SPD missing Trc or Trfc info
1174   EsbNoCycTime          EQU    6        ; < SPD missing byte 23 or 25
1175   EsbBkIntDis           EQU    7        ; < Bank interleave requested but not enabled
1176   EsbDramECCDis         EQU    8        ; < Dram ECC requested but not enabled
1177   EsbSpareDis           EQU    9        ; < Online spare requested but not enabled
1178   EsbMinimumMode        EQU    10       ; < Running in Minimum Mode
1179   EsbNoRcvrEn           EQU    11       ; < No DQS Receiver Enable pass window found
1180   EsbSmallRcvr          EQU    12       ; < DQS Rcvr En pass window too small (far right of dynamic range)
1181   EsbNoDqsPos           EQU    13       ; < No DQS-DQ passing positions
1182   EsbSmallDqs           EQU    14       ; < DQS-DQ passing window too small
1183   EsbDCBKScrubDis       EQU    15       ; < DCache scrub requested but not enabled
1184
1185   EsbEMPNotSupported    EQU    16       ; < Processor is not capable for EMP.
1186   EsbEMPConflict        EQU    17       ; < EMP requested but cannot be enabled since
1187                                ; < channel interleaving, bank interleaving, or bank swizzle is enabled.
1188   EsbEMPDis             EQU    18       ; < EMP requested but cannot be enabled since
1189                                ; < memory size of each DCT is not a power of two.
1190
1191   EsbEOL                EQU    19       ; < End of list
1192 ERROR_STATUS_FIELD  TEXTEQU  <DWORD>
1193
1194 ; ===============================================================================
1195   ; Local Configuration Status (DIE_STRUCT.Status[31:0])
1196 ; ===============================================================================
1197
1198   SbRegistered          EQU    0        ; < All DIMMs are Registered
1199   SbEccDimms            EQU    1        ; < All banks ECC capable
1200   SbParDimms            EQU    2        ; < All banks Addr/CMD Parity capable
1201   SbDiagClks            EQU    3        ; < Jedec ALL slots clock enable diag mode
1202   Sb128bitmode          EQU    4        ; < DCT in 128-bit mode operation
1203   Sb64MuxedMode         EQU    5        ; < DCT in 64-bit mux'ed mode.
1204   Sb2TMode              EQU    6        ; < 2T CMD timing mode is enabled.
1205   SbSWNodeHole          EQU    7        ; < Remapping of Node Base on this Node to create a gap.
1206   SbHWHole              EQU    8        ; < Memory Hole created on this Node using HW remapping.
1207   SbOver400Mhz          EQU    9        ; < DCT freq greater than or equal to 400MHz flag
1208   SbDQSPosPass2         EQU    10       ; < Used for TrainDQSPos DIMM0/1, when freq greater than or equal to 400MHz
1209   SbDQSRcvLimit         EQU    11       ; < Used for DQSRcvEnTrain to know we have reached the upper bound.
1210   SbExtConfig           EQU    12       ; < Indicate the default setting for extended PCI configuration support
1211   SbLrdimms             EQU    13       ; < All DIMMs are LRDIMMs
1212   SbEOL                 EQU    14       ; < End of list
1213 LOCAL_STATUS_FIELD  TEXTEQU  <DWORD>
1214
1215
1216 ; < CPU MSR Register definitions ------------------------------------------
1217     SYS_CFG                     EQU    0C0010010h
1218     TOP_MEM                     EQU    0C001001Ah
1219     TOP_MEM2                    EQU    0C001001Dh
1220     HWCR                        EQU    0C0010015h
1221     NB_CFG                      EQU    0C001001Fh
1222
1223     FS_BASE                     EQU    0C0000100h
1224     IORR0_BASE                  EQU    0C0010016h
1225     IORR0_MASK                  EQU    0C0010017h
1226     BU_CFG                      EQU    0C0011023h
1227     BU_CFG2                     EQU    0C001102Ah
1228     COFVID_STAT                 EQU    0C0010071h
1229     TSC                         EQU    10h
1230
1231 ; ===============================================================================
1232  ; SPD Data for each DIMM
1233 ; ===============================================================================
1234 SPD_DEF_STRUCT    STRUCT
1235   DimmPresent                   BOOLEAN ?       ; < Indicates that the DIMM is present and Data is valid
1236   Data                          UINT8 (256) DUP (?)     ; < Buffer for 256 Bytes of SPD data from DIMM
1237 SPD_DEF_STRUCT    ENDS
1238
1239 ; ===============================================================================
1240  ; Channel Definition Structure
1241  ; This data structure defines entries that are specific to the channel initialization
1242 ; ===============================================================================
1243 CH_DEF_STRUCT    STRUCT
1244   ChannelID                     UINT8 ?         ; < Physical channel ID of a socket(0 = CH A, 1 = CH B, 2 = CH C, 3 = CH D)
1245   TechType                      TECHNOLOGY_TYPE ?       ; < Technology type of this channel
1246   ChDimmPresent                 UINT8 ?         ; < For each bit n 0..7, 1 = DIMM n is present.
1247                                  ; <  DIMM#  Select Signal
1248                                  ; <  0      MA0_CS_L[0, 1]
1249                                  ; <  1      MB0_CS_L[0, 1]
1250                                  ; <  2      MA1_CS_L[0, 1]
1251                                  ; <  3      MB1_CS_L[0, 1]
1252                                  ; <  4      MA2_CS_L[0, 1]
1253                                  ; <  5      MB2_CS_L[0, 1]
1254                                  ; <  6      MA3_CS_L[0, 1]
1255                                  ; <  7      MB3_CS_L[0, 1]
1256
1257   DCTPtr                        POINTER ?       ; < Pointer to the DCT data of this channel.
1258   MCTPtr                        POINTER ?       ; < Pointer to the node data of this channel.
1259   SpdPtr                        POINTER ?       ; < Pointer to the SPD data for this channel. (Setup by NB Constructor)
1260   DimmSpdPtr                    POINTER (MAX_DIMMS_PER_CHANNEL) DUP (?)         ; < Array of pointers to
1261                                  ; <   SPD Data for each Dimm. (Setup by Tech Block Constructor)
1262   ChDimmValid                   UINT8 ?         ; < For each bit n 0..3, 1 = DIMM n is valid and is/will be configured where 4..7 are reserved.
1263   RegDimmPresent                UINT8 ?         ; < For each bit n 0..3, 1 = DIMM n is a registered DIMM where 4..7 are reserved.
1264   LrDimmPresent                 UINT8 ?         ; < For each bit n 0..3, 1 = DIMM n is Load Reduced DIMM where 4..7 are reserved.
1265   SODimmPresent                 UINT8 ?         ; < For each bit n 0..3, 1 = DIMM n is a SO-DIMM where 4..7 are reserved.
1266   Loads                         UINT8 ?         ; < Number of devices loading bus
1267   Dimms                         UINT8 ?         ; < Number of DIMMs loading Channel
1268   Ranks                         UINT8 ?         ; < Number of ranks loading Channel DATA
1269   SlowMode                      BOOLEAN ?       ; < 1T or 2T CMD mode (slow access mode)
1270                                  ; < FALSE = 1T
1271                                  ; < TRUE = 2T
1272   ; < The following pointers will be pointed to dynamically allocated buffers.
1273   ; < Each buffer is two dimensional (RowCount x ColumnCount) and is lay-outed as in below.
1274   ; < Example: If DIMM and Byte based training, then
1275   ; < XX is a value in Hex
1276   ; <                        BYTE 0, BYTE 1, BYTE 2, BYTE 3, BYTE 4, BYTE 5, BYTE 6, BYTE 7, ECC BYTE
1277   ; <  Row1 -  Logical DIMM0    XX      XX      XX      XX      XX      XX      XX      XX      XX
1278   ; <  Row2 -  Logical DIMM1    XX      XX      XX      XX      XX      XX      XX      XX      XX
1279   RcvEnDlys                     POINTER ?       ; < DQS Receiver Enable Delays
1280   WrDqsDlys                     POINTER ?       ; < Write DQS delays (only valid for DDR3)
1281   RdDqsDlys                     POINTER ?       ; < Read Dqs delays
1282   WrDatDlys                     POINTER ?       ; < Write Data delays
1283   RdDqs__Dlys                   POINTER ?       ; < Read DQS data
1284   RdDqsMinDlys                  POINTER ?       ; < Minimum Window for Read DQS
1285   RdDqsMaxDlys                  POINTER ?       ; < Maximum Window for Read DQS
1286   WrDatMinDlys                  POINTER ?       ; < Minimum Window for Write data
1287   WrDatMaxDlys                  POINTER ?       ; < Maximum Window for Write data
1288   RcvEnDlysMemPs1               POINTER ?       ; < DQS Receiver Enable Delays for Memory Pstate 1
1289   WrDqsDlysMemPs1               POINTER ?       ; < Write DQS delays for Memory Pstate 1 (only valid for DDR3)
1290   RdDqsDlysMemPs1               POINTER ?       ; < Read Dqs delays for Memory Pstate 1
1291   WrDatDlysMemPs1               POINTER ?       ; < Write Data delays for Memory Pstate 1
1292   RdDqs__DlysMemPs1             POINTER ?       ; < Read DQS data for Memory Pstate 1
1293   RdDqsMinDlysMemPs1            POINTER ?       ; < Minimum Window for Read DQS for Memory Pstate 1
1294   RdDqsMaxDlysMemPs1            POINTER ?       ; < Maximum Window for Read DQS for Memory Pstate 1
1295   WrDatMinDlysMemPs1            POINTER ?       ; < Minimum Window for Write data for Memory Pstate 1
1296   WrDatMaxDlysMemPs1            POINTER ?       ; < Maximum Window for Write data for Memory Pstate 1
1297   RowCount                      UINT8 ?         ; < Number of rows of the allocated buffer.
1298   ColumnCount                   UINT8 ?         ; < Number of columns of the allocated buffer.
1299
1300   FailingBitMask                POINTER ?       ; < Table of masks to Track Failing bits
1301   FailingBitMaskMemPs1          POINTER ?       ; < Table of masks to Track Failing bits for Memory Pstate 1
1302   DctOdcCtl                     UINT32 ?        ; < Output Driver Strength (see BKDG FN2:Offset 9Ch, index 00h)
1303   DctAddrTmg                    UINT32 ?        ; < Address Bus Timing (see BKDG FN2:Offset 9Ch, index 04h)
1304   PhyRODTCSLow                  UINT32 ?        ; < Phy Read ODT Pattern Chip Select low (see BKDG FN2:Offset 9Ch, index 180h)
1305   PhyRODTCSHigh                 UINT32 ?        ; < Phy Read ODT Pattern Chip Select high (see BKDG FN2:Offset 9Ch, index 181h)
1306   PhyWODTCSLow                  UINT32 ?        ; < Phy Write ODT Pattern Chip Select low (see BKDG FN2:Offset 9Ch, index 182h)
1307   PhyWODTCSHigh                 UINT32 ?        ; < Phy Write ODT Pattern Chip Select high (see BKDG FN2:Offset 9Ch, index 183)
1308   PhyWLODT                      UINT8 (4) DUP (?)       ; < Write Levelization ODT Pattern for Dimm 0-3 (see BKDG FN2:Offset 9Ch, index 0x8[11:8])
1309   DctEccDqsLike                 UINT16 ?        ; < DCT DQS ECC UINT8 like...
1310   DctEccDqsScale                UINT8 ?         ; < DCT DQS ECC UINT8 scale
1311   PtrPatternBufA                UINT16 ?        ; < Ptr on stack to aligned DQS testing pattern
1312   PtrPatternBufB                UINT16 ?        ; < Ptr on stack to aligned DQS testing pattern
1313   ByteLane                      UINT8 ?         ; < Current UINT8 Lane (0..7)
1314   Direction                     UINT8 ?         ; < Current DQS-DQ training write direction (0=read, 1=write)
1315   Pattern                       UINT8 ?         ; < Current pattern
1316   DqsDelay                      UINT8 ?         ; < Current DQS delay value
1317   HostBiosSrvc1                 UINT16 ?        ; < UINT16 sized general purpose field for use by host BIOS.  Scratch space.
1318   HostBiosSrvc2                 UINT32 ?        ; < UINT32 sized general purpose field for use by host BIOS.  Scratch space.
1319   DctMaxRdLat                   UINT16 (4) DUP (?)      ; < Max Read Latency (ns) for the DCT
1320                                                 ; < DctMaxRdLat [i] is for NBPstate i  DIMMValidCh                   UINT8 ?         ; < DIMM# in CH
1321   DIMMValidCh                   UINT8 ?         ; < DIMM# in CH
1322   MaxCh                         UINT8 ?         ; < Max number of CH in system
1323   Dct                           UINT8 ?         ; < Dct pointer
1324   WrDatGrossH                   UINT8 ?         ; < Write Data Gross delay high value
1325   DqsRcvEnGrossL                UINT8 ?         ; < DQS Receive Enable Gross Delay low
1326
1327   TrwtWB                        UINT8 ?         ; <  Non-SPD timing value for TrwtWB
1328   CurrRcvrDctADelay             UINT8 ?         ; < for keep current RcvrEnDly
1329   T1000                         UINT16 ?        ; < get the T1000 figure (cycle time (ns) * 1K)
1330   DqsRcvEnPass                  UINT8 ?         ; < for TrainRcvrEn UINT8 lane pass flag
1331   DqsRcvEnSaved                 UINT8 ?         ; < for TrainRcvrEn UINT8 lane saved flag
1332   SeedPass1Remainder            UINT8 ?         ; < for Phy assisted DQS receiver enable training
1333
1334   ClToNbFlag                    UINT8 ?         ; < is used to restore ClLinesToNbDis bit after memory
1335   NodeSysBase                   UINT32 ?        ; < for channel interleave usage
1336   RefRawCard                    UINT8 (MAX_DIMMS_PER_CHANNEL) DUP (?)           ; < Array of rawcards detected
1337   CtrlWrd02                     UINT8 (MAX_DIMMS_PER_CHANNEL) DUP (?)           ; < Control Word 2 values per DIMM
1338   CtrlWrd03                     UINT8 (MAX_DIMMS_PER_CHANNEL) DUP (?)           ; < Control Word 3 values per DIMM
1339   CtrlWrd04                     UINT8 (MAX_DIMMS_PER_CHANNEL) DUP (?)           ; < Control Word 4 values per DIMM
1340   CtrlWrd05                     UINT8 (MAX_DIMMS_PER_CHANNEL) DUP (?)           ; < Control Word 5 values per DIMM
1341   CtrlWrd08                     UINT8 (MAX_DIMMS_PER_CHANNEL) DUP (?)           ; < Control Word 8 values per DIMM
1342
1343   CsPresentDCT                  UINT16 ?        ; < For each bit n 0..7, 1 = Chip-select n is present
1344   DimmMirrorPresent             UINT8 ?         ; < For each bit n 0..7, 1 = DIMM n is OnDimmMirror capable
1345   DimmSpdCse                    UINT8 ?         ; < For each bit n 0..7, 1 = DIMM n SPD checksum error
1346   DimmExclude               UINT8 ?         ; < For each bit n 0..7, 1 = DIMM n gets excluded
1347   DimmYr06                      UINT8 ?         ; < Bitmap indicating which Dimms have a manufacturer's year code <= 2006
1348   DimmWk2406                    UINT8 ?         ; < Bitmap indicating which Dimms have a manufacturer's week code <= 24 of 2006 (June)
1349   DimmPlPresent                 UINT8 ?         ; < Bitmap indicating that Planar (1) or Stacked (0) Dimms are present.
1350   DimmQrPresent                 UINT8 ?         ; < QuadRank DIMM present?
1351   DimmDrPresent                 UINT8 ?         ; < Bitmap indicating that Dual Rank Dimms are present
1352   DimmSRPresent                 UINT8 ?         ; < Bitmap indicating that Single Rank Dimms are present
1353   Dimmx4Present                 UINT8 ?         ; < For each bit n 0..3, 1 = DIMM n contains x4 data devices. where 4..7 are reserved.
1354   Dimmx8Present                 UINT8 ?         ; < For each bit n 0..3, 1 = DIMM n contains x8 data devices. where 4..7 are reserved.
1355   Dimmx16Present                UINT8 ?         ; < For each bit n 0..3, 1 = DIMM n contains x16 data devices. where 4..7 are reserved.
1356   LrdimmPhysicalRanks           UINT8 (MAX_DIMMS_PER_CHANNEL) DUP (?)         ; < Number of Physical Ranks for LRDIMMs
1357   LrDimmLogicalRanks            UINT8 (MAX_DIMMS_PER_CHANNEL) DUP (?)         ; < Number of LRDIMM Logical ranks in this configuration
1358   LrDimmRankMult                UINT8 (MAX_DIMMS_PER_CHANNEL) DUP (?)         ; < Rank Multipication factor per dimm.
1359   DimmNibbleAccess              UINT8 ?         ; < For each bit n 0..3, 1 = DIMM n will use nibble signaling. Where 4..7 are reserved.
1360   MemClkDisMap                  POINTER ?       ; <  This pointer will be set to point to an array that describes
1361                                   ; <  the routing of M[B,A]_CLK pins to the DIMMs' ranks. AGESA will
1362                                   ; <  base on this array to disable unused MemClk to save power.
1363                                   ; <
1364                                   ; <  The array must have 8 entries. Each entry, which associates with
1365                                   ; <  one MemClkDis bit, is a bitmap of 8 CS that that MemClk is routed to.
1366                                   ; <    Example:
1367                                   ; <    BKDG definition of Fn2x88[MemClkDis] bitmap for AM3 package
1368                                   ; <    is like below:
1369                                   ; <         Bit AM3/S1g3 pin name
1370                                   ; <         0   M[B,A]_CLK_H/L[0]
1371                                   ; <         1   M[B,A]_CLK_H/L[1]
1372                                   ; <         2   M[B,A]_CLK_H/L[2]
1373                                   ; <         3   M[B,A]_CLK_H/L[3]
1374                                   ; <         4   M[B,A]_CLK_H/L[4]
1375                                   ; <         5   M[B,A]_CLK_H/L[5]
1376                                   ; <         6   M[B,A]_CLK_H/L[6]
1377                                   ; <         7   M[B,A]_CLK_H/L[7]
1378                                   ; <    And platform has the following routing:
1379                                   ; <         CS0   M[B,A]_CLK_H/L[4]
1380                                   ; <         CS1   M[B,A]_CLK_H/L[2]
1381                                   ; <         CS2   M[B,A]_CLK_H/L[3]
1382                                   ; <         CS3   M[B,A]_CLK_H/L[5]
1383                                   ; <    Then MemClkDisMap should be pointed to the following array:
1384                                   ; <               CLK_2 CLK_3 CLK_4 CLK_5
1385                                   ; <    0x00, 0x00, 0x02, 0x04, 0x01, 0x08, 0x00, 0x00
1386                                   ; <  Each entry of the array is the bitmask of 8 chip selects.
1387
1388   CKETriMap                     POINTER ?       ; <  This pointer will be set to point to an array that describes
1389                                   ; <  the routing of CKE pins to the DIMMs' ranks.
1390                                   ; <  The array must have 2 entries. Each entry, which associates with
1391                                   ; <  one CKE pin, is a bitmap of 8 CS that that CKE is routed to.
1392                                   ; <  AGESA will base on this array to disable unused CKE pins to save power.
1393
1394   ODTTriMap                     POINTER ?       ; <  This pointer will be set to point to an array that describes
1395                                   ; <  the routing of ODT pins to the DIMMs' ranks.
1396                                   ; <  The array must have 4 entries. Each entry, which associates with
1397                                   ; <  one ODT pin, is a bitmap of 8 CS that that ODT is routed to.
1398                                   ; <  AGESA will base on this array to disable unused ODT pins to save power.
1399
1400   ChipSelTriMap                 POINTER ?       ; <  This pointer will be set to point to an array that describes
1401                                   ; <  the routing of chip select pins to the DIMMs' ranks.
1402                                   ; <  The array must have 8 entries. Each entry is a bitmap of 8 CS.
1403                                   ; <  AGESA will base on this array to disable unused Chip select pins to save power.
1404
1405   ExtendTmp                     BOOLEAN ?       ; <  If extended temperature is supported on all dimms on a channel.
1406
1407   MaxVref                        UINT8 ?       ; <  Maximum Vref Value for channel
1408
1409   Reserved                      UINT8 (100) DUP (?)     ; < Reserved
1410 CH_DEF_STRUCT    ENDS
1411
1412 ; ===============================================================================
1413  ; DCT Channel Timing Parameters
1414  ; This data structure sets timings that are specific to the channel
1415 ; ===============================================================================
1416 CH_TIMING_STRUCT    STRUCT
1417   DctDimmValid                  UINT16 ?        ; < For each bit n 0..3, 1=DIMM n is valid and is/will be configured where 4..7 are reserved.
1418   DimmMirrorPresent             UINT16 ?        ; < For each bit n 0..3, 1=DIMM n is OnDimmMirror capable where 4..7 are reserved.
1419   DimmSpdCse                    UINT16 ?        ; < For each bit n 0..3, 1=DIMM n SPD checksum error where 4..7 are reserved.
1420   DimmExclude               UINT16 ?        ; < For each bit n 0..3, 1 = DIMM n gets excluded because of no common voltage is found
1421   CsPresent                     UINT16 ?        ; < For each bit n 0..7, 1=Chip-select n is present
1422   CsEnabled                     UINT16 ?        ; < For each bit n 0..7, 1=Chip-select n is enabled
1423   CsTestFail                    UINT16 ?        ; < For each bit n 0..7, 1=Chip-select n is present but disabled
1424   CsTrainFail                   UINT16 ?        ; < Bitmap showing which chipselects failed training
1425   DIMM1KPage                    UINT16 ?        ; < For each bit n 0..3, 1=DIMM n contains 1K page devices. where 4..7 are reserved.
1426   DimmQrPresent                 UINT16 ?        ; < QuadRank DIMM present?
1427   DimmDrPresent                 UINT16 ?        ; < Bitmap indicating that Dual Rank Dimms are present
1428   DimmSRPresent                 UINT8 ?         ; < Bitmap indicating that Single Rank Dimms are present
1429   Dimmx4Present                 UINT16 ?        ; < For each bit n 0..3, 1=DIMM n contains x4 data devices. where 4..7 are reserved.
1430   Dimmx8Present                 UINT16 ?        ; < For each bit n 0..3, 1=DIMM n contains x8 data devices. where 4..7 are reserved.
1431   Dimmx16Present                UINT16 ?        ; < For each bit n 0..3, 1=DIMM n contains x16 data devices. where 4..7 are reserved.
1432
1433   DIMMTrcd                      UINT16 ?        ; < Minimax Trcd*40 (ns) of DIMMs
1434   DIMMTrp                       UINT16 ?        ; < Minimax Trp*40 (ns) of DIMMs
1435   DIMMTrtp                      UINT16 ?        ; < Minimax Trtp*40 (ns) of DIMMs
1436   DIMMTras                      UINT16 ?        ; < Minimax Tras*40 (ns) of DIMMs
1437   DIMMTrc                       UINT16 ?        ; < Minimax Trc*40 (ns) of DIMMs
1438   DIMMTwr                       UINT16 ?        ; < Minimax Twr*40 (ns) of DIMMs
1439   DIMMTrrd                      UINT16 ?        ; < Minimax Trrd*40 (ns) of DIMMs
1440   DIMMTwtr                      UINT16 ?        ; < Minimax Twtr*40 (ns) of DIMMs
1441   DIMMTfaw                      UINT16 ?        ; < Minimax Tfaw*40 (ns) of DIMMs
1442   TargetSpeed                   UINT16 ?        ; < Target DRAM bus speed in MHz
1443   Speed                         UINT16 ?        ; < DRAM bus speed in MHz
1444                                   ; <  400 (MHz)
1445                                   ; <  533 (MHz)
1446                                   ; <  667 (MHz)
1447                                   ; <  800 (MHz)
1448                                   ; <  and so on...
1449   CasL                          UINT8 ?         ; < CAS latency DCT setting (busclocks)
1450   Trcd                          UINT8 ?         ; < DCT Trcd (busclocks)
1451   Trp                           UINT8 ?         ; < DCT Trp (busclocks)
1452   Trtp                          UINT8 ?         ; < DCT Trtp (busclocks)
1453   Tras                          UINT8 ?         ; < DCT Tras (busclocks)
1454   Trc                           UINT8 ?         ; < DCT Trc (busclocks)
1455   Twr                           UINT8 ?         ; < DCT Twr (busclocks)
1456   Trrd                          UINT8 ?         ; < DCT Trrd (busclocks)
1457   Twtr                          UINT8 ?         ; < DCT Twtr (busclocks)
1458   Tfaw                          UINT8 ?         ; < DCT Tfaw (busclocks)
1459   Trfc0                         UINT8 ?         ; < DCT Logical DIMM0 Trfc
1460                                   ; <  0 = 75ns (for 256Mb devs)
1461                                   ; <  1 = 105ns (for 512Mb devs)
1462                                   ; <  2 = 127.5ns (for 1Gb devs)
1463                                   ; < 3 = 195ns (for 2Gb devs)
1464                                   ; <  4 = 327.5ns (for 4Gb devs)
1465   Trfc1                         UINT8 ?         ; < DCT Logical DIMM1 Trfc (see Trfc0 for format)
1466   Trfc2                         UINT8 ?         ; < DCT Logical DIMM2 Trfc (see Trfc0 for format)
1467   Trfc3                         UINT8 ?         ; < DCT Logical DIMM3 Trfc (see Trfc0 for format)
1468   DctMemSize                    UINT32 ?        ; < Base[47:16], total DRAM size controlled by this DCT.
1469   SlowMode                      BOOLEAN ?       ; < 1T or 2T CMD mode (slow access mode)
1470                                   ; < FALSE = 1T
1471                                   ; < TRUE = 2T
1472   TrwtTO                        UINT8 ?         ; < DCT TrwtTO (busclocks)
1473   Twrrd                         UINT8 ?         ; < DCT Twrrd (busclocks)
1474   Twrwr                         UINT8 ?         ; < DCT Twrwr (busclocks)
1475   Trdrd                         UINT8 ?         ; < DCT Trdrd (busclocks)
1476   TrwtWB                        UINT8 ?         ; < DCT TrwtWB (busclocks)
1477   TrdrdSD                       UINT8 ?         ; < DCT TrdrdSD (busclocks)
1478   TwrwrSD                       UINT8 ?         ; < DCT TwrwrSD (busclocks)
1479   TwrrdSD                       UINT8 ?         ; < DCT TwrrdSD (busclocks)
1480   MaxRdLat                      UINT16 ?        ; < Max Read Latency
1481   WrDatGrossH                   UINT8 ?         ; < Temporary variables must be removed
1482   DqsRcvEnGrossL                UINT8 ?         ; < Temporary variables must be removed
1483 CH_TIMING_STRUCT    ENDS
1484
1485 ; ===============================================================================
1486  ; Data for each DCT
1487  ; This data structure defines data used to configure each DRAM controller
1488 ; ===============================================================================
1489 DCT_STRUCT    STRUCT
1490   Dct                           UINT8 ?         ; < Current Dct
1491   Timings                       CH_TIMING_STRUCT {}     ; < Channel Timing structure
1492   TimingsMemPs1                 POINTER ?       ; < Pointed to channel timing structure for Memory Pstate 1
1493   ChData                        POINTER ?       ; < Pointed to a dynamically allocated array of Channel structures
1494   ChannelCount                  UINT8 ?         ; < Number of channel per this DCT
1495   BkIntDis                      BOOLEAN ?       ; < Bank interleave requested but not enabled on current DCT
1496 DCT_STRUCT    ENDS
1497
1498
1499 ; ===============================================================================
1500  ; Data Structure defining each Die
1501  ; This data structure contains information that is used to configure each Die
1502 ; ===============================================================================
1503 DIE_STRUCT    STRUCT
1504
1505    ; Advanced:
1506
1507   NodeId                        UINT8 ?         ; < Node ID of current controller
1508   SocketId                      UINT8 ?         ; < Socket ID of this Die
1509   DieId                         UINT8 ?         ; < ID of this die relative to the socket
1510   PciAddr                       PCI_ADDR {}      ; < Pci bus and device number of this controller.
1511   ErrCode                       AGESA_STATUS ?          ; < Current error condition of Node
1512                                    ; <  0x0 = AGESA_SUCCESS
1513                                    ; <  0x1 = AGESA_UNSUPPORTED
1514                                    ; <  0x2 = AGESA_BOUNDS_CHK
1515                                    ; <  0x3 = AGESA_ALERT
1516                                    ; <  0x4 = AGESA_WARNING
1517                                    ; <  0x5 = AGESA_ERROR
1518                                    ; <  0x6 = AGESA_CRITICAL
1519                                    ; <  0x7 = AGESA_FATAL
1520                                    ; <
1521   ErrStatus                     BOOLEAN (EsbEOL) DUP (?)        ; < Error Status bit Field
1522   Status                        BOOLEAN (SbEOL) DUP (?)         ; < Status bit Field
1523   NodeMemSize                   UINT32 ?        ; < Base[47:16], total DRAM size controlled by both DCT0 and DCT1 of this Node.
1524   NodeSysBase                   UINT32 ?        ; < Base[47:16] (system address) DRAM base address of this Node.
1525   NodeHoleBase                  UINT32 ?        ; < If not zero, Base[47:16] (system address) of dram hole for HW remapping.  Dram hole exists on this Node
1526   NodeSysLimit                  UINT32 ?        ; < Base[47:16] (system address) DRAM limit address of this Node.
1527   DimmPresent                   UINT32 ?        ; < For each bit n 0..7, 1 = DIMM n is present.
1528                                    ; <   DIMM#  Select Signal
1529                                    ; <   0      MA0_CS_L[0, 1]
1530                                    ; <   1      MB0_CS_L[0, 1]
1531                                    ; <   2      MA1_CS_L[0, 1]
1532                                    ; <   3      MB1_CS_L[0, 1]
1533                                    ; <   4      MA2_CS_L[0, 1]
1534                                    ; <   5      MB2_CS_L[0, 1]
1535                                    ; <   6      MA3_CS_L[0, 1]
1536                                    ; <   7      MB3_CS_L[0, 1]
1537   DimmValid                     UINT32 ?        ; < For each bit n 0..7, 1 = DIMM n is valid and is / will be configured
1538   RegDimmPresent                UINT32 ?        ; < For each bit n 0..7, 1 = DIMM n is registered DIMM
1539   LrDimmPresent                 UINT32 ?        ; < For each bit n 0..3, 1 = DIMM n is Load Reduced DIMM where 4..7 are reserved.
1540   DimmEccPresent                UINT32 ?        ; < For each bit n 0..7, 1 = DIMM n is ECC capable.
1541   DimmParPresent                UINT32 ?        ; < For each bit n 0..7, 1 = DIMM n is ADR/CMD Parity capable.
1542   DimmTrainFail                 UINT16 ?        ; < Bitmap showing which dimms failed training
1543   ChannelTrainFail              UINT16 ?        ; < Bitmap showing the channel information about failed Chip Selects
1544                                    ; <  0 in any bit field indicates Channel 0
1545                                    ; <  1 in any bit field indicates Channel 1
1546   Dct                           UINT8 ?         ; <  Need to be removed
1547                                    ; <  DCT pointer
1548   GangedMode                    BOOLEAN ?       ; < Ganged mode
1549                                    ; <  0 = disabled
1550                                    ; <  1 = enabled
1551   LogicalCpuid                  CPU_LOGICAL_ID {}       ; < The logical CPUID of the node
1552   HostBiosSrvc1                 UINT16 ?        ; < UINT16 sized general purpose field for use by host BIOS.  Scratch space.
1553   HostBiosSrvc2                 UINT32 ?        ; < UINT32 sized general purpose field for use by host BIOS.  Scratch space.
1554   MLoad                         UINT8 ?         ; < Need to be removed
1555                                    ; < Number of devices loading MAA bus
1556   MaxAsyncLat                   UINT8 ?         ; < Legacy wrapper
1557   ChbD3Rcvrdly                  UINT8 ?         ; < Legacy wrapper
1558   ChaMaxRdLat                   UINT16 ?        ; < Max Read Latency (ns) for DCT 0
1559   ChbD3BcRcvrdly                UINT8 ?         ; < CHB DIMM 3 Check UINT8 Receiver Enable Delay
1560
1561   DctData                       POINTER ?       ; < Pointed to a dynamically allocated array of DCT_STRUCTs
1562   DctCount                      UINT8 ?         ; < Number of DCTs per this Die
1563   Reserved                      UINT8 (16) DUP (?)      ; < Reserved
1564 DIE_STRUCT    ENDS
1565
1566 ; *********************************************************************
1567 ; * S3 Support structure
1568 ; *********************************************************************
1569  ; AmdInitResume, AmdS3LateRestore, and AmdS3Save param structure
1570 AMD_S3_PARAMS    STRUCT
1571      Signature                  UINT32 ?        ; < "ASTR" for AMD Suspend-To-RAM
1572      Version                    UINT16 ?        ; < S3 Params version number
1573   Flags                         UINT32 ?        ; < Indicates operation
1574   NvStorage                     POINTER ?       ; < Pointer to memory critical save state data
1575   NvStorageSize                 UINT32 ?        ; < Size in bytes of the NvStorage region
1576   VolatileStorage               POINTER ?       ; < Pointer to remaining AMD save state data
1577   VolatileStorageSize           UINT32 ?        ; < Size in bytes of the VolatileStorage region
1578 AMD_S3_PARAMS    ENDS
1579
1580 ; ===============================================================================
1581  ; MEM_PARAMETER_STRUCT
1582  ; This data structure is used to pass wrapper parameters to the memory configuration code
1583 ; ===============================================================================
1584 MEM_PARAMETER_STRUCT    STRUCT
1585
1586    ; Basic (Return parameters)
1587    ; (This section contains the outbound parameters from the memory init code)
1588
1589   GStatus                       BOOLEAN (GsbEOL) DUP (?)        ; < Global Status bitfield
1590   HoleBase                      UINT32 ?        ; < If not zero Base[47:16] (system address) of sub 4GB dram hole for HW remapping.
1591   Sub4GCacheTop                 UINT32 ?        ; < If not zero, the 32-bit top of cacheable memory.
1592   Sub1THoleBase                 UINT32 ?        ; < If not zero Base[47:16] (system address) of sub 1TB dram hole.
1593   SysLimit                      UINT32 ?        ; < Limit[47:16] (system address)
1594   DDR3Voltage                   DIMM_VOLTAGE ?    ; < Find support voltage and send back to platform BIOS.
1595   ExternalVrefValue             UINT8 ?         ; < Target reference voltage for external Vref for training
1596   MemData                       POINTER ?       ; < Pointer to MEM_DATA_STRUCT
1597     ; Advanced (Optional parameters)
1598     ; Optional (all defaults values will be initialized by the
1599     ; 'AmdMemInitDataStructDef' based on AMD defaults. It is up
1600     ; to the IBV/OEM to change the defaults after initialization
1601     ; but prior to the main entry to the memory code):
1602
1603    ; Memory Map/Mgt.
1604
1605   BottomIo                      UINT16 ?        ; < Bottom of 32-bit IO space (8-bits)
1606                                    ; <   NV_BOTTOM_IO[7:0]=Addr[31:24]
1607   MemHoleRemapping              BOOLEAN ?       ; < Memory Hole Remapping (1-bit)
1608                                    ; <  FALSE = disable
1609                                    ; <  TRUE  = enable
1610   LimitMemoryToBelow1Tb         BOOLEAN ?       ; < Limit memory address space to below 1 TB
1611                                                 ; <  FALSE = disable
1612                                                 ; <  TRUE  = enable
1613    ; Dram Timing
1614
1615   UserTimingMode                USER_MEMORY_TIMING_MODE ?       ; < User Memclock Mode
1616
1617   MemClockValue                 MEMORY_BUS_SPEED ?      ; < Memory Clock Value
1618
1619    ; Dram Configuration
1620
1621   EnableBankIntlv               BOOLEAN ?       ; < Dram Bank (chip-select) Interleaving (1-bit)
1622                                    ; <   FALSE =disable (AMD default)
1623                                    ; <   TRUE =enable
1624   EnableNodeIntlv               BOOLEAN ?       ; < Node Memory Interleaving (1-bit)
1625                                    ; <   FALSE = disable (AMD default)
1626                                    ; <   TRUE = enable
1627   EnableChannelIntlv            BOOLEAN ?       ; < Channel Interleaving (1-bit)
1628                                    ; <   FALSE = disable (AMD default)
1629                                    ; <   TRUE = enable
1630    ; ECC
1631
1632   EnableEccFeature              BOOLEAN ?       ; < enable ECC error to go into MCE
1633                                    ; <   FALSE = disable (AMD default)
1634                                    ; <   TRUE = enable
1635    ; Dram Power
1636
1637   EnablePowerDown               BOOLEAN ?       ; < CKE based power down mode (1-bit)
1638                                    ; <   FALSE =disable (AMD default)
1639                                    ; <   TRUE =enable
1640    ; Online Spare
1641
1642   EnableOnLineSpareCtl          BOOLEAN ?       ; < Chip Select Spare Control bit 0:
1643                                    ; <  FALSE = disable Spare (AMD default)
1644                                    ; <  TRUE = enable Spare
1645   TableBasedAlterations         POINTER ?       ; < Point to an array of data bytes describing desired modifications to register settings.
1646
1647   PlatformMemoryConfiguration           POINTER ?
1648                                    ; < Points to a table that contains platform specific settings
1649                                    ; < (i.e. MemClk routing, the number of DIMM slots per channel,...)
1650                                    ; < AGESA initializes this pointer with DefaultPlatformMemoryConfiguration that
1651                                    ; < contains default conservative settings. Platform BIOS can either tweak
1652                                    ; < DefaultPlatformMemoryConfiguration or reassign this pointer to its own table.
1653                                    ; <
1654   EnableParity                  BOOLEAN ?       ; < Parity control
1655                                    ; <  TRUE = enable
1656                                    ; <  FALSE = disable (AMD default)
1657   EnableBankSwizzle             BOOLEAN ?       ; < BankSwizzle control
1658                                    ; <  FALSE = disable
1659                                    ; <  TRUE = enable  (AMD default)
1660   EnableMemClr                  BOOLEAN ?       ; < Memory Clear functionality control
1661                                    ; <  FALSE = disable
1662                                    ; <  TRUE = enable  (AMD default)
1663   ; Uma Configuration
1664
1665   UmaMode                       UMA_MODE ?       ; < Uma Mode
1666                                    ; <  0 = None
1667                                    ; <  1 = Specified
1668                                    ; <  2 = Auto
1669   UmaSize                       UINT32 ?       ; < The size of shared graphics dram (16-bits)
1670                                    ; <  NV_UMA_Size[31:0]=Addr[47:16]
1671                                    ; <
1672   UmaBase                       UINT32 ?       ; < The allocated Uma base address (32-bits)
1673                                    ; <  NV_UMA_Base[31:0]=Addr[47:16]
1674                                    ; <
1675
1676    ; Memory Restore Feature
1677
1678   MemRestoreCtl                 BOOLEAN ?       ; < Memory context restore control
1679                                    ; <   FALSE = perform memory init as normal (AMD default)
1680                                    ; <   TRUE = restore memory context and skip training. This requires
1681                                    ; <          MemContext is valid before AmdInitPost
1682   SaveMemContextCtl             BOOLEAN ?       ; < Control switch to save memory context at the end of MemAuto
1683                                    ; <   TRUE = AGESA will setup MemContext block before exit AmdInitPost
1684                                    ; <   FALSE = AGESA will not setup MemContext block. Platform is
1685                                    ; <           expected to call S3Save later in POST if it wants to
1686                                    ; <           use memory context restore feature.
1687   MemContext                    AMD_S3_PARAMS {}        ; < Memory context block describes the data that platform needs to
1688                                    ; < save and restore for memory context restore feature to work.
1689                                    ; < It uses the subset of S3Save block to save/restore. Hence platform
1690                                    ; < may save only S3 block and uses it for both S3 resume and
1691                                    ; < memory context restore.
1692                                    ; <  - If MemRestoreCtl is TRUE, platform needs to pass in MemContext
1693                                    ; <    before AmdInitPost.
1694                                    ; <  - If SaveMemContextCtl is TRUE, platform needs to save MemContext
1695                                    ; <    right after AmdInitPost.
1696  ExternalVrefCtl                BOOLEAN ?      ; < Control the use of external Vref
1697                                    ; <  TRUE = AGESA will use the function defined in "AGESA_EXTERNAL____TRAIN_VREF_CHANGE" in function list
1698                                    ; <          to change the vref
1699                                    ; <   FALSE = AGESA will will use the internal vref control.
1700  ForceTrainMode                 FORCE_TRAIN_MODE ?       ; < Training Mode
1701                                    ; <  0 = Force 1D Training for all configurations
1702                                    ; <  1 = Force training for all configurations
1703                                    ; <  2 = Auto - AGESA will control
1704 MEM_PARAMETER_STRUCT    ENDS
1705
1706
1707 ; ===============================================================================
1708  ; Function definition
1709  ; This data structure passes function pointers to the memory configuration code.
1710  ; The wrapper can use this structure with customized versions
1711 ; ================================================================================
1712 MEM_FUNCTION_STRUCT    STRUCT
1713
1714    ; PUBLIC required Internal functions
1715
1716   amdMemGetPsCfgU       POINTER ?       ; < Proc for Unbuffered DIMMs, platform specific
1717   amdMemGetPsCfgR       POINTER ?       ; < Proc for Registered DIMMs, platform specific
1718
1719    ; PUBLIC optional functions
1720
1721   amdMemEccInit         POINTER ?       ; < NB proc for ECC feature
1722   amdMemChipSelectInterleaveInit        POINTER ?       ; < NB proc for CS interleave feature
1723   amdMemDctInterleavingInit     POINTER ?       ; < NB proc for Channel interleave feature
1724   amdMemMctInterleavingInit     POINTER ?       ; < NB proc for Node interleave feature
1725   amdMemParallelTraining        POINTER ?       ; < NB proc for parallel training feature
1726   amdMemEarlySampleSupport      POINTER ?       ; < NB code for early sample support feature
1727   amdMemMultiPartInitSupport    POINTER ?       ; < NB code for 'multi-part'
1728   amdMemOnlineSpareSupport      POINTER ?       ; < NB code for On-Line Spare feature
1729   amdMemUDimmInit       POINTER ?       ; < NB code for UDIMMs
1730   amdMemRDimmInit       POINTER ?       ; < NB code for RDIMMs
1731   amdMemLrDimmInit       POINTER ?       ; < NB code for LRDIMMs
1732   Reserved                      UINT32 (100) DUP (?)    ; < Reserved for later function definition
1733 MEM_FUNCTION_STRUCT    ENDS
1734
1735 ; ===============================================================================
1736  ; Socket Structure
1737
1738 ; ===============================================================================
1739 MEM_SOCKET_STRUCT    STRUCT
1740   ChannelPtr                    POINTER (MAX_CHANNELS_PER_SOCKET) DUP (?)       ; < Pointers to each channels training data
1741
1742   TimingsPtr                    POINTER (MAX_CHANNELS_PER_SOCKET) DUP (?)       ; < Pointers to each channels timing data
1743
1744 MEM_SOCKET_STRUCT    ENDS
1745
1746 ; ===============================================================================
1747  ; MEM_DATA_STRUCT
1748 ; ===============================================================================
1749 MEM_DATA_STRUCT    STRUCT
1750   StdHeader                     AMD_CONFIG_PARAMS {}     ; < AGESA Standard Header
1751
1752   ParameterListPtr              POINTER ?       ; < List of input Parameters
1753
1754   FunctionList                  MEM_FUNCTION_STRUCT {}          ; < List of function Pointers
1755
1756   GetPlatformCfg        POINTER (MAX_PLATFORM_TYPES) DUP (?)    ; < look-up platform info
1757
1758   ErrorHandling         POINTER ?     ; < Error Handling
1759
1760    ; SocketList is a shortcut for IBVs to retrieve training
1761    ; and timing data for each channel indexed by socket/channel,
1762    ; eliminating their need to parse die/dct/channel etc.
1763    ; It contains pointers to the populated data structures for
1764    ; each channel and skips the channel structures that are
1765    ; unpopulated. In the case of channels sharing the same DCT,
1766    ; the pTimings pointers will point to the same DCT Timing data.
1767
1768   SocketList                    MEM_SOCKET_STRUCT (MAX_SOCKETS_SUPPORTED) DUP ({})      ; < Socket list for memory code
1769
1770   DiesPerSystem                 POINTER ?       ; < Pointed to an array of DIE_STRUCTs
1771   DieCount                      UINT8 ?         ; < Number of MCTs in the system.
1772
1773   SpdDataStructure              POINTER ?       ; < Pointer to SPD Data structure
1774
1775   PlatFormConfig              POINTER ?       ; < Pointer to Platform profile/build option config structure
1776
1777   IsFlowControlSupported                  BOOLEAN ?       ; < Indicates if flow control is supported
1778
1779   TscRate                       UINT32 ?        ; < The rate at which the TSC increments in megahertz.
1780
1781 MEM_DATA_STRUCT    ENDS
1782
1783 ; ===============================================================================
1784 ; UMA_INFO_STRUCT
1785 ; ===============================================================================
1786 UMA_INFO      STRUCT
1787   UmaBase         UINT64 ?        ; < UmaBase[63:0] = Addr[63:0]
1788   UmaSize         UINT32 ?        ; < UmaSize[31:0] = Addr[31:0]
1789   UmaAttributes   UINT32 ?        ; < Indicate the attribute of Uma
1790   UmaMode         UINT8 ?         ; < Indicate the mode of Uma
1791   MemClock        UINT16 ?        ; < Indicate memory running speed in MHz
1792   Reserved        UINT8 (3) DUP (?)         ; < Reserved for future usage
1793 UMA_INFO      ENDS
1794
1795 ; ===============================================================================
1796 ; Bitfield for ID
1797 ; ===============================================================================
1798 ID_FIELD      STRUCT
1799   SocketId        UINT16 ?
1800 ;  OUT UINT16 SocketId:8;         ; < Socket ID
1801 ;  OUT UINT16 ModuleId:8;         ; < Module ID
1802 ID_FIELD      ENDS
1803
1804 ; ===============================================================================
1805 ; Union for ID of socket and module that will be passed out in call out
1806 ; ===============================================================================
1807 ID_INFO      UNION
1808   IdField         ID_FIELD {}     ; < Bitfield for ID
1809   IdInformation   UINT16 ?        ; < ID information for call out
1810 ID_INFO      ENDS
1811
1812   ; AGESA MEMORY ERRORS
1813
1814  ; AGESA_ALERT Memory Errors
1815 MEM_ALERT_USER_TMG_MODE_OVERRULED   EQU    04010000h     ; < TIMING_MODE_SPECIFIC is requested but
1816                                                        ; < cannot be applied to current configurations.
1817 MEM_ALERT_ORG_MISMATCH_DIMM         EQU    04010100h     ; < DIMM organization miss-match
1818 MEM_ALERT_BK_INT_DIS                EQU    04010200h     ; < Bank interleaving disable for internal issue
1819
1820  ; AGESA_ERROR Memory Errors
1821 MEM_ERROR_NO_DQS_POS_RD_WINDOW            EQU   04010300h     ; < No DQS Position window for RD DQS
1822 MEM_ERROR_SMALL_DQS_POS_RD_WINDOW         EQU   04020300h     ; < Small DQS Position window for RD DQS
1823 MEM_ERROR_NO_DQS_POS_WR_WINDOW            EQU   04030300h     ; < No DQS Position window for WR DQS
1824 MEM_ERROR_SMALL_DQS_POS_WR_WINDOW         EQU   04040300h     ; < Small DQS Position window for WR DQS
1825 MEM_ERROR_ECC_DIS                         EQU   04010400h     ; < ECC has been disabled as a result of an internal issue
1826 MEM_ERROR_DIMM_SPARING_NOT_ENABLED        EQU   04010500h     ; < DIMM sparing has not been enabled for an internal issues
1827 MEM_ERROR_RCVR_EN_VALUE_TOO_LARGE         EQU   04050300h     ; < Receive Enable value is too large
1828 MEM_ERROR_RCVR_EN_NO_PASSING_WINDOW       EQU   04060300h     ; < There is no DQS receiver enable window
1829 MEM_ERROR_DRAM_ENABLED_TIME_OUT           EQU   04010600h     ; < Time out when polling DramEnabled bit
1830 MEM_ERROR_DCT_ACCESS_DONE_TIME_OUT        EQU   04010700h     ; < Time out when polling DctAccessDone bit
1831 MEM_ERROR_SEND_CTRL_WORD_TIME_OUT         EQU   04010800h     ; < Time out when polling SendCtrlWord bit
1832 MEM_ERROR_PREF_DRAM_TRAIN_MODE_TIME_OUT   EQU   04010900h     ; < Time out when polling PrefDramTrainMode bit
1833 MEM_ERROR_ENTER_SELF_REF_TIME_OUT         EQU   04010A00h     ; < Time out when polling EnterSelfRef bit
1834 MEM_ERROR_FREQ_CHG_IN_PROG_TIME_OUT       EQU   04010B00h     ; < Time out when polling FreqChgInProg bit
1835 MEM_ERROR_EXIT_SELF_REF_TIME_OUT          EQU   04020A00h     ; < Time out when polling ExitSelfRef bit
1836 MEM_ERROR_SEND_MRS_CMD_TIME_OUT           EQU   04010C00h     ; < Time out when polling SendMrsCmd bit
1837 MEM_ERROR_SEND_ZQ_CMD_TIME_OUT            EQU   04010D00h     ; < Time out when polling SendZQCmd bit
1838 MEM_ERROR_DCT_EXTRA_ACCESS_DONE_TIME_OUT  EQU   04010E00h     ; < Time out when polling DctExtraAccessDone bit
1839 MEM_ERROR_MEM_CLR_BUSY_TIME_OUT           EQU   04010F00h     ; < Time out when polling MemClrBusy bit
1840 MEM_ERROR_MEM_CLEARED_TIME_OUT            EQU   04020F00h     ; < Time out when polling MemCleared bit
1841 MEM_ERROR_FLUSH_WR_TIME_OUT               EQU   04011000h     ; < Time out when polling FlushWr bit
1842 MEM_ERROR_MAX_LAT_NO_WINDOW               EQU   04070300h     ; < Fail to find pass during Max Rd Latency training
1843 MEM_ERROR_PARALLEL_TRAINING_LAUNCH_FAIL   EQU   04080300h     ; < Fail to launch training code on an AP
1844 MEM_ERROR_PARALLEL_TRAINING_TIME_OUT      EQU   04090300h     ; < Fail to finish parallel training
1845 MEM_ERROR_NO_ADDRESS_MAPPING              EQU   04011100h     ; < No address mapping found for a dimm
1846 MEM_ERROR_RCVR_EN_NO_PASSING_WINDOW_EQUAL_LIMIT  EQU   040A0300h ; < There is no DQS receiver enable window and the value is equal to the largest value
1847 MEM_ERROR_RCVR_EN_VALUE_TOO_LARGE_LIMIT_LESS_ONE EQU   040B0300h ; < Receive Enable value is too large and is 1 less than limit
1848 MEM_ERROR_CHECKSUM_NV_SPDCHK_RESTRT_ERROR EQU    04011200h    ; < SPD Checksum error for NV_SPDCHK_RESTRT
1849 MEM_ERROR_NO_CHIPSELECT                   EQU   04011300h     ; < No chipselects found
1850 MEM_ERROR_UNSUPPORTED_333MHZ_UDIMM        EQU   04011500h     ; < Unbuffered dimm is not supported at 333MHz
1851 MEM_ERROR_WL_PRE_OUT_OF_RANGE             EQU   040C0300h     ; < Returned PRE value during write levelization was out of range
1852 MEM_ERROR_NO____RDDQS_WINDOW              EQU   040D0300h     ; < No RdDqs Window
1853 MEM_ERROR_NO____RDDQS_HEIGHT              EQU   040E0300h     ; < No RdDqs Height
1854 MEM_ERROR____DQS_ERROR                    EQU   040F0300h     ; < RdDqs Error
1855 MEM_ERROR_INVALID____RDDQS_VALUE          EQU   04022400h     ; < RdDqs invalid value found
1856 MEM_ERROR____DQS_VREF_MARGIN_ERROR        EQU   04023400h     ; < RdDqs Vef Margin error found
1857 MEM_ERROR_LR_IBT_NOT_FOUND                EQU   04013500h     ; < No LR dimm IBT value is found
1858 MEM_ERROR_MR0_NOT_FOUND                   EQU   04023500h     ; < No MR0 value is found
1859 MEM_ERROR_ODT_PATTERN_NOT_FOUND           EQU   04033500h     ; < No odt pattern value is found
1860 MEM_ERROR_RC2_IBT_NOT_FOUND               EQU   04043500h     ; < No RC2 IBT value is found
1861 MEM_ERROR_RC10_OP_SPEED_NOT_FOUND         EQU   04053500h     ; < No RC10 op speed is found
1862 MEM_ERROR_RTT_NOT_FOUND                   EQU   04063500h     ; < No RTT value is found
1863 MEM_ERROR_P___NOT_FOUND                   EQU   04073500h     ; < No training config value is found
1864 MEM_ERROR_SAO_NOT_FOUND                   EQU   04083500h     ; < No slow access mode, Address timing and Output driver compensation value is found
1865 MEM_ERROR_CLK_DIS_MAP_NOT_FOUND           EQU   04093500h     ; < No CLK disable map is found
1866 MEM_ERROR_CKE_TRI_MAP_NOT_FOUND           EQU   040A3500h     ; < No CKE tristate map is found
1867 MEM_ERROR_ODT_TRI_MAP_NOT_FOUND           EQU   040B3500h     ; < No ODT tristate map is found
1868 MEM_ERROR_CS_TRI_MAP_NOT_FOUND            EQU   040C3500h     ; < No CS tristate map is found
1869 MEM_ERROR_TRAINING_SEED_NOT_FOUND         EQU   040D3500h     ; < No training seed is found
1870
1871  ; AGESA_WARNING Memory Errors
1872     MEM_WARNING_UNSUPPORTED_QRDIMM      EQU    04011600h     ; < QR DIMMs detected but not supported
1873     MEM_WARNING_UNSUPPORTED_UDIMM       EQU    04021600h     ; < U DIMMs detected but not supported
1874     MEM_WARNING_UNSUPPORTED_SODIMM      EQU    04031600h     ; < SO-DIMMs detected but not supported
1875     MEM_WARNING_UNSUPPORTED_X4DIMM      EQU    04041600h     ; < x4 DIMMs detected but not supported
1876     MEM_WARNING_UNSUPPORTED_RDIMM       EQU    04051600h     ; < R DIMMs detected but not supported
1877     MEM_WARNING_UNSUPPORTED_LRDIMM      EQU    04061600h     ; < LR DIMMs detected but not supported
1878
1879     MEM_WARNING_EMP_NOT_SUPPORTED       EQU    04011700h     ; < Processor is not capable for EMP
1880     MEM_WARNING_EMP_CONFLICT    EQU    04021700h      ; < EMP cannot be enabled if channel interleaving,
1881                                                         ; < bank interleaving, or bank swizzle is enabled.
1882     MEM_WARNING_EMP_NOT_ENABLED EQU    04031700h      ; < Memory size is not power of two.
1883     MEM_WARNING_ECC_DIS         EQU    04041700h      ; < ECC has been disabled as a result of an internal issue
1884     MEM_WARNING_PERFORMANCE_ENABLED_BATTERY_LIFE_PREFERRED EQU 04011800h  ; < Performance has been enabled, but battery life is preferred.
1885     MEM_WARNING_NO_SPDTRC_FOUND EQU    04011900h      ; < No Trc timing value found in SPD of a dimm.
1886     MEM_WARNING_NODE_INTERLEAVING_NOT_ENABLED     EQU     04012000h    ; < Node Interleaveing Requested, but could not be enabled
1887     MEM_WARNING_CHANNEL_INTERLEAVING_NOT_ENABLED  EQU     04012100h    ; < Channel Interleaveing Requested, but could not be enabled
1888     MEM_WARNING_BANK_INTERLEAVING_NOT_ENABLED     EQU     04012200h    ; < Bank Interleaveing Requested, but could not be enabled
1889     MEM_WARNING_VOLTAGE_1_35_NOT_SUPPORTED        EQU     04012300h    ; < Voltage 1.35 determined, but could not be supported
1890     MEM_WARNING_INITIAL_DDR3VOLT_NONZERO          EQU     04012400h    ; < DDR3 voltage initial value is not 0
1891     MEM_WARNING_NO_COMMONLY_SUPPORTED_VDDIO       EQU     04012500h    ; < Cannot find a commonly supported VDDIO
1892
1893  ; AGESA_FATAL Memory Errors
1894     MEM_ERROR_MINIMUM_MODE      EQU    04011A00h                   ; < Running in minimum mode
1895     MEM_ERROR_MODULE_TYPE_MISMATCH_DIMM EQU    04011B00h      ; < DIMM modules are miss-matched
1896     MEM_ERROR_NO_DIMM_FOUND_ON_SYSTEM    EQU    04011C00h     ; < No DIMMs have been found on system
1897     MEM_ERROR_MISMATCH_DIMM_CLOCKS      EQU    04011D00h          ; < DIMM clocks miss-matched
1898     MEM_ERROR_NO_CYC_TIME       EQU    04011E00h                    ; < No cycle time found
1899     MEM_ERROR_HEAP_ALLOCATE_DYN_STORING_OF_TRAINED_TIMINGS   EQU    04011F00h ; < Heap allocation error with dynamic storing of trained timings
1900     MEM_ERROR_HEAP_ALLOCATE_FOR_DCT_STRUCT_AND_CH_DEF_STRUCTs   EQU    04021F00h ; < Heap allocation error for DCT_STRUCT and CH_DEF_STRUCT
1901     MEM_ERROR_HEAP_ALLOCATE_FOR_REMOTE_TRAINING_ENV   EQU    04031F00h ; < Heap allocation error with REMOTE_TRAINING_ENV
1902     MEM_ERROR_HEAP_ALLOCATE_FOR_SPD     EQU    04041F00h    ; < Heap allocation error for SPD data
1903     MEM_ERROR_HEAP_ALLOCATE_FOR_RECEIVED_DATA     EQU    04051F00h    ; < Heap allocation error for RECEIVED_DATA during parallel training
1904     MEM_ERROR_HEAP_ALLOCATE_FOR_S3_SPECIAL_CASE_REGISTERS     EQU    04061F00h    ; < Heap allocation error for S3 "SPECIAL_CASE_REGISTER"
1905     MEM_ERROR_HEAP_ALLOCATE_FOR_TRAINING_DATA     EQU    04071F00h    ; < Heap allocation error for Training Data
1906     MEM_ERROR_HEAP_ALLOCATE_FOR_IDENTIFY_DIMM_MEM_NB_BLOCK     EQU    04081F00h   ; < Heap allocation error for  DIMM Identify "MEM_NB_BLOCK
1907     MEM_ERROR_NO_CONSTRUCTOR_FOR_IDENTIFY_DIMM    EQU    04022300h    ; < No Constructor for DIMM Identify
1908     MEM_ERROR_VDDIO_UNSUPPORTED   EQU   04022500h     ; < VDDIO of the dimms on the board is not supported
1909     MEM_ERROR_HEAP_ALLOCATE_FOR___   EQU  040B1F00h    ; < Heap allocation error for training data
1910     MEM_ERROR_HEAP_DEALLOCATE_FOR___  EQU     040C1F00h  ; < Heap de-allocation error for training data
1911
1912  ; AGESA_CRITICAL Memory Errors
1913     MEM_ERROR_HEAP_ALLOCATE_FOR_DMI_TABLE_DDR3     EQU    04091F00h    ; < Heap allocation error for DMI table for DDR3
1914     MEM_ERROR_HEAP_ALLOCATE_FOR_DMI_TABLE_DDR2     EQU    040A1F00h    ; < Heap allocation error for DMI table for DDR2
1915     MEM_ERROR_UNSUPPORTED_DIMM_CONFIG    EQU   04011400h          ; < Dimm population is not supported
1916
1917
1918 ; ----------------------------------------------------------------------------
1919 ; *
1920 ; *                END OF MEMORY-SPECIFIC DATA STRUCTURES
1921 ; *
1922 ; *----------------------------------------------------------------------------
1923 ;
1924
1925
1926 ; ----------------------------------------------------------------------------
1927 ; *
1928 ; *                    CPU RELATED DEFINITIONS
1929 ; *
1930 ; *----------------------------------------------------------------------------
1931 ;
1932
1933 ; CPU Event definitions.
1934
1935 ; Defines used to filter CPU events based on functional blocks
1936 CPU_EVENT_PM_EVENT_MASK                         EQU   0FF00FF00h
1937 CPU_EVENT_PM_EVENT_CLASS                        EQU   008000400h
1938
1939 ;================================================================
1940 ; CPU General events
1941 ;    Heap allocation                    (AppFunction =     01h)
1942 CPU_ERROR_HEAP_BUFFER_IS_NOT_PRESENT            EQU   008000100h
1943 CPU_ERROR_HEAP_IS_ALREADY_INITIALIZED           EQU   008010100h
1944 CPU_ERROR_HEAP_IS_FULL                          EQU   008020100h
1945 CPU_ERROR_HEAP_BUFFER_HANDLE_IS_ALREADY_USED    EQU   008030100h
1946 CPU_ERROR_HEAP_BUFFER_HANDLE_IS_NOT_PRESENT     EQU   008040100h
1947 ;    BrandId                            (AppFunction =     02h)
1948 CPU_ERROR_BRANDID_HEAP_NOT_AVAILABLE            EQU   008000200h
1949 ;    Micro code patch                   (AppFunction =     03h)
1950 CPU_ERROR_MICRO_CODE_PATCH_IS_NOT_LOADED        EQU   008000300h
1951 ;    Power management                   (AppFunction =     04h)
1952 CPU_EVENT_PM_PSTATE_OVERCURRENT                 EQU   008000400h
1953 CPU_EVENT_PM_ALL_PSTATE_OVERCURRENT             EQU   008010400h
1954 CPU_ERROR_PSTATE_HEAP_NOT_AVAILABLE             EQU   008020400h
1955 CPU_ERROR_PM_NB_PSTATE_MISMATCH                 EQU   008030400h
1956 ;   Other CPU events                    (AppFunction =     05h)
1957 CPU_EVENT_BIST_ERROR                            EQU   008000500h
1958 CPU_EVENT_UNKNOWN_PROCESSOR_FAMILY              EQU   008010500h
1959 CPU_EVENT_STACK_REENTRY                         EQU   008020500h
1960 CPU_EVENT_CORE_NOT_IDENTIFIED                   EQU   008030500h
1961 ;=================================================================
1962 ; CPU Feature events
1963 ;    Execution cache                    (AppFunction =     21h)
1964 ;        AGESA_CACHE_SIZE_REDUCED                          2101
1965 ;        AGESA_CACHE_REGIONS_ACROSS_1MB                    2102
1966 ;        AGESA_CACHE_REGIONS_ACROSS_4GB                    2103
1967 ;        AGESA_REGION_NOT_ALIGNED_ON_BOUNDARY              2104
1968 ;        AGESA_CACHE_START_ADDRESS_LESS_D0000              2105
1969 ;        AGESA_THREE_CACHE_REGIONS_ABOVE_1MB               2106
1970 ;        AGESA_DEALLOCATE_CACHE_REGIONS                    2107
1971 CPU_EVENT_EXECUTION_CACHE_ALLOCATION_ERROR      EQU   008002100h
1972 ;    Core Leveling                      (AppFunction =     22h)
1973 CPU_WARNING_ADJUSTED_LEVELING_MODE              EQU   008002200h
1974 ;    HT Assist                          (AppFunction =     23h)
1975 CPU_WARNING_NONOPTIMAL_HT_ASSIST_CFG            EQU   008002300h
1976
1977 ; CPU Build Configuration structures and definitions
1978
1979 ; Build Configuration values for BLDGCFG_AP_MTRR_SETTINGS
1980 AP_MTRR_SETTINGS  STRUCT
1981   MsrAddr       UINT32 ?  ; < Fixed-Sized MTRR address
1982   MsrData       UINT64 ?  ; < MTRR Settings
1983 AP_MTRR_SETTINGS  ENDS
1984
1985 AMD_AP_MTRR_FIX64k_00000    EQU 000000250h
1986 AMD_AP_MTRR_FIX16k_80000    EQU 000000258h
1987 AMD_AP_MTRR_FIX16k_A0000    EQU 000000259h
1988 AMD_AP_MTRR_FIX4k_C0000     EQU 000000268h
1989 AMD_AP_MTRR_FIX4k_C8000     EQU 000000269h
1990 AMD_AP_MTRR_FIX4k_D0000     EQU 00000026Ah
1991 AMD_AP_MTRR_FIX4k_D8000     EQU 00000026Bh
1992 AMD_AP_MTRR_FIX4k_E0000     EQU 00000026Ch
1993 AMD_AP_MTRR_FIX4k_E8000     EQU 00000026Dh
1994 AMD_AP_MTRR_FIX4k_F0000     EQU 00000026Eh
1995 AMD_AP_MTRR_FIX4k_F8000     EQU 00000026Fh
1996 CPU_LIST_TERMINAL           EQU 0FFFFFFFFh
1997
1998 ; ***********************************************************************
1999 ; *
2000 ; *  AGESA interface Call-Out function parameter structures
2001 ; *
2002 ; **********************************************************************
2003
2004  ; Parameters structure for interface call-out AgesaAllocateBuffer
2005 AGESA_BUFFER_PARAMS    STRUCT
2006   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Standard header
2007   BufferLength                  UINT32 ?        ; < Size of buffer to allocate
2008   BufferHandle                  UINT32 ?        ; < Identifier or name for the buffer
2009   BufferPointer                 POINTER ?       ; < location of the created buffer
2010 AGESA_BUFFER_PARAMS    ENDS
2011
2012  ; Parameters structure for interface call-out AgesaRunCodeOnAp
2013 AP_EXE_PARAMS    STRUCT
2014   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Standard header
2015   FunctionNumber                UINT32 ?        ; < Index of the procedure to execute
2016   RelatedDataBlock              POINTER ?       ; < Location of data structure the procedure will use
2017   RelatedBlockLength            UINT32 ?        ; < Size of the related data block
2018 AP_EXE_PARAMS    ENDS
2019
2020  ; Parameters structure for the interface call-out AgesaReadSpd & AgesaReadSpdRecovery
2021 AGESA_READ_SPD_PARAMS    STRUCT
2022   StdHeader                     AMD_CONFIG_PARAMS {}     ; < standard header
2023   SocketId                      UINT8 ?         ; < Address of SPD - socket ID
2024   MemChannelId                  UINT8 ?         ; < Address of SPD - memory channel ID
2025   DimmId                        UINT8 ?         ; < Address of SPD - DIMM ID
2026   Buffer                        POINTER ?       ; < Location where to place the SPD content
2027   MemData                       POINTER ?       ; < Location of the MemData structure, for reference
2028 AGESA_READ_SPD_PARAMS    ENDS
2029
2030  ; Buffer Handles
2031   AMD_DMI_INFO_BUFFER_HANDLE    EQU    000D000h ; < Assign 0x000D000 buffer handle to DMI function
2032   AMD_PSTATE_DATA_BUFFER_HANDLE EQU    000D001h ; < Assign 0x000D001 buffer handle to Pstate data
2033   AMD_PSTATE_ACPI_BUFFER_HANDLE EQU    000D002h ; < Assign 0x000D002 buffer handle to Pstate table
2034   AMD_BRAND_ID_BUFFER_HANDLE    EQU    000D003h ; < Assign 0x000D003 buffer handle to Brand ID
2035   AMD_ACPI_SLIT_BUFFER_HANDLE   EQU    000D004h ; < Assign 0x000D004 buffer handle to SLIT function
2036   AMD_SRAT_INFO_BUFFER_HANDLE   EQU    000D005h ; < Assign 0x000D005 buffer handle to SRAT function
2037   AMD_WHEA_BUFFER_HANDLE        EQU    000D006h ; < Assign 0x000D006 buffer handle to WHEA function
2038   AMD_S3_INFO_BUFFER_HANDLE     EQU    000D007h ; < Assign 0x000D007 buffer handle to S3 function
2039   AMD_S3_NB_INFO_BUFFER_HANDLE  EQU    000D008h ; < Assign 0x000D008 buffer handle to S3 NB device info
2040   AMD_ACPI_ALIB_BUFFER_HANDLE   EQU    000D009h ; < Assign 0x000D009 buffer handle to ALIB SSDT table
2041   AMD_ACPI_IVRS_BUFFER_HANDLE   EQU    000D00Ah ; < Assign 0x000D00A buffer handle to IOMMU IVRS table
2042 AMD_BUFFER_HANDLE  TEXTEQU  <DWORD>
2043 ; ***********************************************************************
2044 ; *
2045 ; *  AGESA interface Call-Out function prototypes
2046 ; *
2047 ; **********************************************************************
2048
2049 ; ***********************************************************************
2050 ; *
2051 ; *  AGESA interface structure definition and function prototypes
2052 ; *
2053 ; **********************************************************************
2054
2055 ; *********************************************************************
2056 ; * Platform Configuration:  The parameters in boot branch function
2057 ; *********************************************************************
2058
2059 ;   The possible platform control flow settings.
2060   Nfcm                          EQU  0            ; < Normal Flow Control Mode.
2061   UmaDr                         EQU  1            ; < UMA using Display Refresh flow control.
2062   UmaIfcm                       EQU  2            ; < UMA using Isochronous Flow Control.
2063   Ifcm                          EQU  3            ; < Isochronous Flow Control Mode (other than for UMA).
2064   Iommu                         EQU  4            ; < An IOMMU is in use in the system.
2065   MaxControlFlow                EQU  5            ; < Not a control flow mode, use for limit checking.
2066 PLATFORM_CONTROL_FLOW  TEXTEQU  <DWORD>
2067
2068 ;   Platform Deemphasis Levels.
2069   DeemphasisLevelNone            EQU  0           ; < No Deemphasis.
2070   DeemphasisLevelMinus3          EQU  1           ; < Minus 3 db deemphasis.
2071   DeemphasisLevelMinus6          EQU  2           ; < Minus 6 db deemphasis.
2072   DeemphasisLevelMinus8          EQU  3           ; < Minus 8 db deemphasis.
2073   DeemphasisLevelMinus11         EQU  4           ; < Minus 11 db deemphasis.
2074   DeemphasisLevelMinus11pre8     EQU  5           ; < Minus 11, Minus 8 precursor db deemphasis.
2075   DcvLevelNone                   EQU  16          ; < No DCV Deemphasis.
2076   DcvLevelMinus2                 EQU  17          ; < Minus 2 db DCV deemphasis.
2077   DcvLevelMinus3                 EQU  18          ; < Minus 3 db DCV deemphasis.
2078   DcvLevelMinus5                 EQU  19          ; < Minus 5 db DCV deemphasis.
2079   DcvLevelMinus6                 EQU  20          ; < Minus 6 db DCV deemphasis.
2080   DcvLevelMinus7                 EQU  21          ; < Minus 7 db DCV deemphasis.
2081   DcvLevelMinus8                 EQU  22          ; < Minus 8 db DCV deemphasis.
2082   DcvLevelMinus9                 EQU  23          ; < Minus 9 db DCV deemphasis.
2083   DcvLevelMinus11                EQU  24          ; < Minus 11 db DCV deemphasis.
2084   MaxPlatformDeemphasisLevel     EQU  25          ; < Not a deemphasis level, use for limit checking.
2085 PLATFORM_DEEMPHASIS_LEVEL  TEXTEQU  <DWORD>
2086
2087 ;   Provide Deemphasis Levels for HT Links.
2088 ;
2089 ;   For each CPU to CPU or CPU to IO device HT link, the list of Deemphasis Levels will
2090 ;   be checked for a match. The item matches for a Socket, Link if the link frequency is
2091 ;   is in the inclusive range HighFreq:LoFreq.
2092 ;   AGESA does not set deemphasis in IO devices, only in processors.
2093
2094 CPU_HT_DEEMPHASIS_LEVEL STRUCT
2095   ; Match fields
2096   Socket                   UINT8  ?               ; < One Socket on which this Link is located
2097   Link                     UINT8  ?               ; < The Link on this Processor.
2098   LoFreq                   UINT8  ?               ; < If the link is set to this frequency or greater, apply these levels, and
2099   HighFreq                 UINT8  ?               ; < If the link is set to this frequency or less, apply these levels.
2100   ; Value fields
2101   ReceiverDeemphasis       PLATFORM_DEEMPHASIS_LEVEL ? ; < The deemphasis level for this link
2102   DcvDeemphasis            PLATFORM_DEEMPHASIS_LEVEL ? ; < The DCV, or far transmitter deemphasis level.
2103 CPU_HT_DEEMPHASIS_LEVEL ENDS
2104
2105 ;  The possible hardware prefetch mode settings.
2106   HARDWARE_PREFETCHER_AUTO         EQU  0           ; Use the recommended setting for the processor. In most cases, the recommended setting is enabled.
2107   DISABLE_L1_PREFETCHER            EQU  1           ; Use the recommended settings for the hardware prefetcher, but disable L1 prefetching.
2108   DISABLE_HW_PREFETCHER_TRAINING_ON_SOFTWARE_PREFETCHES  EQU 2  ; Use the recommended setting for the hardware prefetcher, but disable training on software prefetches.
2109   DISABLE_L1_PREFETCHER_AND_HW_PREFETCHER_TRAINING_ON_SOFTWARE_PREFETCHES  EQU 3  ; Use the recommended settings for the hardware prefetcher, but disable both the L1 prefetcher and training on software prefetches.
2110   DISABLE_HARDWARE_PREFETCH        EQU  4           ; Disable hardware prefetching.
2111   MAX_HARDWARE_PREFETCH_MODE       EQU  5           ; Not a hardware prefetch mode, use for limit checking.
2112 HARDWARE_PREFETCH_MODE  TEXTEQU  <DWORD>
2113
2114 ;  The possible software prefetch mode settings.
2115   SOFTWARE_PREFETCHES_AUTO         EQU  0           ; Use the recommended setting for the processor. In most cases, the recommended setting is enabled.
2116   DISABLE_SOFTWARE_PREFETCHES      EQU  1           ; Disable software prefetches (convert software prefetch instructions to NOP).
2117   MAX_SOFTWARE_PREFETCH_MODE       EQU  2           ; Not a software prefetch mode, use for limit checking.
2118 SOFTWARE_PREFETCH_MODE TEXTEQU  <DWORD>
2119
2120 ; Advanced performance tunings, prefetchers.
2121 ; These settings provide for performance tuning to optimize for specific workloads.
2122 ADVANCED_PERFORMANCE_PROFILE STRUCT
2123   HardwarePrefetchMode          HARDWARE_PREFETCH_MODE ? ; This value provides for advanced performance tuning by controlling the hardware prefetcher setting.
2124   SoftwarePrefetchMode          SOFTWARE_PREFETCH_MODE ? ; This value provides for advanced performance tuning by controlling the software prefetch instructions.
2125   DramPrefetchMode              DRAM_PREFETCH_MODE ?     ; This value provides for advanced performance tuning by controlling the DRAM prefetcher setting.
2126 ADVANCED_PERFORMANCE_PROFILE ENDS
2127
2128 ;   The possible platform power policy settings.
2129   Performance                    EQU  0           ; < Optimize for performance.
2130   BatteryLife                    EQU  1           ; < Optimize for battery life.
2131   MaxPowerPolicy                 EQU  2           ; < Not a power policy mode, use for limit checking.
2132 PLATFORM_POWER_POLICY  TEXTEQU  <DWORD>
2133
2134 ; Platform performance settings for optimized settings.
2135 ; Several configuration settings for the processor depend upon other parts and
2136 ; general designer choices for the system. The determination of these data points
2137 ; is not standard for all platforms, so the host environment needs to provide these
2138 ; to specify how the system is to be configured.
2139 PERFORMANCE_PROFILE    STRUCT
2140   PlatformControlFlowMode       PLATFORM_CONTROL_FLOW ?  ; < The platform's control flow mode for optimum platform performance.
2141   UseHtAssist                   BOOLEAN ?       ; < HyperTransport link traffic optimization.
2142   UseAtmMode                    BOOLEAN ?       ; < HyperTransport link traffic optimization.
2143   Use32ByteRefresh              BOOLEAN ?       ; < Display Refresh traffic generates 32 byte requests.
2144   UseVariableMctIsocPriority    BOOLEAN ?       ; < The Memory controller will be set to Variable Isoc Priority.
2145   AdvancedPerformanceProfile ADVANCED_PERFORMANCE_PROFILE {}  ; < The advanced platform performance settings.
2146   PlatformPowerPolicy           PLATFORM_POWER_POLICY ?  ; < The platform's desired power policy
2147 PERFORMANCE_PROFILE    ENDS
2148
2149 ; Platform settings that describe the voltage regulator modules of the system.
2150 ; Many power management settings are dependent upon the characteristics of the
2151 ; on-board voltage regulator module (VRM).  The host environment needs to provide
2152 ; these to specify how the system is to be configured.
2153 PLATFORM_VRM_CONFIGURATION   STRUCT
2154   CurrentLimit                  UINT32 ?         ; < Vrm Current Limit.
2155   LowPowerThreshold             UINT32 ?         ; < Vrm Low Power Threshold.
2156   SlewRate                      UINT32 ?         ; < Vrm Slew Rate.
2157   AdditionalDelay               UINT32 ?         ; < Vrm Additional Delay.
2158   HiSpeedEnable                 BOOLEAN ?        ; < Select high speed VRM.
2159   InrushCurrentLimit            UINT32 ?         ; < Vrm Inrush Current Limit.
2160 PLATFORM_VRM_CONFIGURATION   ENDS
2161
2162 ;   The VRM types to characterize.
2163   CoreVrm                        EQU  0           ; < VDD plane.
2164   NbVrm                          EQU  1           ; < VDDNB plane.
2165   MaxVrmType                     EQU  2           ; < Not a valid VRM type, use for limit checking.
2166 PLATFORM_VRM_TYPE  TEXTEQU  <DWORD>
2167
2168 ; FCH Platform Configuration Policy
2169 FCH_PLATFORM_POLICY     STRUCT
2170   CfgSmbus0BaseAddress          UINT16  ?       ; SMBUS0 Controller Base Address
2171   CfgSmbus1BaseAddress          UINT16  ?       ; SMBUS1 Controller Base Address
2172   CfgSioPmeBaseAddress          UINT16  ?       ; I/O base address for LPC I/O target range
2173   CfgAcpiPm1EvtBlkAddr          UINT16  ?       ; I/O base address of ACPI power management Event Block
2174   CfgAcpiPm1CntBlkAddr          UINT16  ?       ; I/O base address of ACPI power management Control Block
2175   CfgAcpiPmTmrBlkAddr           UINT16  ?       ; I/O base address of ACPI power management Timer Block
2176   CfgCpuControlBlkAddr          UINT16  ?       ; I/O base address of ACPI power management CPU Control Block
2177   CfgAcpiGpe0BlkAddr            UINT16  ?       ; I/O base address of ACPI power management General Purpose Event Block
2178   CfgSmiCmdPortAddr             UINT16  ?       ; I/O base address of ACPI SMI Command Block
2179   CfgAcpiPmaCntBlkAddr          UINT16  ?       ; I/O base address of ACPI power management additional control block
2180   CfgGecShadowRomBase           UINT32  ?       ; 32-bit base address to the GEC shadow ROM
2181   CfgWatchDogTimerBase          UINT32  ?       ; Watchdog Timer base address
2182   CfgSpiRomBaseAddress          UINT32  ?       ; Base address for the SPI ROM controller
2183   CfgHpetBaseAddress            UINT32  ?       ; HPET MMIO base address
2184   CfgAzaliaSsid                 UINT32  ?       ; Subsystem ID of HD Audio controller
2185   CfgSmbusSsid                  UINT32  ?       ; Subsystem ID of SMBUS controller
2186   CfgIdeSsid                    UINT32  ?       ; Subsystem ID of IDE controller
2187   CfgSataAhciSsid               UINT32  ?       ; Subsystem ID of SATA controller in AHCI mode
2188   CfgSataIdeSsid                UINT32  ?       ; Subsystem ID of SATA controller in IDE mode
2189   CfgSataRaid5Ssid              UINT32  ?       ; Subsystem ID of SATA controller in RAID5 mode
2190   CfgSataRaidSsid               UINT32  ?       ; Subsystem ID of SATA controller in RAID mode
2191   CfgEhciSsid                   UINT32  ?       ; Subsystem ID of EHCI
2192   CfgOhciSsid                   UINT32  ?       ; Subsystem ID of OHCI
2193   CfgLpcSsid                    UINT32  ?       ; Subsystem ID of LPC ISA Bridge
2194   CfgSdSsid                     UINT32  ?       ; Subsystem ID of SecureDigital controller
2195   CfgXhciSsid                   UINT32  ?       ; Subsystem ID of XHCI
2196   CfgFchPort80BehindPcib        BOOLEAN ?       ; Is port80 cycle going to the PCI bridge
2197   CfgFchEnableAcpiSleepTrap     BOOLEAN ?       ; ACPI sleep SMI enable/disable
2198   CfgFchGppLinkConfig           GPP_LINKMODE ?  ; FCH GPP link configuration
2199   CfgFchGppPort0Present         BOOLEAN ?       ; Is FCH GPP port 0 present
2200   CfgFchGppPort1Present         BOOLEAN ?       ; Is FCH GPP port 1 present
2201   CfgFchGppPort2Present         BOOLEAN ?       ; Is FCH GPP port 2 present
2202   CfgFchGppPort3Present         BOOLEAN ?       ; Is FCH GPP port 3 present
2203   CfgFchGppPort0HotPlug         BOOLEAN ?       ; Is FCH GPP port 0 hotplug capable
2204   CfgFchGppPort1HotPlug         BOOLEAN ?       ; Is FCH GPP port 1 hotplug capable
2205   CfgFchGppPort2HotPlug         BOOLEAN ?       ; Is FCH GPP port 2 hotplug capable
2206   CfgFchGppPort3HotPlug         BOOLEAN ?       ; Is FCH GPP port 3 hotplug capable
2207
2208   CfgFchEsataPortBitMap         UINT8 ?         ; ESATA Port definition, eg: [0]=1, means port 0 is ESATA capable
2209   CfgFchIrPinControl            UINT8 ?         ; Register bitfield describing Infrared Pin Control:
2210   CfgFchSdClockControl       SD_CLOCK_CONTROL ? ; FCH SD Clock Control
2211   CfgFchSciMapControl           POINTER ?       ; FCH SCI Mapping Control
2212   CfgFchSataPhyControl          POINTER ?       ; FCH SATA PHY Control
2213   CfgFchGpioControl             POINTER ?       ; FCH GPIO Control
2214 FCH_PLATFORM_POLICY     ENDS
2215
2216
2217 ; Build Option/Configuration Boolean Structure
2218 BUILD_OPT_CFG    STRUCT
2219   ; Build Option Area
2220   VersionString                 AMD_CODE_HEADER {} ; < AMD embedded code version string
2221   OptionUDimms                  BOOLEAN ?       ; < UDIMMS
2222   OptionRDimms                  BOOLEAN ?       ; < RDIMMS
2223   OptionLrDimms                 BOOLEAN ?       ; < LRDIMMS
2224   OptionEcc                     BOOLEAN ?       ; < ECC
2225   OptionBankInterleave          BOOLEAN ?       ; < BANK_INTERLEAVE
2226   OptionDctInterleave           BOOLEAN ?       ; < DCT_INTERLEAVE
2227   OptionNodeInterleave          BOOLEAN ?       ; < NODE_INTERLEAVE
2228   OptionParallelTraining        BOOLEAN ?       ; < PARALLEL_TRAINING
2229   OptionOnlineSpare             BOOLEAN ?       ; < ONLINE_SPARE
2230   OptionMemRestore              BOOLEAN ?       ; < MEM CONTEXT RESTORE
2231   OptionMultisocket             BOOLEAN ?       ; < MULTISOCKET
2232   OptionAcpiPstates             BOOLEAN ?       ; < ACPI_PSTATES
2233   OptionPStatesInHpcMode        BOOLEAN ?       ; < PSTATES_HPC_MODE
2234   OptionSrat                    BOOLEAN ?       ; < SRAT
2235   OptionSlit                    BOOLEAN ?       ; < SLIT
2236   OptionWhea                    BOOLEAN ?       ; < WHEA
2237   OptionDmi                     BOOLEAN ?       ; < DMI
2238   OptionEarlySamples            BOOLEAN ?       ; < EARLY_SAMPLES
2239   OptionAddrToCsTranslator      BOOLEAN ?       ; < ADDR_TO_CS_TRANSLATOR
2240
2241   ; Build Configuration Area
2242   CfgPciMmioAddress             UINT64 ?        ; < PciMmioBase
2243   CfgPciMmioSize                UINT32 ?        ; < PciMmioSize
2244   CfgPlatVrmCfg                 PLATFORM_VRM_CONFIGURATION (MaxVrmType) DUP ({})  ; < Several configuration settings for the voltage regulator modules.
2245   CfgPlatNumIoApics             UINT32 ?        ; < PlatformApicIoNumber
2246   CfgMemInitPstate              UINT32 ?        ; < MemoryInitPstate
2247   CfgPlatformC1eMode            PLATFORM_C1E_MODES ?  ; < PlatformC1eMode
2248   CfgPlatformC1eOpData          UINT32 ?        ; < PlatformC1eOpData
2249   CfgPlatformC1eOpData1         UINT32 ?        ; < PlatformC1eOpData1
2250   CfgPlatformC1eOpData2         UINT32 ?        ; < PlatformC1eOpData2
2251   CfgPlatformC1eOpData3         UINT32 ?        ; < PlatformC1eOpData3
2252   CfgPlatformCStateMode         PLATFORM_CSTATE_MODES ?  ; < PlatformCStateMode
2253   CfgPlatformCStateOpData       UINT32 ?        ; < PlatformCStateOpData
2254   CfgPlatformCStateIoBaseAddress UINT16 ?       ; < PlatformCStateIoBaseAddress
2255   CfgPlatformCpbMode            PLATFORM_CPB_MODES ?  ; < PlatformCpbMode
2256   CfgLowPowerPstateForProcHot   PLATFORM_LOW_POWER_PSTATE_MODES ?  ; < Low power Pstate for PROCHOT mode
2257   CfgCoreLevelingMode           UINT32 ?        ; < CoreLevelingCofig
2258   CfgPerformanceProfile         PERFORMANCE_PROFILE  {}  ; < The platform's control flow mode and platform performance settings.
2259   CfgPlatformDeemphasisList     POINTER  ?      ; < HT Deemphasis
2260   CfgAmdPlatformType            UINT32 ?        ; < AmdPlatformType
2261   CfgAmdPstateCapValue          UINT32 ?        ; < Amd pstate ceiling enabling deck
2262
2263   CfgMemoryBusFrequencyLimit    MEMORY_BUS_SPEED ?      ; < Memory Bus Frequency Limit
2264   CfgMemoryModeUnganged         BOOLEAN ?       ; < Memory Mode Unganged
2265   CfgMemoryQuadRankCapable      BOOLEAN ?       ; < Memory Quad Rank Capable
2266   CfgMemoryQuadrankType         QUANDRANK_TYPE ?        ; < Memory Quadrank Type
2267   CfgMemoryRDimmCapable         BOOLEAN ?       ; < Memory RDIMM Capable
2268   CfgMemoryLRDimmCapable         BOOLEAN ?       ; < Memory LRDIMM Capable
2269   CfgMemoryUDimmCapable         BOOLEAN ?       ; < Memory UDIMM Capable
2270   CfgMemorySODimmCapable        BOOLEAN ?       ; < Memory SODimm Capable
2271   CfgLimitMemoryToBelow1Tb      BOOLEAN ?       ; < Limit memory address space to below 1TB
2272   CfgMemoryEnableBankInterleaving       BOOLEAN ?       ; < Memory Enable Bank Interleaving
2273   CfgMemoryEnableNodeInterleaving       BOOLEAN ?       ; < Memory Enable Node Interleaving
2274   CfgMemoryChannelInterleaving  BOOLEAN ?       ; < Memory Channel Interleaving
2275   CfgMemoryPowerDown            BOOLEAN ?       ; < Memory Power Down
2276   CfgPowerDownMode              POWER_DOWN_MODE ?       ; < Power Down Mode
2277   CfgOnlineSpare                BOOLEAN ?       ; < Online Spare
2278   CfgMemoryParityEnable         BOOLEAN ?       ; < Memory Parity Enable
2279   CfgBankSwizzle                BOOLEAN ?       ; < Bank Swizzle
2280   CfgTimingModeSelect           USER_MEMORY_TIMING_MODE ?       ; < Timing Mode Select
2281   CfgMemoryClockSelect          MEMORY_BUS_SPEED ?      ; < Memory Clock Select
2282   CfgDqsTrainingControl         BOOLEAN ?       ; < Dqs Training Control
2283   CfgIgnoreSpdChecksum          BOOLEAN ?       ; < Ignore Spd Checksum
2284   CfgUseBurstMode               BOOLEAN ?       ; < Use Burst Mode
2285   CfgMemoryAllClocksOn          BOOLEAN ?       ; < Memory All Clocks On
2286   CfgEnableEccFeature           BOOLEAN ?       ; < Enable ECC Feature
2287   CfgEccRedirection             BOOLEAN ?       ; < ECC Redirection
2288   CfgScrubDramRate              UINT16 ?        ; < Scrub Dram Rate
2289   CfgScrubL2Rate                UINT16 ?        ; < Scrub L2Rate
2290   CfgScrubL3Rate                UINT16 ?        ; < Scrub L3Rate
2291   CfgScrubIcRate                UINT16 ?        ; < Scrub Ic Rate
2292   CfgScrubDcRate                UINT16 ?        ; < Scrub Dc Rate
2293   CfgEccSyncFlood               BOOLEAN ?       ; < ECC Sync Flood
2294   CfgEccSymbolSize              UINT16 ?        ; < ECC Symbol Size
2295   CfgHeapDramAddress            UINT64 ?        ; < Heap contents will be temporarily stored in this address during the transition
2296   CfgNodeMem1GBAlign            BOOLEAN ?       ; < Node Mem 1GB boundary Alignment
2297   CfgS3LateRestore              BOOLEAN ?       ; < S3 Late Restore
2298   CfgAcpiPstateIndependent      BOOLEAN ?       ; < PSD method dependent/Independent
2299   CfgApMtrrSettingsList         POINTER ?       ; < The AP's MTRR settings before final halt
2300   CfgUmaMode                    UMA_MODE ?      ; < Uma Mode
2301   CfgUmaSize                    UINT32 ?        ; < Uma Size [31:0]=Addr[47:16]
2302   CfgUmaAbove4G                 BOOLEAN ?       ; < Uma Above 4G Support
2303   CfgUmaAlignment               UMA_ALIGNMENT ? ; < Uma alignment
2304   CfgProcessorScopeInSb         BOOLEAN ?       ; < ACPI Processor Object in \_SB scope
2305   CfgProcessorScopeName0        CHAR8 ?         ; < OEM specific 1st character of processor scope name.
2306   CfgProcessorScopeName1        CHAR8 ?         ; < OEM specific 2nd character of processor scope name.
2307   CfgGnbHdAudio                 UINT8 ?         ; < Gnb HD Audio Enable
2308   CfgAbmSupport                 UINT8 ?         ; < ABM support
2309   CfgDynamicRefreshRate         UINT8 ?         ; < Dynamic refresh rate
2310   CfgLcdBackLightControl        UINT16 ?        ; < Lcd back light control
2311   CfgGnb3dStereoPinIndex        UINT8 ?         ; < 3D Stereo Pin ID
2312   CfgTempPcieMmioBaseAddress    UINT32 ?        ; < Temp pcie MMIO base address
2313   CfgGnbIGPUSSID                UINT32 ?        ; < Gnb internal GPU SSID
2314   CfgGnbHDAudioSSID             UINT32 ?        ; < Gnb HD Audio SSID
2315   CfgGnbPcieSSID                UINT32 ?        ; < Gnb PCIe SSID
2316   CfgLvdsSpreadSpectrum         UINT16  ?       ; < Lvds Spread Spectrum. Build-time customizable only
2317   CfgLvdsSpreadSpectrumRate     UINT16  ?       ; < Lvds Spread Spectrum Rate. Build-time customizable only
2318   FchBldCfg                     POINTER ?       ; < FCH platform build configuration policy
2319   CfgIommuSupport               BOOLEAN ?       ; IOMMU support
2320   CfgLvdsPowerOnSeqDigonToDe    UINT8   ?       ; Panel initialization timing
2321   CfgLvdsPowerOnSeqDeToVaryBl   UINT8   ?       ; Panel initialization timing
2322   CfgLvdsPowerOnSeqDeToDigon    UINT8   ?       ; Panel initialization timing
2323   CfgLvdsPowerOnSeqVaryBlToDe   UINT8   ?       ; Panel initialization timing
2324   CfgLvdsPowerOnSeqOnToOffDelay UINT8   ?       ; Panel initialization timing
2325   CfgLvdsPowerOnSeqVaryBlToBlon UINT8   ?       ; Panel initialization timing
2326   CfgLvdsPowerOnSeqBlonToVaryBl UINT8   ?       ; Panel initialization timing
2327   CfgLvdsMaxPixelClockFreq      UINT16  ?       ; The maximum pixel clock frequency supported
2328   CfgLcdBitDepthControlValue    UINT32  ?       ; The LCD bit depth control settings
2329   CfgLvds24bbpPanelMode         UINT8   ?       ; The LVDS 24 BBP mode
2330   CfgLvdsMiscControl            LVDS_MISC_CONTROL   {}; THe LVDS Misc control
2331   CfgPcieRefClkSpreadSpectrum   UINT16  ?       ; PCIe Reference Clock Spread Spectrum
2332   CfgExternalVrefCtlFeature     BOOLEAN ?       ; External Vref control
2333   CfgForceTrainMode             FORCE_TRAIN_MODE ?      ; < Force Train Mode
2334   CfgGnbRemoteDisplaySupport    BOOLEAN ?       ; Wireless Display Support
2335   CfgIvrsExclusionRangeList     POINTER ?       ; IOMMU Exclusion Range List
2336   Reserved                      BOOLEAN ?       ; < reserved...
2337 BUILD_OPT_CFG    ENDS
2338
2339   ; A structure containing platform specific operational characteristics. This
2340   ; structure is initially populated by the initializer with a copy of the same
2341   ; structure that was created at build time using the build configuration controls.
2342 PLATFORM_CONFIGURATION    STRUCT
2343   PlatformProfile               PERFORMANCE_PROFILE {}          ; < Several configuration settings for the processor.
2344   PlatformDeemphasisList        POINTER ?       ; < Deemphasis levels for the platform's HT links.
2345   CoreLevelingMode              UINT8 ?         ; < Indicates how to balance the number of cores per processor.
2346   C1eMode                       PLATFORM_C1E_MODES ? ; < Specifies the method of C1e enablement - Disabled, HW, or message based.
2347   C1ePlatformData               UINT32 ?        ; < If C1eMode is HW, specifies the P_LVL3 I/O port of the platform.
2348   C1ePlatformData1              UINT32 ?        ; < If C1eMode is SW, specifies the address of chipset's SMI command port.
2349   C1ePlatformData2              UINT32 ?        ; < If C1eMode is SW, specifies the unique number used by the SMI handler to identify SMI source.
2350   C1ePlatformData3              UINT32 ?        ; < If C1eMode is Auto, specifies the P_LVL3 I/O port of the platform for HW C1e
2351   CStateMode                    PLATFORM_CSTATE_MODES ? ; < Specifies the method of C-State enablement - Disabled, or C6.
2352   CStatePlatformData            UINT32 ?        ; < This element specifies some pertinent data needed for the operation of the Cstate feature
2353                                                 ; < If CStateMode is CStateModeC6, this item is reserved
2354   CStateIoBaseAddress           UINT16 ?        ; < This item specifies a free block of 8 consecutive bytes of I/O ports that
2355                                                 ; < can be used to allow the CPU to enter Cstates.
2356   CpbMode                       PLATFORM_CPB_MODES ? ; < Specifies the method of core performance boost enablement - Disabled, or Auto.
2357   UserOptionDmi                 BOOLEAN ?       ; < When set to TRUE, the DMI data table is generated.
2358   UserOptionPState              BOOLEAN ?       ; < When set to TRUE, the PState data tables are generated.
2359   UserOptionSrat                BOOLEAN ?       ; < When set to TRUE, the SRAT data table is generated.
2360   UserOptionSlit                BOOLEAN ?       ; < When set to TRUE, the SLIT data table is generated.
2361   UserOptionWhea                BOOLEAN ?       ; < When set to TRUE, the WHEA data table is generated.
2362   LowPowerPstateForProcHot      PLATFORM_LOW_POWER_PSTATE_MODES ? ; < Specifies the method of low power Pstate for PROCHOT enablement - Disabled, or Auto.
2363   PowerCeiling                  UINT32 ?        ; < P-State Ceiling Enabling Deck - Max power milli-watts.
2364   ForcePstateIndependent        BOOLEAN ?       ; < P-State _PSD independence or dependence.
2365   PStatesInHpcMode              BOOLEAN ?       ; < High performance computing (HPC) mode
2366   NumberOfIoApics               UINT32 ?        ; < Number of I/O APICs in the system
2367   VrmProperties                 PLATFORM_VRM_CONFIGURATION (MaxVrmType) DUP ({})  ; < Several configuration settings for the voltage regulator modules.
2368   ProcessorScopeInSb            BOOLEAN ?       ; < ACPI Processor Object in \_SB scope
2369   ProcessorScopeName0           CHAR8 ?         ; < OEM specific 1st character of processor scope name.
2370   ProcessorScopeName1           CHAR8 ?         ; < OEM specific 2nd character of processor scope name.
2371   GnbHdAudio                    UINT8 ?         ; < Control GFX HD Audio controller(Used for HDMI and DP display output),
2372                                                 ; < essentially it enables function 1 of graphics device.
2373                                                 ; < @li 0 = HD Audio disable
2374                                                 ; < @li 1 = HD Audio enable
2375   AbmSupport                    UINT8 ?         ; < Automatic adjust LVDS/eDP Back light level support.It is
2376                                                 ; < characteristic specific to display panel which used by platform design.
2377                                                 ; < @li 0 = ABM support disabled
2378                                                 ; < @li 1 = ABM support enabled
2379   DynamicRefreshRate            UINT8 ?         ; < Adjust refresh rate on LVDS/eDP.
2380   LcdBackLightControl           UINT16 ?        ; < The PWM frequency to LCD backlight control.
2381                                                 ; < If equal to 0 backlight not controlled by iGPU.
2382 PLATFORM_CONFIGURATION    ENDS
2383
2384
2385 ; *********************************************************************
2386 ; * Structures for: AmdInitLate
2387 ; *********************************************************************
2388     PROC_VERSION_LENGTH         EQU    48
2389     MAX_DIMMS_PER_SOCKET        EQU    16
2390
2391
2392   ; Interface Parameter Structures
2393  ; DMI Type4 - Processor ID
2394 TYPE4_PROC_ID    STRUCT
2395   ProcIdLsd                     UINT32 ?        ; < Lower half of 64b ID
2396   ProcIdMsd                     UINT32 ?        ; < Upper half of 64b ID
2397 TYPE4_PROC_ID    ENDS
2398
2399  ; DMI Type 4 - Processor information
2400 TYPE4_DMI_INFO    STRUCT
2401   T4ProcType                    UINT8 ?         ; < CPU Type
2402   T4ProcFamily                  UINT8 ?         ; < Family 1
2403   T4ProcId                      TYPE4_PROC_ID {}        ; < Id
2404   T4Voltage                     UINT8 ?         ; < Voltage
2405   T4ExternalClock               UINT16 ?        ; < External clock
2406   T4MaxSpeed                    UINT16 ?        ; < Max speed
2407   T4CurrentSpeed                UINT16 ?        ; < Current speed
2408   T4Status                      UINT8 ?         ; < Status
2409   T4ProcUpgrade                 UINT8 ?         ; < Up grade
2410   T4CoreCount                   UINT8 ?         ; < Core count
2411   T4CoreEnabled                 UINT8 ?         ; < Core Enable
2412   T4ThreadCount                 UINT8 ?         ; < Thread count
2413   T4ProcCharacteristics         UINT16 ?        ; < Characteristics
2414   T4ProcFamily2                 UINT16 ?        ; < Family 2
2415   T4ProcVersion                 CHAR8 (PROC_VERSION_LENGTH) DUP (?)     ; < Cpu version
2416 TYPE4_DMI_INFO    ENDS
2417
2418  ; DMI Type 7 - Cache information
2419 TYPE7_DMI_INFO    STRUCT
2420   T7CacheCfg                    UINT16 ?        ; < Cache cfg
2421   T7MaxCacheSize                UINT16 ?        ; < Max size
2422   T7InstallSize                 UINT16 ?        ; < Install size
2423   T7SupportedSramType           UINT16 ?        ; < Supported Sram Type
2424   T7CurrentSramType             UINT16 ?        ; < Current type
2425   T7CacheSpeed                  UINT8 ?         ; < Speed
2426   T7ErrorCorrectionType         UINT8 ?         ; < ECC type
2427   T7SystemCacheType             UINT8 ?         ; < Cache type
2428   T7Associativity               UINT8 ?         ; < Associativity
2429 TYPE7_DMI_INFO    ENDS
2430
2431  ; DMI Type 16 offset 04h - Location
2432
2433   OtherLocation         EQU    01h      ; < Assign 01 to Other
2434   UnknownLocation       EQU    2        ; < Assign 02 to Unknown
2435   SystemboardOrMotherboard      EQU    3        ; < Assign 03 to systemboard or motherboard
2436   IsaAddonCard          EQU    4        ; < Assign 04 to ISA add-on card
2437   EisaAddonCard         EQU    5        ; < Assign 05 to EISA add-on card
2438   PciAddonCard          EQU    6        ; < Assign 06 to PCI add-on card
2439   McaAddonCard          EQU    7        ; < Assign 07 to MCA add-on card
2440   PcmciaAddonCard       EQU    8        ; < Assign 08 to PCMCIA add-on card
2441   ProprietaryAddonCard  EQU    9        ; < Assign 09 to proprietary add-on card
2442   NuBus                 EQU    10       ; < Assign 0A to NuBus
2443   Pc98C20AddonCard      EQU    11       ; < Assign 0A0 to PC-98/C20 add-on card
2444   Pc98C24AddonCard      EQU    12       ; < Assign 0A1 to PC-98/C24 add-on card
2445   Pc98EAddoncard        EQU    13       ; < Assign 0A2 to PC-98/E add-on card
2446   Pc98LocalBusAddonCard EQU    14       ; < Assign 0A3 to PC-98/Local bus add-on card
2447 DMI_T16_LOCATION  TEXTEQU  <DWORD> ;} DMI_T16_LOCATION;
2448
2449  ; DMI Type 16 offset 05h - Memory Error Correction
2450
2451   OtherUse              EQU    01h      ; < Assign 01 to Other
2452   UnknownUse            EQU    2        ; < Assign 02 to Unknown
2453   SystemMemory          EQU    3        ; < Assign 03 to system memory
2454   VideoMemory           EQU    4        ; < Assign 04 to video memory
2455   FlashMemory           EQU    5        ; < Assign 05 to flash memory
2456   NonvolatileRam        EQU    6        ; < Assign 06 to non-volatile RAM
2457   CacheMemory           EQU    7        ; < Assign 07 to cache memory
2458 DMI_T16_USE  TEXTEQU  <DWORD> ;} DMI_T16_USE;
2459
2460  ; DMI Type 16 offset 07h - Maximum Capacity
2461
2462   Dmi16OtherErrCorrection    EQU    01h ; < Assign 01 to Other
2463   Dmi16UnknownErrCorrection  EQU    2   ; < Assign 02 to Unknown
2464   Dmi16NoneErrCorrection     EQU    3   ; < Assign 03 to None
2465   Dmi16Parity                EQU    4   ; < Assign 04 to parity
2466   Dmi16SingleBitEcc          EQU    5   ; < Assign 05 to Single-bit ECC
2467   Dmi16MultiBitEcc           EQU    6   ; < Assign 06 to Multi-bit ECC
2468   Dmi16Crc                   EQU    7   ; < Assign 07 to CRC
2469 DMI_T16_ERROR_CORRECTION  TEXTEQU  <DWORD> ;} DMI_T16_ERROR_CORRECTION;
2470
2471  ; DMI Type 16 - Physical Memory Array
2472 TYPE16_DMI_INFO    STRUCT
2473   Location                      DMI_T16_LOCATION ?      ; < The physical location of the Memory Array,
2474                                                         ; < whether on the system board or an add-in board.
2475   Use                           DMI_T16_USE ?           ; < Identifies the function for which the array
2476                                                         ; < is used.
2477   MemoryErrorCorrection         DMI_T16_ERROR_CORRECTION ?      ; < The primary hardware error correction or
2478                                                         ; < detection method supported by this memory array.
2479   MaximumCapacity               UINT32 ?        ; < The maximum memory capacity, in kilobytes,
2480                                                         ; < for the array.
2481   NumberOfMemoryDevices         UINT16 ?        ; < The number of slots or sockets available
2482                                                         ; < for memory devices in this array.
2483   ExtMaxCapacity                UINT64 ?                ; < The maximum memory capacity, in bytes,
2484                                                         ; < for this array.
2485 TYPE16_DMI_INFO    ENDS
2486
2487  ; DMI Type 17 offset 0Eh - Form Factor
2488   OtherFormFactor       EQU    01h      ; < Assign 01 to Other
2489   UnknowFormFactor      EQU    2        ; < Assign 02 to Unknown
2490   SimmFormFactor        EQU    3        ; < Assign 03 to SIMM
2491   SipFormFactor         EQU    4        ; < Assign 04 to SIP
2492   ChipFormFactor        EQU    5        ; < Assign 05 to Chip
2493   DipFormFactor         EQU    6        ; < Assign 06 to DIP
2494   ZipFormFactor         EQU    7        ; < Assign 07 to ZIP
2495   ProprietaryCardFormFactor     EQU    8        ; < Assign 08 to Proprietary Card
2496   DimmFormFactorFormFactor      EQU    9        ; < Assign 09 to DIMM
2497   TsopFormFactor        EQU    10       ; < Assign 10 to TSOP
2498   RowOfChipsFormFactor  EQU    11       ; < Assign 11 to Row of chips
2499   RimmFormFactor        EQU    12       ; < Assign 12 to RIMM
2500   SodimmFormFactor      EQU    13       ; < Assign 13 to SODIMM
2501   SrimmFormFactor       EQU    14       ; < Assign 14 to SRIMM
2502   FbDimmFormFactor      EQU    15       ; < Assign 15 to FB-DIMM
2503 DMI_T17_FORM_FACTOR  TEXTEQU  <DWORD>
2504
2505  ; DMI Type 17 offset 12h - Memory Type
2506   OtherMemType          EQU    01h      ; < Assign 01 to Other
2507   UnknownMemType        EQU    2        ; < Assign 02 to Unknown
2508   DramMemType           EQU    3        ; < Assign 03 to DRAM
2509   EdramMemType          EQU    4        ; < Assign 04 to EDRAM
2510   VramMemType           EQU    5        ; < Assign 05 to VRAM
2511   SramMemType           EQU    6        ; < Assign 06 to SRAM
2512   RamMemType            EQU    7        ; < Assign 07 to RAM
2513   RomMemType            EQU    8        ; < Assign 08 to ROM
2514   FlashMemType          EQU    9        ; < Assign 09 to Flash
2515   EepromMemType         EQU    10       ; < Assign 10 to EEPROM
2516   FepromMemType         EQU    11       ; < Assign 11 to FEPROM
2517   EpromMemType          EQU    12       ; < Assign 12 to EPROM
2518   CdramMemType          EQU    13       ; < Assign 13 to CDRAM
2519   ThreeDramMemType      EQU    14       ; < Assign 14 to 3DRAM
2520   SdramMemType          EQU    15       ; < Assign 15 to SDRAM
2521   SgramMemType          EQU    16       ; < Assign 16 to SGRAM
2522   RdramMemType          EQU    17       ; < Assign 17 to RDRAM
2523   DdrMemType            EQU    18       ; < Assign 18 to DDR
2524   Ddr2MemType           EQU    19       ; < Assign 19 to DDR2
2525   Ddr2FbdimmMemType     EQU    20       ; < Assign 20 to DDR2 FB-DIMM
2526   Ddr3MemType           EQU    24       ; < Assign 24 to DDR3
2527   Fbd2MemType           EQU    25       ; < Assign 25 to FBD2
2528 DMI_T17_MEMORY_TYPE  TEXTEQU  <DWORD>
2529
2530  ; DMI Type 17 offset 13h - Type Detail
2531 DMI_T17_TYPE_DETAIL    STRUCT
2532   Reserved1                     UINT16 ?
2533 ;   OUT UINT16                    Reserved1:1;                  ; < Reserved
2534 ;   OUT UINT16                    Other:1;                      ; < Other
2535 ;   OUT UINT16                    Unknown:1;                    ; < Unknown
2536 ;   OUT UINT16                    FastPaged:1;                  ; < Fast-Paged
2537 ;   OUT UINT16                    StaticColumn:1;               ; < Static column
2538 ;   OUT UINT16                    PseudoStatic:1;               ; < Pseudo-static
2539 ;   OUT UINT16                    Rambus:1;                     ; < RAMBUS
2540 ;   OUT UINT16                    Synchronous:1;                ; < Synchronous
2541 ;   OUT UINT16                    Cmos:1;                       ; < CMOS
2542 ;   OUT UINT16                    Edo:1;                        ; < EDO
2543 ;   OUT UINT16                    WindowDram:1;                 ; < Window DRAM
2544 ;   OUT UINT16                    CacheDram:1;                  ; < Cache Dram
2545 ;   OUT UINT16                    NonVolatile:1;                ; < Non-volatile
2546 ;   OUT UINT16                    Reserved2:3;                  ; < Reserved
2547 DMI_T17_TYPE_DETAIL    ENDS
2548
2549  ; DMI Type 17 - Memory Device
2550 TYPE17_DMI_INFO    STRUCT
2551   TotalWidth                    UINT16 ?        ; < Total Width, in bits, of this memory device, including any check or error-correction bits.
2552   DataWidth                     UINT16 ?        ; < Data Width, in bits, of this memory device.
2553   MemorySize                    UINT16 ?        ; < The size of the memory device.
2554   FormFactor                    DMI_T17_FORM_FACTOR ?           ; < The implementation form factor for this memory device.
2555   DeviceSet                     UINT8 ?         ; < Identifies when the Memory Device is one of a set of
2556                                                         ; < Memory Devices that must be populated with all devices of
2557                                                         ; < the same type and size, and the set to which this device belongs.
2558   DeviceLocator                 CHAR8 (8) DUP (?)       ; < The string number of the string that identifies the physically labeled socket or board position where the memory device is located.
2559   BankLocator                   CHAR8 (10) DUP (?)      ; < The string number of the string that identifies the physically labeled bank where the memory device is located.
2560   MemoryType                    DMI_T17_MEMORY_TYPE ?           ; < The type of memory used in this device.
2561   TypeDetail                    DMI_T17_TYPE_DETAIL {}          ; < Additional detail on the memory device type
2562   Speed                         UINT16 ?                ; < Identifies the speed of the device, in megahertz (MHz).
2563   ManufacturerIdCode            UINT64 ?                ; < Manufacturer ID code.
2564   SerialNumber                  CHAR8 (9) DUP (?)       ; < Serial Number.
2565   PartNumber                    CHAR8 (19) DUP (?)      ; < Part Number.
2566   Attributes                    UINT8 ?                 ; < Bits 7-4: Reserved, Bits 3-0: rank.
2567   ExtSize                       UINT32 ?                ; < Extended Size.
2568   ConfigSpeed                   UINT16 ?        ; < Configured memory clock speed
2569 TYPE17_DMI_INFO    ENDS
2570
2571  ; Memory DMI Type 17 and 20 - for memory use
2572 MEM_DMI_INFO    STRUCT
2573   TotalWidth                    UINT16 ?              ; < Total Width, in bits, of this memory device, including any check or error-correction bits.
2574   DataWidth                     UINT16 ?              ; < Data Width, in bits, of this memory device.
2575   MemorySize                    UINT16 ?              ; < The size of the memory device.
2576   FormFactor                    DMI_T17_FORM_FACTOR ? ; < The implementation form factor for this memory device.
2577   DeviceLocator                 UINT8 ?               ; < The string number of the string that identifies the physically labeled socket or board position where the memory device is located.
2578   BankLocator                   UINT8 ?               ; < The string number of the string that identifies the physically labeled bank where the memory device is located.
2579   Speed                         UINT16 ?              ; < Identifies the speed of the device, in megahertz (MHz).
2580   ManufacturerIdCode            UINT64 ?              ; < Manufacturer ID code.
2581   SerialNumber                  UINT8 (4) DUP (?)     ; < Serial Number.
2582   PartNumber                    UINT8 (18) DUP (?)    ; < Part Number.
2583   Attributes                    UINT8 ?               ; < Bits 7-4: Reserved, Bits 3-0: rank.
2584   ExtSize                       UINT32 ?              ; < Extended Size.
2585   Socket                        UINT8 ?
2586 ; OUT UINT8                     Socket:3              ; < Socket ID
2587 ; OUT UINT8                     Channel:2             ; < Channel ID
2588 ; OUT UINT8                     Dimm:2                ; < DIMM ID
2589 ; OUT UINT8                     DimmPresent:1         ; < Dimm Present
2590   StartingAddr                  UINT32 ?              ; < The physical address, in kilobytes, of a range
2591                                                       ; < of memory mapped to the referenced Memory Device.
2592   EndingAddr                    UINT32 ?              ; < The handle, or instance number, associated with
2593                                                       ; < the Memory Device structure to which this address
2594                                                       ; < range is mapped.
2595   ConfigSpeed                   UINT16 ?              ; < Configured memory clock speed
2596   ExtStartingAddr               UINT64 ?              ; < The physical address, in bytes, of a range of
2597                                                       ; < memory mapped to the referenced Memory Device.
2598   ExtEndingAddr                 UINT64 ?              ; < The physical ending address, in bytes, of the last of
2599                                                       ; < a range of addresses mapped to the referenced Memory Device.
2600 MEM_DMI_INFO    ENDS
2601
2602  ; DMI Type 19 - Memory Array Mapped Address
2603 TYPE19_DMI_INFO    STRUCT
2604   StartingAddr                  UINT32 ?        ; < The physical address, in kilobytes,
2605                                                         ; < of a range of memory mapped to the
2606                                                         ; < specified physical memory array.
2607   EndingAddr                    UINT32 ?        ; < The physical ending address of the
2608                                                         ; < last kilobyte of a range of addresses
2609                                                         ; < mapped to the specified physical memory array.
2610   MemoryArrayHandle             UINT16 ?        ; < The handle, or instance number, associated
2611                                                         ; < with the physical memory array to which this
2612                                                         ; < address range is mapped.
2613   PartitionWidth                UINT8 ?         ; < Identifies the number of memory devices that
2614                                                         ; < form a single row of memory for the address
2615                                                         ; < partition defined by this structure.
2616   ExtStartingAddr               UINT64 ?              ; < The physical address, in bytes, of a range of
2617                                                       ; < memory mapped to the specified Physical Memory Array.
2618   ExtEndingAddr                 UINT64 ?              ; < The physical address, in bytes, of a range of
2619                                                       ; < memory mapped to the specified Physical Memory Array.
2620 TYPE19_DMI_INFO    ENDS
2621
2622 ; DMI Type 20 - Memory Device Mapped Address
2623 TYPE20_DMI_INFO    STRUCT
2624   StartingAddr                  UINT32 ?        ; < The physical address, in kilobytes, of a range
2625                                                         ; < of memory mapped to the referenced Memory Device.
2626   EndingAddr                    UINT32 ?        ; < The handle, or instance number, associated with
2627                                                         ; < the Memory Device structure to which this address
2628                                                         ; < range is mapped.
2629   MemoryDeviceHandle            UINT16 ?        ; < The handle, or instance number, associated with
2630                                                         ; < the Memory Device structure to which this address
2631                                                         ; < range is mapped.
2632   MemoryArrayMappedAddressHandle        UINT16 ?        ; < The handle, or instance number, associated
2633                                                         ; < with the Memory Array Mapped Address structure to
2634                                                         ; < which this device address range is mapped.
2635   PartitionRowPosition          UINT8 ?         ; < Identifies the position of the referenced Memory
2636                                                         ; < Device in a row of the address partition.
2637   InterleavePosition            UINT8 ?         ; < The position of the referenced Memory Device in
2638                                                         ; < an interleave.
2639   InterleavedDataDepth          UINT8 ?         ; < The maximum number of consecutive rows from the
2640                                                         ; < referenced Memory Device that are accessed in a
2641                                                         ; < single interleaved transfer.
2642   ExtStartingAddr               UINT64 ?              ; < The physical address, in bytes, of a range of
2643                                                       ; < memory mapped to the referenced Memory Device.
2644   ExtEndingAddr                 UINT64 ?              ; < The physical ending address, in bytes, of the last of
2645                                                       ; < a range of addresses mapped to the referenced Memory Device.
2646 TYPE20_DMI_INFO    ENDS
2647
2648  ; Collection of pointers to the DMI records
2649 DMI_INFO    STRUCT
2650   T4                            TYPE4_DMI_INFO (MAX_SOCKETS_SUPPORTED) DUP ({})         ; < Type 4 struc
2651   T7L1                          TYPE7_DMI_INFO (MAX_SOCKETS_SUPPORTED) DUP ({})         ; < Type 7 struc 1
2652   T7L2                          TYPE7_DMI_INFO (MAX_SOCKETS_SUPPORTED) DUP ({})         ; < Type 7 struc 2
2653   T7L3                          TYPE7_DMI_INFO (MAX_SOCKETS_SUPPORTED) DUP ({})         ; < Type 7 struc 3
2654   T16                           TYPE16_DMI_INFO {}      ; < Type 16 struc
2655   T17                           TYPE17_DMI_INFO (MAX_SOCKETS_SUPPORTED * MAX_CHANNELS_PER_SOCKET * MAX_DIMMS_PER_CHANNEL) DUP ({})          ; < Type 17 struc
2656   T19                           TYPE19_DMI_INFO {}      ; < Type 19 struc
2657   T20                           TYPE20_DMI_INFO (MAX_SOCKETS_SUPPORTED * MAX_CHANNELS_PER_SOCKET * MAX_DIMMS_PER_CHANNEL) DUP ({})          ; < Type 20 struc
2658 DMI_INFO    ENDS
2659
2660
2661
2662 ; *********************************************************************
2663 ; * Interface call:  AllocateExecutionCache
2664 ; *********************************************************************
2665     MAX_CACHE_REGIONS           EQU    3
2666
2667  ; AllocateExecutionCache sub param structure for cached memory region
2668 EXECUTION_CACHE_REGION    STRUCT
2669   ExeCacheStartAddr             UINT32 ?        ; < Start address
2670   ExeCacheSize                  UINT32 ?        ; < Size
2671 EXECUTION_CACHE_REGION    ENDS
2672
2673 ; *********************************************************************
2674 ; * Interface call:  AmdGetAvailableExeCacheSize
2675 ; *********************************************************************
2676  ; Get available Cache remain
2677 AMD_GET_EXE_SIZE_PARAMS    STRUCT
2678   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Standard header
2679      AvailableExeCacheSize      UINT32 ?        ; < Remain size
2680 AMD_GET_EXE_SIZE_PARAMS    ENDS
2681
2682
2683
2684
2685
2686
2687  ; Selection type for core leveling
2688   CORE_LEVEL_LOWEST     EQU    0        ; < Level to lowest common denominator
2689   CORE_LEVEL_TWO        EQU    1        ; < Level to 2 cores
2690   CORE_LEVEL_POWER_OF_TWO       EQU    2        ; < Level to 1,2,4 or 8
2691   CORE_LEVEL_NONE       EQU    3        ; < Do no leveling
2692   CORE_LEVEL_COMPUTE_UNIT EQU  4        ; < Level cores to one core per compute unit
2693   CORE_LEVEL_ONE        EQU    5        ; < Level to 1 core
2694   CORE_LEVEL_THREE      EQU    6        ; < Level to 3 cores
2695   CORE_LEVEL_FOUR       EQU    7        ; < Level to 4 cores
2696   CORE_LEVEL_FIVE       EQU    8        ; < Level to 5 cores
2697   CORE_LEVEL_SIX        EQU    9        ; < Level to 6 cores
2698   CORE_LEVEL_SEVEN      EQU    10       ; < Level to 7 cores
2699   CORE_LEVEL_EIGHT      EQU    11       ; < Level to 8 cores
2700   CORE_LEVEL_NINE       EQU    12       ; < Level to 9 cores
2701   CORE_LEVEL_TEN        EQU    13       ; < Level to 10 cores
2702   CORE_LEVEL_ELEVEN     EQU    14       ; < Level to 11 cores
2703   CORE_LEVEL_TWELVE     EQU    15       ; < Level to 12 cores
2704   CORE_LEVEL_THIRTEEN   EQU    16       ; < Level to 13 cores
2705   CORE_LEVEL_FOURTEEN   EQU    17       ; < Level to 14 cores
2706   CORE_LEVEL_FIFTEEN    EQU    18       ; < Level to 15 cores
2707   CoreLevelModeMax      EQU    19       ; < Used for bounds checking
2708 CORE_LEVELING_TYPE  TEXTEQU  <DWORD>
2709
2710
2711 ; ***********************************************************************
2712 ; *
2713 ; *  AGESA Basic Level interface structure definition and function prototypes
2714 ; *
2715 ; **********************************************************************
2716
2717 ; *********************************************************************
2718 ; * Interface call:  AmdCreateStruct
2719 ; *********************************************************************
2720
2721 ; *********************************************************************
2722 ; * Interface call:  AmdReleaseStruct
2723 ; *********************************************************************
2724
2725 ; *********************************************************************
2726 ; * Interface call:  AmdInitReset
2727 ; *********************************************************************
2728  ; AmdInitReset param structure
2729 AMD_RESET_PARAMS    STRUCT
2730   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Standard header
2731   CacheRegion                   EXECUTION_CACHE_REGION (3) DUP ({})     ; < The cached memory region
2732   HtConfig                      AMD_HT_RESET_INTERFACE {}       ; < The interface for Ht Recovery
2733   FchInterface                  FCH_RESET_INTERFACE {}          ; Interface for FCH configuration
2734 AMD_RESET_PARAMS    ENDS
2735
2736 ; *********************************************************************
2737 ; * Interface call:  AmdInitEarly
2738 ; *********************************************************************
2739  ; InitEarly param structure
2740
2741  ; Provide defaults or customizations to each service performed in AmdInitEarly.
2742
2743 AMD_EARLY_PARAMS    STRUCT
2744   StdHeader                     AMD_CONFIG_PARAMS {}     ; < The standard header
2745   CacheRegion                   EXECUTION_CACHE_REGION (3) DUP ({})     ; < Execution Map Interface
2746   PlatformConfig                PLATFORM_CONFIGURATION {}       ; < platform operational characteristics.
2747   HtConfig                      AMD_HT_INTERFACE {}     ; < HyperTransport Interface
2748   GnbConfig                     GNB_CONFIGURATION {}    ; < GNB configuration
2749 AMD_EARLY_PARAMS    ENDS
2750
2751 ; *********************************************************************
2752 ; * Interface call:  AmdInitPost
2753 ; *********************************************************************
2754  ; AmdInitPost param structure
2755 AMD_POST_PARAMS    STRUCT
2756   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Standard header
2757   PlatformConfig                PLATFORM_CONFIGURATION {}       ; < platform operational characteristics.
2758   MemConfig                     MEM_PARAMETER_STRUCT {}         ; < Memory post param
2759 AMD_POST_PARAMS    ENDS
2760
2761 ; *********************************************************************
2762 ; * Interface call:  AmdInitEnv
2763 ; *********************************************************************
2764  ; AmdInitEnv param structure
2765 AMD_ENV_PARAMS    STRUCT
2766   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Standard header
2767   PlatformConfig                PLATFORM_CONFIGURATION {}       ; < platform operational characteristics.
2768   GnbEnvConfiguration           GNB_ENV_CONFIGURATION {}        ; < platform operational characteristics.
2769   FchInterface                  FCH_INTERFACE {}                ; FCH configuration
2770 AMD_ENV_PARAMS    ENDS
2771
2772 ; *********************************************************************
2773 ; * Interface call:  AmdInitMid
2774 ; *********************************************************************
2775  ; AmdInitMid param structure
2776 AMD_MID_PARAMS    STRUCT
2777   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Standard header
2778   PlatformConfig                PLATFORM_CONFIGURATION {}       ; < platform operational characteristics.
2779   FchInterface                  FCH_INTERFACE {}                ; FCH configuration
2780 AMD_MID_PARAMS    ENDS
2781
2782 ; *********************************************************************
2783 ; * Interface call:  AmdInitLate
2784 ; *********************************************************************
2785  ; AmdInitLate param structure
2786 AMD_LATE_PARAMS    STRUCT
2787   StdHeader                     AMD_CONFIG_PARAMS {}    ; < Standard header
2788   PlatformConfig                PLATFORM_CONFIGURATION {} ; < platform operational characteristics.
2789      IvrsExclusionRangeList     POINTER ?       ; < IVMD exclusion range descriptor
2790      DmiTable                   POINTER ?       ; < DMI Interface
2791      AcpiPState                 POINTER ?       ; < Acpi Pstate SSDT Table
2792      AcpiSrat                   POINTER ?       ; < SRAT Table
2793      AcpiSlit                   POINTER ?       ; < SLIT Table
2794      AcpiWheaMce                POINTER ?       ; < WHEA MCE Table
2795      AcpiWheaCmc                POINTER ?       ; < WHEA CMC Table
2796      AcpiAlib                   POINTER ?       ; < ALIB Table
2797      AcpiIvrs                   POINTER ?       ; < IOMMU ACPI IVRS(I/O Virtualization Reporting Structure) table
2798 AMD_LATE_PARAMS    ENDS
2799
2800 ; *********************************************************************
2801 ; * Interface call:  AmdInitRecovery
2802 ; *********************************************************************
2803  ; CPU Recovery Parameters
2804 AMD_CPU_RECOVERY_PARAMS    STRUCT
2805   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Standard Header
2806   PlatformConfig                PLATFORM_CONFIGURATION {} ; < platform operational characteristics
2807 AMD_CPU_RECOVERY_PARAMS    ENDS
2808
2809  ; AmdInitRecovery param structure
2810 AMD_RECOVERY_PARAMS    STRUCT
2811   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Standard header
2812   MemConfig                     MEM_PARAMETER_STRUCT {}         ; < Memory post param
2813   CacheRegion                   EXECUTION_CACHE_REGION (3) DUP ({})     ; < The cached memory region. And the max cache region is 3
2814   CpuRecoveryParams             AMD_CPU_RECOVERY_PARAMS {}      ; < Params for CPU related recovery init.
2815 AMD_RECOVERY_PARAMS    ENDS
2816
2817
2818 ; *********************************************************************
2819 ; * Interface call:  AmdInitResume
2820 ; *********************************************************************
2821  ; AmdInitResume param structure
2822 AMD_RESUME_PARAMS    STRUCT
2823   StdHeader                     AMD_CONFIG_PARAMS {}      ; < Standard header
2824   PlatformConfig                PLATFORM_CONFIGURATION {} ; < Platform operational characteristics
2825   S3DataBlock                   AMD_S3_PARAMS {}          ; < Save state data
2826 AMD_RESUME_PARAMS    ENDS
2827
2828 ; *********************************************************************
2829 ; * Interface call:  AmdS3LateRestore
2830 ; *********************************************************************
2831  ; AmdS3LateRestore param structure
2832 AMD_S3LATE_PARAMS    STRUCT
2833   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Standard header
2834   PlatformConfig                PLATFORM_CONFIGURATION {}       ; < platform operational characteristics.
2835   S3DataBlock                   AMD_S3_PARAMS {}        ; < Save state data
2836 AMD_S3LATE_PARAMS    ENDS
2837
2838 ; *********************************************************************
2839 ; * Interface call:  AmdS3Save
2840 ; *********************************************************************
2841  ; AmdS3Save param structure
2842 AMD_S3SAVE_PARAMS    STRUCT
2843   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Standard header
2844   PlatformConfig                PLATFORM_CONFIGURATION {}       ; < platform operational characteristics.
2845   S3DataBlock                   AMD_S3_PARAMS {}        ; < Standard header
2846   FchInterface                  FCH_INTERFACE {}        ; FCH configuration
2847 AMD_S3SAVE_PARAMS    ENDS
2848
2849  ; General Services API
2850
2851
2852 ; *********************************************************************
2853 ; * Interface service call:  AmdGetApicId
2854 ; *********************************************************************
2855  ; Request the APIC ID of a particular core.
2856
2857 AMD_APIC_PARAMS    STRUCT
2858   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Header for library and services.
2859   Socket                        UINT8 ?         ; < The Core's Socket.
2860   Core                          UINT8 ?         ; < The Core id.
2861      IsPresent                  BOOLEAN ?       ; < The Core is present, and  ApicAddress is valid.
2862      ApicAddress                UINT8 ?         ; < The Core's APIC ID.
2863 AMD_APIC_PARAMS    ENDS
2864
2865 ; *********************************************************************
2866 ; * Interface service call:  AmdGetPciAddress
2867 ; *********************************************************************
2868  ; Request the PCI Address of a Processor Module (that is, its Northbridge)
2869
2870 AMD_GET_PCI_PARAMS    STRUCT
2871   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Header for library and services.
2872   Socket                        UINT8 ?         ; < The Processor's socket
2873   Module                        UINT8 ?         ; < The Module in that Processor
2874      IsPresent                  BOOLEAN ?       ; < The Core is present, and  PciAddress is valid.
2875      PciAddress                 PCI_ADDR {}      ; < The Processor's PCI Config Space address (Function 0, Register 0)
2876 AMD_GET_PCI_PARAMS    ENDS
2877
2878 ; *********************************************************************
2879 ; * Interface service call:  AmdIdentifyCore
2880 ; *********************************************************************
2881  ; Request the identity (Socket, Module, Core) of the current Processor Core
2882
2883 AMD_IDENTIFY_PARAMS    STRUCT
2884   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Header for library and services.
2885      Socket                     UINT8 ?         ; < The current Core's Socket
2886      Module                     UINT8 ?         ; < The current Core's Processor Module
2887      Core                       UINT8 ?         ; < The current Core's core id.
2888 AMD_IDENTIFY_PARAMS    ENDS
2889
2890 ; *********************************************************************
2891 ; * Interface service call:  AmdReadEventLog
2892 ; *********************************************************************
2893  ; An Event Log Entry.
2894 EVENT_PARAMS    STRUCT
2895   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Header for library and services.
2896      EventClass                 UINT32 ?        ; < The severity of this event, matches AGESA_STATUS.
2897      EventInfo                  UINT32 ?        ; < The unique event identifier, zero means "no event".
2898      DataParam1                 UINT32 ?        ; < Data specific to the Event.
2899      DataParam2                 UINT32 ?        ; < Data specific to the Event.
2900      DataParam3                 UINT32 ?        ; < Data specific to the Event.
2901      DataParam4                 UINT32 ?        ; < Data specific to the Event.
2902 EVENT_PARAMS    ENDS
2903
2904 ; *********************************************************************
2905 ; * Interface service call:  AmdIdentifyDimm
2906 ; *********************************************************************
2907  ; Request the identity of dimm from system address
2908
2909 AMD_IDENTIFY_DIMM    STRUCT
2910   StdHeader                     AMD_CONFIG_PARAMS {}     ; < Header for library and services.
2911   MemoryAddress                 UINT64 ?        ; < System Address that needs to be translated to dimm identification.
2912   SocketId                      UINT8 ?         ; < The socket on which the targeted address locates.
2913   MemChannelId                  UINT8 ?         ; < The channel on which the targeted address locates.
2914   DimmId                        UINT8 ?         ; < The dimm on which the targeted address locates.
2915 AMD_IDENTIFY_DIMM    ENDS
2916
2917  ; Data structure for the Mapping Item between Unified ID for IDS Setup Option
2918  ; and the option value.
2919
2920 IDS_NV_ITEM    STRUCT
2921   IdsNvId                       UINT16 ?        ; < Unified ID for IDS Setup Option.
2922   IdsNvValue                    UINT16 ?        ; < The value of IDS Setup Option.
2923 IDS_NV_ITEM    ENDS
2924
2925  ; Data Structure for IDS CallOut Function
2926 IDS_CALLOUT_STRUCT    STRUCT
2927   StdHeader                     AMD_CONFIG_PARAMS {}     ; < The Standard Header for AGESA Service
2928   IdsNvPtr                      POINTER ?       ; < Memory Pointer of IDS NV Table
2929   Reserved                      UINT32 ?         ; < reserved
2930 IDS_CALLOUT_STRUCT    ENDS
2931
2932   AGESA_IDS_DFT_VAL                            EQU    0FFFFh; <  Default value of every uninitlized NV item, the action for it will be ignored
2933   AGESA_IDS_NV_END                             EQU    0FFFFh; <  Flag specify end of option structure
2934 ; WARNING: Don't change the comment below, it used as signature for script
2935 ; AGESA IDS NV ID Definitions
2936   AGESA_IDS_EXT_ID_START                            EQU    0000h; <                                                            specify the start of external NV id
2937
2938   AGESA_IDS_NV_UCODE                                EQU    0001h; <                                                           Enable or disable microcode patching
2939
2940   AGESA_IDS_NV_TARGET_PSTATE                        EQU    0002h; <                                                       Set the P-state required to be activated
2941   AGESA_IDS_NV_POSTPSTATE                           EQU    0003h; <                                          Set the P-state required to be activated through POST
2942
2943   AGESA_IDS_NV_BANK_INTERLEAVE                      EQU    0004h; <                                                              Enable or disable Bank Interleave
2944   AGESA_IDS_NV_CHANNEL_INTERLEAVE                   EQU    0005h; <                                                           Enable or disable Channel Interleave
2945   AGESA_IDS_NV_NODE_INTERLEAVE                      EQU    0006h; <                                                              Enable or disable Node Interleave
2946   AGESA_IDS_NV_MEMHOLE                              EQU    0007h; <                                                                 Enables or disable memory hole
2947
2948   AGESA_IDS_NV_SCRUB_REDIRECTION                    EQU    0008h; <                                          Enable or disable a write to dram with corrected data
2949   AGESA_IDS_NV_DRAM_SCRUB                           EQU    0009h; <                                                  Set the rate of background scrubbing for DRAM
2950   AGESA_IDS_NV_DCACHE_SCRUB                         EQU    000Ah; <                                           Set the rate of background scrubbing for the DCache.
2951   AGESA_IDS_NV_L2_SCRUB                             EQU    000Bh; <                                          Set the rate of background scrubbing for the L2 cache
2952   AGESA_IDS_NV_L3_SCRUB                             EQU    000Ch; <                                          Set the rate of background scrubbing for the L3 cache
2953   AGESA_IDS_NV_ICACHE_SCRUB                         EQU    000Dh; <                                            Set the rate of background scrubbing for the Icache
2954   AGESA_IDS_NV_SYNC_ON_ECC_ERROR                    EQU    000Eh; <                                   Enable or disable the sync flood on un-correctable ECC error
2955   AGESA_IDS_NV_ECC_SYMBOL_SIZE                      EQU    000Fh; <                                                                            Set ECC symbol size
2956
2957   AGESA_IDS_NV_ALL_MEMCLKS                          EQU    0010h; <                                                     Enable or disable all memory clocks enable
2958   AGESA_IDS_NV_DCT_GANGING_MODE                     EQU    0011h; <                                                                            Set the Ganged mode
2959   AGESA_IDS_NV_DRAM_BURST_LENGTH32                  EQU    0012h; <                                                                   Set the DRAM Burst Length 32
2960   AGESA_IDS_NV_MEMORY_POWER_DOWN                    EQU    0013h; <                                                       Enable or disable Memory power down mode
2961   AGESA_IDS_NV_MEMORY_POWER_DOWN_MODE               EQU    0014h; <                                                                 Set the Memory power down mode
2962   AGESA_IDS_NV_DLL_SHUT_DOWN                        EQU    0015h; <                                                                  Enable or disable DLLShutdown
2963   AGESA_IDS_NV_ONLINE_SPARE                         EQU    0016h; <     Enable or disable the Dram controller to designate a DIMM bank as a spare for logical swap
2964
2965   AGESA_IDS_NV_HT_ASSIST                            EQU    0017h; <                                                                    Enable or Disable HT Assist
2966   AGESA_IDS_NV_ATMMODE                              EQU    0018h; <                                                                     Enable or Disable ATM mode
2967
2968   AGESA_IDS_NV_HDTOUT                               EQU    0019h; <                                                               Enable or disable HDTOUT feature
2969
2970   AGESA_IDS_NV_HTLINKSOCKET                         EQU    001Ah; <                                                                                 HT Link Socket
2971   AGESA_IDS_NV_HTLINKPORT                           EQU    001Bh; <                                                                                   HT Link Port
2972   AGESA_IDS_NV_HTLINKFREQ                           EQU    001Ch; <                                                                              HT Link Frequency
2973   AGESA_IDS_NV_HTLINKWIDTHIN                        EQU    001Dh; <                                                                               HT Link In Width
2974   AGESA_IDS_NV_HTLINKWIDTHOUT                       EQU    001Eh; <                                                                              HT Link Out Width
2975
2976   AGESA_IDS_NV_GNBHDAUDIOEN                         EQU    001Fh; <                                                                 Enable or disable GNB HD Audio
2977
2978   AGESA_IDS_NV_CPB_EN                               EQU    0020h; <                                                                         Core Performance Boost
2979
2980   AGESA_IDS_NV_HTC_EN                               EQU    0021h; <                                                                                     HTC Enable
2981   AGESA_IDS_NV_HTC_OVERRIDE                         EQU    0022h; <                                                                                   HTC Override
2982   AGESA_IDS_NV_HTC_PSTATE_LIMIT                     EQU    0023h; <                                                                       HTC P-state limit select
2983   AGESA_IDS_NV_HTC_TEMP_HYS                         EQU    0024h; <                                                                     HTC Temperature Hysteresis
2984   AGESA_IDS_NV_HTC_ACT_TEMP                         EQU    0025h; <                                                                            HTC Activation Temp
2985
2986   AGESA_IDS_NV_POWER_POLICY                         EQU    0026h; <                                                                   Select Platform Power Policy
2987   AGESA_IDS_EXT_ID_END                              EQU    0027h; <                                                              specify the end of external NV ID
2988
2989   IDS_EX_NV_ID  TEXTEQU  <DWORD>