AMD Agesa macro expansion fix
[coreboot.git] / src / vendorcode / amd / agesa / f14 / Proc / GNB / Common / GnbPcie.h
1 /* $NoKeywords:$ */
2 /**
3  * @file
4  *
5  * PCIe component definitions.
6  *
7  *
8  *
9  * @xrefitem bom "File Content Label" "Release Content"
10  * @e project:     AGESA
11  * @e sub-project: GNB
12  * @e \$Revision: 38931 $   @e \$Date: 2010-10-01 15:50:05 -0700 (Fri, 01 Oct 2010) $
13  *
14  */
15 /*
16  *****************************************************************************
17  *
18  * Copyright (c) 2011, Advanced Micro Devices, Inc.
19  * All rights reserved.
20  * 
21  * Redistribution and use in source and binary forms, with or without
22  * modification, are permitted provided that the following conditions are met:
23  *     * Redistributions of source code must retain the above copyright
24  *       notice, this list of conditions and the following disclaimer.
25  *     * Redistributions in binary form must reproduce the above copyright
26  *       notice, this list of conditions and the following disclaimer in the
27  *       documentation and/or other materials provided with the distribution.
28  *     * Neither the name of Advanced Micro Devices, Inc. nor the names of 
29  *       its contributors may be used to endorse or promote products derived 
30  *       from this software without specific prior written permission.
31  * 
32  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
33  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
34  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
35  * DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY
36  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
37  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
38  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
39  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
40  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
41  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42  * 
43  * ***************************************************************************
44  *
45  */
46
47 #ifndef _PCIEDEFS_H_
48 #define _PCIEDEFS_H_
49
50 #pragma pack (push, 1)
51
52 #ifndef MAX_NUMBER_OF_COMPLEXES
53   #define MAX_NUMBER_OF_COMPLEXES              1
54 #endif
55
56 #define DESCRIPTOR_ALLOCATED                   0x40000000ull
57 #define DESCRIPTOR_VIRTUAL                     0x20000000ull
58 #define DESCRIPTOR_COMPLEX                     0x08000000ull
59 #define DESCRIPTOR_SILICON                     0x04000000ull
60 #define DESCRIPTOR_PCIE_WRAPPER                0x00400000ull
61 #define DESCRIPTOR_DDI_WRAPPER                 0x00200000ull
62 #define DESCRIPTOR_PCIE_ENGINE                 0x00040000ull
63 #define DESCRIPTOR_DDI_ENGINE                  0x00020000ull
64 #define DESCRIPTOR_ALL_WRAPPERS                (DESCRIPTOR_DDI_WRAPPER | DESCRIPTOR_PCIE_WRAPPER)
65 #define DESCRIPTOR_ALL_ENGINES                 (DESCRIPTOR_DDI_ENGINE | DESCRIPTOR_PCIE_ENGINE)
66
67 #define UNUSED_LANE_ID                         128
68
69 #define IS_LAST_DESCRIPTOR(Descriptor) (Descriptor != NULL ? ((Descriptor->Flags & DESCRIPTOR_TERMINATE_LIST) == 0) : (1==0))
70
71 // Get lowest PHY lane on engine
72 #define PcieLibGetLoPhyLane(Engine) (Engine != NULL ? ((Engine->EngineData.StartLane > Engine->EngineData.EndLane) ? Engine->EngineData.EndLane : Engine->EngineData.StartLane) : 0xFF)
73 // Get highest PHY lane on engine
74 #define PcieLibGetHiPhyLane(Engine) (Engine != NULL ? ((Engine->EngineData.StartLane > Engine->EngineData.EndLane) ? Engine->EngineData.StartLane : Engine->EngineData.EndLane) : 0xFF)
75 // Get number of lanes on wrapper
76 #define PcieLibWrapperNumberOfLanes(Wrapper) (Wrapper != NULL ? ((UINT8)(Wrapper->EndPhyLane - Wrapper->StartPhyLane + 1)) : 0)
77 // Check if virtual descriptor
78 #define PcieLibIsVirtualDesciptor(Descriptor) (Descriptor != NULL ? ((Descriptor->Flags & DESCRIPTOR_VIRTUAL) != 0) : (1==0))
79 // Check if it is allocated descriptor
80 #define PcieLibIsEngineAllocated(Descriptor) (Descriptor != NULL ? ((Descriptor->Flags & DESCRIPTOR_ALLOCATED) != 0) : (1==0))
81 // Check if it is last descriptor in list
82 #define PcieLibIsLastDescriptor(Descriptor) (Descriptor != NULL ? ((Descriptor->Flags & DESCRIPTOR_TERMINATE_LIST) != 0) : (1==1))
83 // Check if descriptor a PCIe engine
84 #define PcieLibIsPcieEngine(Descriptor) (Descriptor != NULL ? ((Descriptor->Flags & DESCRIPTOR_PCIE_ENGINE) != 0) : (1==0))
85 // Check if descriptor a DDI engine
86 #define PcieLibIsDdiEngine(Descriptor) (Descriptor != NULL ? ((Descriptor->Flags & DESCRIPTOR_DDI_ENGINE) != 0) : (1==0))
87 // Check if descriptor a DDI wrapper
88 #define PcieLibIsDdiWrapper(Descriptor) (Descriptor != NULL ? ((Descriptor->Flags & DESCRIPTOR_DDI_WRAPPER) != 0) : (1==0))
89 // Check if descriptor a PCIe wrapper
90 #define PcieLibIsPcieWrapper(Descriptor) (Descriptor != NULL ? ((Descriptor->Flags & DESCRIPTOR_PCIE_WRAPPER) != 0) : (1==0))
91 // Check if descriptor a PCIe wrapper
92 #define PcieLibGetNextDescriptor(Descriptor) (Descriptor != NULL ? (((Descriptor->Flags & DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : ((++Descriptor) != NULL ? Descriptor : NULL)) : NULL)
93
94
95
96 #define LANE_TYPE_PCIE_ALL                    0x0001
97 #define LANE_TYPE_PCIE_ALLOCATED              0x0002
98 #define LANE_TYPE_PCIE_ACTIVE                 0x0004
99 #define LANE_TYPE_PCIE_SB                     0x0008
100 #define LANE_TYPE_PCIE_HOTPLUG                0x0010
101
102 #define LANE_TYPE_PCIE_LANES                  0x000FFF
103
104 #define LANE_TYPE_DDI_ALL                     0x1000
105 #define LANE_TYPE_DDI_ALLOCATED               0x2000
106 #define LANE_TYPE_DDI_ACTIVE                  0x4000
107
108 #define LANE_TYPE_DDI_LANES                   0xFFF000
109
110 #define LANE_TYPE_ALL                         (LANE_TYPE_PCIE_ALL | LANE_TYPE_DDI_ALL)
111 #define LANE_TYPE_ACTIVE                      (LANE_TYPE_PCIE_ACTIVE | LANE_TYPE_DDI_ACTIVE)
112 #define LANE_TYPE_ALLOCATED                   (LANE_TYPE_PCIE_ALLOCATED | LANE_TYPE_DDI_ALLOCATED)
113
114 //typedef UINT64 PPCIe_ENGINE_CONFIG;
115 //typedef UINT64 PPCIe_WRAPPER_CONFIG;
116 //typedef UINT64 PPCIe_SILICON_CONFIG;
117
118 #define INIT_STATUS_PCIE_PORT_GEN2_RECOVERY          0x00000001ull
119 #define INIT_STATUS_PCIE_PORT_BROKEN_LANE_RECOVERY   0x00000002ull
120 #define INIT_STATUS_PCIE_PORT_TRAINING_FAIL          0x00000004ull
121 #define INIT_STATUS_PCIE_TRAINING_SUCCESS            0x00000008ull
122 #define INIT_STATUS_PCIE_EP_NOT_PRESENT              0x00000010ull
123 #define INIT_STATUS_PCIE_PORT_IN_COMPLIANCE          0x00000020ull
124 #define INIT_STATUS_DDI_ACTIVE                       0x00000040ull
125 #define INIT_STATUS_ALLOCATED                        0x00000080ull
126
127 #define PCIE_PORT_GEN_CAP_BOOT                       0x00000001
128 #define PCIE_PORT_GEN_CAP_MAX                        0x00000002
129 #define PCIE_GLOBAL_GEN_CAP_ALL_PORTS                0x00000010
130 #define PCIE_GLOBAL_GEN_CAP_TRAINED_PORTS            0x00000011
131 #define PCIE_GLOBAL_GEN_CAP_HOTPLUG_PORTS            0x00000012
132
133 /// PCIe Link Training State
134 typedef enum {
135   PcieTrainingStandard,                                 ///< Standard training algorithm. Training contained to AmdEarlyInit.
136                                                         ///< PCIe device accessible after AmdEarlyInit complete
137   PcieTrainingDistributed,                              ///< Distribute training algorithm. Training distributed across AmdEarlyInit/AmdPostInit/AmdS3LateRestore
138                                                         ///< PCIe device accessible after AmdPostInit complete.
139                                                         ///< Algorithm potentially save up to 60ms in S3 resume time by skipping training empty slots.
140 } PCIE_TRAINING_ALGORITHM;
141
142 /// PCIe port configuration info
143 typedef struct {
144   PCIe_PORT_DATA          PortData;                     ///< Port data
145   UINT16                  StartCoreLane;                ///< Start Core Lane
146   UINT16                  EndCoreLane;                  ///< End Core lane
147   UINT8                   NativeDevNumber;              ///< Native PCI device number of the port
148   UINT8                   NativeFunNumber;              ///< Native PCI function number of the port
149   UINT8                   CoreId;                       ///< PCIe core ID
150   UINT8                   PortId;                       ///< Port id on wrapper
151   PCI_ADDR                Address;                      ///< PCI address of the port
152   BOOLEAN                 IsSB;                         ///< Is it NB to SB link?
153   UINT8                   State;                        ///< Training state
154   UINT32                  TimeStamp;                    ///< Time stamp used to during training process
155   UINT8                   GfxWrkRetryCount;             ///< Number of retry for GFX workaround
156 } PCIe_PORT_CONFIG;
157
158 /// DDI (Digital Display Interface) configuration info
159 typedef struct {
160   PCIe_DDI_DATA           DdiData;                      ///< DDI Data
161   UINT8                   DisplayPriorityIndex;         ///< Display priority index
162   UINT8                   ConnectorId;                  ///< Connector id determined by enumeration
163   UINT8                   DisplayDeviceId;              ///< Display device id determined by enumeration
164 } PCIe_DDI_CONFIG;
165
166 /// Engine configuration data
167 typedef struct {
168   UINT32                  Flags;                        /**< Descriptor flags
169                                                          * @li @b Bit31 - last descriptor on wrapper
170                                                          * @li @b Bit30 - Descriptor allocated for PCIe port or DDI
171                                                          */
172   VOID                   *Wrapper;                      ///< Pointer to parent wrapper
173   PCIe_ENGINE_DATA        EngineData;                   ///< Engine Data
174   UINT32                  InitStatus;                   ///< Initialization Status
175   UINT8                   Scratch;                      ///< Scratch pad
176   union {
177     PCIe_PORT_CONFIG      Port;                         ///< PCIe port configuration data
178     PCIe_DDI_CONFIG       Ddi;                          ///< DDI configuration data
179   } Type;
180 } PCIe_ENGINE_CONFIG;
181
182 #define PcieEngineGetParentWrapper(mEnginerPtr) ((PCIe_WRAPPER_CONFIG *) (mEnginerPtr->Wrapper))
183
184 /// Wrapper configuration data
185 typedef struct {
186   UINT32                  Flags;                        /**< Descriptor flags
187                                                          * @li @b Bit31 - last descriptor on silicon
188                                                          */
189   UINT8                   WrapId;                       ///< Wrapper ID
190   UINT8                   NumberOfPIFs;                 ///< Number of PIFs on wrapper
191   UINT8                   StartPhyLane;                 ///< Start PHY Lane
192   UINT8                   EndPhyLane;                   ///< End PHY Lane
193   UINT8                   StartPcieCoreId;              ///< Start PCIe Core ID
194   UINT8                   EndPcieCoreId;                ///< End PCIe Core ID
195   struct {
196     UINT8                 PowerOffUnusedLanes:1;        ///< Power Off unused lanes
197     UINT8                 PowerOffUnusedPlls:1;         ///< Power Off unused Plls
198     UINT8                 ClkGating:1;                  ///< TXCLK gating
199     UINT8                 LclkGating:1;                 ///< LCLK gating
200     UINT8                 TxclkGatingPllPowerDown:1;    ///< TXCLK clock gating PLL power down
201     UINT8                 PllOffInL1:1;                 ///< PLL off in L1
202   } Features;
203   VOID                   *EngineList;                   ///< Pointer to Engine list
204   VOID                   *Silicon;                      ///< Pointer to parent silicon
205   VOID                   *FmWrapper;                    ///< Pointer to family Specific configuration data
206 } PCIe_WRAPPER_CONFIG;
207
208
209 #define PcieWrapperGetEngineList(mWrapperPtr) ((PCIe_ENGINE_CONFIG *)(mWrapperPtr->EngineList))
210 #define PcieWrapperGetParentSilicon(mWrapperPtr) ((PCIe_SILICON_CONFIG *)(mWrapperPtr->Silicon))
211
212 /// Silicon configuration data
213 typedef struct  {
214   UINT32                  Flags;                        /**< Descriptor flags
215                                                          * @li @b Bit31 - last descriptor on complex
216                                                          */
217   PCI_ADDR                Address;                      ///< PCI address of GNB host bridge
218   VOID                   *WrapperList;                  ///< Pointer to wrapper list
219   VOID                   *FmSilicon;                    ///< Pointer to family Specific configuration data
220 } PCIe_SILICON_CONFIG;
221
222 #define PcieSiliconGetWrapperList(mSiliconPtr) ((PCIe_WRAPPER_CONFIG *) (mSiliconPtr->WrapperList))
223
224 /// Complex configuration data
225 typedef struct {
226   UINT32                  Flags;                        /**< Descriptor flags
227                                                          * @li @b Bit31 - last descriptor on platform
228                                                          */
229   UINT8                   SocketId;                     ///< Processor socket ID
230   VOID                   *SiliconList;                  ///< Pointer to silicon list
231 } PCIe_COMPLEX_CONFIG;
232
233 #define PcieComplexGetSiliconList(mComplexPtr) ((PCIe_SILICON_CONFIG *)(UINTN)((mComplexPtr)->SiliconList))
234
235 /// PCIe platform configuration info
236 typedef struct {
237   AMD_CONFIG_PARAMS      *StdHeader;                    ///< Standard configuration header
238   UINT64                  This;                         ///< base structure Base
239   UINT32                  LinkReceiverDetectionPooling; ///< Receiver pooling detection time in us.
240   UINT32                  LinkL0Pooling;                ///< Pooling for link to get to L0 in us
241   UINT32                  LinkGpioResetAssertionTime;   ///< Gpio reset assertion time in us
242   UINT32                  LinkResetToTrainingTime;      ///< Time duration between deassert GPIO reset and release training in us                                                      ///
243   UINT8                   GfxCardWorkaround;            ///< GFX Card Workaround
244   UINT8                   PsppPolicy;                   ///< PSPP policy
245   UINT8                   TrainingExitState;            ///< State at which training should exit (see PCIE_LINK_TRAINING_STATE)
246   UINT8                   TrainingAlgorithm;            ///< Training algorithm (see PCIE_TRAINING_ALGORITHM)
247   PCIe_COMPLEX_CONFIG     ComplexList[MAX_NUMBER_OF_COMPLEXES]; ///<
248 } PCIe_PLATFORM_CONFIG;
249
250 /// PCIe Engine Description
251 typedef struct {
252   UINT32                  Flags;                        /**< Descriptor flags
253                                                          * @li @b Bit31 - last descriptor on wrapper
254                                                          * @li @b Bit30 - Descriptor allocated for PCIe port or DDI
255                                                          */
256   PCIe_ENGINE_DATA        EngineData;                 ///< Engine Data
257 } PCIe_ENGINE_DESCRIPTOR;
258
259 /// PCIe Link Training State
260 typedef enum {
261   LinkStateResetAssert,                                 ///< Assert port GPIO reset
262   LinkStateResetDuration,                               ///< Timeout for reset duration
263   LinkStateResetExit,                                   ///< Deassert port GPIO reset
264   LinkTrainingResetTimeout,                             ///< Port GPIO reset timeout
265   LinkStateReleaseTraining,                             ///< Release link training
266   LinkStateDetectPresence,                              ///< Detect device presence
267   LinkStateDetecting,                                   ///< Detect link training.
268   LinkStateBrokenLane,                                  ///< Check and handle broken lane
269   LinkStateGen2Fail,                                    ///< Check and handle device that fail training if GEN2 capability advertised
270   LinkStateL0,                                          ///< Device trained to L0
271   LinkStateVcoNegotiation,                              ///< Check VCO negotiation complete
272   LinkStateRetrain,                                     ///< Force retrain link.
273   LinkStateTrainingFail,                                ///< Link training fail
274   LinkStateTrainingSuccess,                             ///< Link training success
275   LinkStateGfxWorkaround,                               ///< GFX workaround
276   LinkStateCompliance,                                  ///< Link in compliance mode
277   LinkStateDeviceNotPresent,                            ///< Link is not connected
278   LinkStateTrainingCompleted                            ///< Link training completed
279 } PCIE_LINK_TRAINING_STATE;
280
281 /// PCIe Port Visibility
282 typedef enum {
283   UnhidePorts,                                          ///< Command to unhide port
284   HidePorts,                                            ///< Command to hide unused ports
285 } PCIE_PORT_VISIBILITY;
286
287
288 /// Table Register Entry
289 typedef struct {
290   UINT16          Reg;                                  ///< Address
291   UINT32          Mask;                                 ///< Mask
292   UINT32          Data;                                 ///< Data
293 } PCIE_PORT_REGISTER_ENTRY;
294
295 /// Table Register Entry
296 typedef struct {
297   UINT32          Reg;                                  ///< Address
298   UINT32          Mask;                                 ///< Mask
299   UINT32          Data;                                 ///< Data
300 } PCIE_HOST_REGISTER_ENTRY;
301
302 ///Link ASPM info
303 typedef struct {
304   PCI_ADDR        DownstreamPort;                       ///< PCI address of downstream port
305   PCIE_ASPM_TYPE  DownstreamAspm ;                      ///< Downstream Device Aspm
306   PCI_ADDR        UpstreamPort;                         ///< PCI address of upstream port
307   PCIE_ASPM_TYPE  UpstreamAspm;                         ///< Upstream Device Capability
308   PCIE_ASPM_TYPE  RequestedAspm;                        ///< Requested ASPM
309 } PCIe_LINK_ASPM;
310
311 ///PCIe ASPM Latency Information
312 typedef struct {
313   UINT8  MaxL0sExitLatency;                             ///< Max L0s exit latency in us
314   UINT8  MaxL1ExitLatency;                              ///< Max L1 exit latency in us
315 } PCIe_ASPM_LATENCY_INFO;
316
317 /// PCI address association
318 typedef struct {
319   UINT8 NewDeviceAddress;                                ///< New PCI address (Device,Fucntion)
320   UINT8 NativeDeviceAddress;                             ///< Native PCI address (Device,Fucntion)
321 } PCI_ADDR_LIST;
322
323 /// The return status for GFX Card Workaround.
324 typedef enum {
325   GFX_WORKAROUND_DEVICE_NOT_READY,                       ///< GFX Workaround device is not ready.
326   GFX_WORKAROUND_RESET_DEVICE,                           ///< GFX Workaround device need reset.
327   GFX_WORKAROUND_SUCCESS                                 ///< The service completed normally.
328 } GFX_WORKAROUND_STATUS;
329
330 /// GFX workaround control
331 typedef enum {
332   GfxWorkaroundDisable,                                  ///< GFX Workaround disabled
333   GfxWorkaroundEnable                                    ///< GFX Workaround enabled
334 } GFX_WORKAROUND_CONTROL;
335
336 /// PIF lane power state
337 typedef enum {
338   PifPowerStateL0,                                       ///<
339   PifPowerStateLS1,                                      ///<
340   PifPowerStateLS2,                                      ///<
341   PifPowerStateOff = 0x7,                                ///<
342 } PCIE_PIF_POWER_STATE;
343
344 /// PIF lane power control
345 typedef enum {
346   PowerDownPifs,                                        ///<
347   PowerUpPifs                                           ///<
348 } PCIE_PIF_POWER_CONTROL;
349
350 ///PLL rumup time
351 typedef enum {
352   NormalRampup,                                         ///<
353   LongRampup,                                           ///<
354 } PCIE_PLL_RAMPUP_TIME;
355
356 #pragma pack (pop)
357
358 #endif