1 /** @file
2   Support for the latest PCI standard.
3 
4   Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
5   This program and the accompanying materials
6   are licensed and made available under the terms and conditions of the BSD License
7   which accompanies this distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #ifndef _PCIEXPRESS21_H_
16 #define _PCIEXPRESS21_H_
17 
18 #define EFI_PCIE_CAPABILITY_BASE_OFFSET                             0x100
19 #define EFI_PCIE_CAPABILITY_ID_SRIOV_CONTROL_ARI_HIERARCHY          0x10
20 #define EFI_PCIE_CAPABILITY_DEVICE_CAPABILITIES_2_OFFSET            0x24
21 #define EFI_PCIE_CAPABILITY_DEVICE_CAPABILITIES_2_ARI_FORWARDING    0x20
22 #define EFI_PCIE_CAPABILITY_DEVICE_CONTROL_2_OFFSET                 0x28
23 #define EFI_PCIE_CAPABILITY_DEVICE_CONTROL_2_ARI_FORWARDING         0x20
24 
25 //
26 // for SR-IOV
27 //
28 #define EFI_PCIE_CAPABILITY_ID_ARI        0x0E
29 #define EFI_PCIE_CAPABILITY_ID_ATS        0x0F
30 #define EFI_PCIE_CAPABILITY_ID_SRIOV      0x10
31 #define EFI_PCIE_CAPABILITY_ID_MRIOV      0x11
32 
33 typedef struct {
34   UINT32  CapabilityHeader;
35   UINT32  Capability;
36   UINT16  Control;
37   UINT16  Status;
38   UINT16  InitialVFs;
39   UINT16  TotalVFs;
40   UINT16  NumVFs;
41   UINT8   FunctionDependencyLink;
42   UINT8   Reserved0;
43   UINT16  FirstVFOffset;
44   UINT16  VFStride;
45   UINT16  Reserved1;
46   UINT16  VFDeviceID;
47   UINT32  SupportedPageSize;
48   UINT32  SystemPageSize;
49   UINT32  VFBar[6];
50   UINT32  VFMigrationStateArrayOffset;
51 } SR_IOV_CAPABILITY_REGISTER;
52 
53 #define EFI_PCIE_CAPABILITY_ID_SRIOV_CAPABILITIES               0x04
54 #define EFI_PCIE_CAPABILITY_ID_SRIOV_CONTROL                    0x08
55 #define EFI_PCIE_CAPABILITY_ID_SRIOV_STATUS                     0x0A
56 #define EFI_PCIE_CAPABILITY_ID_SRIOV_INITIALVFS                 0x0C
57 #define EFI_PCIE_CAPABILITY_ID_SRIOV_TOTALVFS                   0x0E
58 #define EFI_PCIE_CAPABILITY_ID_SRIOV_NUMVFS                     0x10
59 #define EFI_PCIE_CAPABILITY_ID_SRIOV_FUNCTION_DEPENDENCY_LINK   0x12
60 #define EFI_PCIE_CAPABILITY_ID_SRIOV_FIRSTVF                    0x14
61 #define EFI_PCIE_CAPABILITY_ID_SRIOV_VFSTRIDE                   0x16
62 #define EFI_PCIE_CAPABILITY_ID_SRIOV_VFDEVICEID                 0x1A
63 #define EFI_PCIE_CAPABILITY_ID_SRIOV_SUPPORTED_PAGE_SIZE        0x1C
64 #define EFI_PCIE_CAPABILITY_ID_SRIOV_SYSTEM_PAGE_SIZE           0x20
65 #define EFI_PCIE_CAPABILITY_ID_SRIOV_BAR0                       0x24
66 #define EFI_PCIE_CAPABILITY_ID_SRIOV_BAR1                       0x28
67 #define EFI_PCIE_CAPABILITY_ID_SRIOV_BAR2                       0x2C
68 #define EFI_PCIE_CAPABILITY_ID_SRIOV_BAR3                       0x30
69 #define EFI_PCIE_CAPABILITY_ID_SRIOV_BAR4                       0x34
70 #define EFI_PCIE_CAPABILITY_ID_SRIOV_BAR5                       0x38
71 #define EFI_PCIE_CAPABILITY_ID_SRIOV_VF_MIGRATION_STATE         0x3C
72 
73 typedef struct {
74   UINT32 CapabilityId:16;
75   UINT32 CapabilityVersion:4;
76   UINT32 NextCapabilityOffset:12;
77 } PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER;
78 
79 #define PCI_EXP_EXT_HDR PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER
80 
81 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ADVANCED_ERROR_REPORTING_ID   0x0001
82 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ADVANCED_ERROR_REPORTING_VER1 0x1
83 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ADVANCED_ERROR_REPORTING_VER2 0x2
84 
85 typedef struct {
86   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER  Header;
87   UINT32                                    UncorrectableErrorStatus;
88   UINT32                                    UncorrectableErrorMask;
89   UINT32                                    UncorrectableErrorSeverity;
90   UINT32                                    CorrectableErrorStatus;
91   UINT32                                    CorrectableErrorMask;
92   UINT32                                    AdvancedErrorCapabilitiesAndControl;
93   UINT32                                    HeaderLog;
94   UINT32                                    RootErrorCommand;
95   UINT32                                    RootErrorStatus;
96   UINT16                                    ErrorSourceIdentification;
97   UINT16                                    CorrectableErrorSourceIdentification;
98   UINT32                                    TlpPrefixLog[4];
99 } PCI_EXPRESS_EXTENDED_CAPABILITIES_ADVANCED_ERROR_REPORTING;
100 
101 #define PCI_EXPRESS_EXTENDED_CAPABILITY_VIRTUAL_CHANNEL_ID    0x0002
102 #define PCI_EXPRESS_EXTENDED_CAPABILITY_VIRTUAL_CHANNEL_MFVC  0x0009
103 #define PCI_EXPRESS_EXTENDED_CAPABILITY_VIRTUAL_CHANNEL_VER1  0x1
104 
105 typedef struct {
106   UINT32                                    VcResourceCapability:24;
107   UINT32                                    PortArbTableOffset:8;
108   UINT32                                    VcResourceControl;
109   UINT16                                    Reserved1;
110   UINT16                                    VcResourceStatus;
111 } PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_VC;
112 
113 typedef struct {
114   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER              Header;
115   UINT32                                                ExtendedVcCount:3;
116   UINT32                                                PortVcCapability1:29;
117   UINT32                                                PortVcCapability2:24;
118   UINT32                                                VcArbTableOffset:8;
119   UINT16                                                PortVcControl;
120   UINT16                                                PortVcStatus;
121   PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_VC  Capability[1];
122 } PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_CAPABILITY;
123 
124 #define PCI_EXPRESS_EXTENDED_CAPABILITY_SERIAL_NUMBER_ID    0x0003
125 #define PCI_EXPRESS_EXTENDED_CAPABILITY_SERIAL_NUMBER_VER1  0x1
126 
127 typedef struct {
128   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER  Header;
129   UINT64                                    SerialNumber;
130 } PCI_EXPRESS_EXTENDED_CAPABILITIES_SERIAL_NUMBER;
131 
132 #define PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_DECLARATION_ID   0x0005
133 #define PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_DECLARATION_VER1 0x1
134 
135 typedef struct {
136   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER  Header;
137   UINT32                                    ElementSelfDescription;
138   UINT32                                    Reserved;
139   UINT32                                    LinkEntry[1];
140 } PCI_EXPRESS_EXTENDED_CAPABILITIES_LINK_DECLARATION;
141 
142 #define PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_DECLARATION_GET_LINK_COUNT(LINK_DECLARATION) (UINT8)(((LINK_DECLARATION->ElementSelfDescription)&0x0000ff00)>>8)
143 
144 #define PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_CONTROL_ID   0x0006
145 #define PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_CONTROL_VER1 0x1
146 
147 typedef struct {
148   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER  Header;
149   UINT32                                    RootComplexLinkCapabilities;
150   UINT16                                    RootComplexLinkControl;
151   UINT16                                    RootComplexLinkStatus;
152 } PCI_EXPRESS_EXTENDED_CAPABILITIES_INTERNAL_LINK_CONTROL;
153 
154 #define PCI_EXPRESS_EXTENDED_CAPABILITY_POWER_BUDGETING_ID   0x0004
155 #define PCI_EXPRESS_EXTENDED_CAPABILITY_POWER_BUDGETING_VER1 0x1
156 
157 typedef struct {
158   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER  Header;
159   UINT32                                    DataSelect:8;
160   UINT32                                    Reserved:24;
161   UINT32                                    Data;
162   UINT32                                    PowerBudgetCapability:1;
163   UINT32                                    Reserved2:7;
164   UINT32                                    Reserved3:24;
165 } PCI_EXPRESS_EXTENDED_CAPABILITIES_POWER_BUDGETING;
166 
167 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ACS_EXTENDED_ID   0x000D
168 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ACS_EXTENDED_VER1 0x1
169 
170 typedef struct {
171   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER  Header;
172   UINT16                                    AcsCapability;
173   UINT16                                    AcsControl;
174   UINT8                                     EgressControlVectorArray[1];
175 } PCI_EXPRESS_EXTENDED_CAPABILITIES_ACS_EXTENDED;
176 
177 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ACS_EXTENDED_GET_EGRES_CONTROL(ACS_EXTENDED) (UINT8)(((ACS_EXTENDED->AcsCapability)&0x00000020))
178 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ACS_EXTENDED_GET_EGRES_VECTOR_SIZE(ACS_EXTENDED) (UINT8)(((ACS_EXTENDED->AcsCapability)&0x0000FF00))
179 
180 #define PCI_EXPRESS_EXTENDED_CAPABILITY_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_ID   0x0007
181 #define PCI_EXPRESS_EXTENDED_CAPABILITY_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_VER1 0x1
182 
183 typedef struct {
184   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER  Header;
185   UINT32                                    AssociationBitmap;
186 } PCI_EXPRESS_EXTENDED_CAPABILITIES_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION;
187 
188 #define PCI_EXPRESS_EXTENDED_CAPABILITY_MULTI_FUNCTION_VIRTUAL_CHANNEL_ID    0x0008
189 #define PCI_EXPRESS_EXTENDED_CAPABILITY_MULTI_FUNCTION_VIRTUAL_CHANNEL_VER1  0x1
190 
191 typedef PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_CAPABILITY PCI_EXPRESS_EXTENDED_CAPABILITIES_MULTI_FUNCTION_VIRTUAL_CHANNEL_CAPABILITY;
192 
193 #define PCI_EXPRESS_EXTENDED_CAPABILITY_VENDOR_SPECIFIC_ID   0x000B
194 #define PCI_EXPRESS_EXTENDED_CAPABILITY_VENDOR_SPECIFIC_VER1 0x1
195 
196 typedef struct {
197   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER  Header;
198   UINT32                                    VendorSpecificHeader;
199   UINT8                                     VendorSpecific[1];
200 } PCI_EXPRESS_EXTENDED_CAPABILITIES_VENDOR_SPECIFIC;
201 
202 #define PCI_EXPRESS_EXTENDED_CAPABILITY_VENDOR_SPECIFIC_GET_SIZE(VENDOR) (UINT16)(((VENDOR->VendorSpecificHeader)&0xFFF00000)>>20)
203 
204 #define PCI_EXPRESS_EXTENDED_CAPABILITY_RCRB_HEADER_ID   0x000A
205 #define PCI_EXPRESS_EXTENDED_CAPABILITY_RCRB_HEADER_VER1 0x1
206 
207 typedef struct {
208   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER  Header;
209   UINT16                                    VendorId;
210   UINT16                                    DeviceId;
211   UINT32                                    RcrbCapabilities;
212   UINT32                                    RcrbControl;
213   UINT32                                    Reserved;
214 } PCI_EXPRESS_EXTENDED_CAPABILITIES_RCRB_HEADER;
215 
216 #define PCI_EXPRESS_EXTENDED_CAPABILITY_MULTICAST_ID   0x0012
217 #define PCI_EXPRESS_EXTENDED_CAPABILITY_MULTICAST_VER1 0x1
218 
219 typedef struct {
220   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER  Header;
221   UINT16                                    MultiCastCapability;
222   UINT16                                    MulticastControl;
223   UINT64                                    McBaseAddress;
224   UINT64                                    McReceiveAddress;
225   UINT64                                    McBlockAll;
226   UINT64                                    McBlockUntranslated;
227   UINT64                                    McOverlayBar;
228 } PCI_EXPRESS_EXTENDED_CAPABILITIES_MULTICAST;
229 
230 #define PCI_EXPRESS_EXTENDED_CAPABILITY_RESIZABLE_BAR_ID    0x0015
231 #define PCI_EXPRESS_EXTENDED_CAPABILITY_RESIZABLE_BAR_VER1  0x1
232 
233 typedef struct {
234   UINT32                                                 ResizableBarCapability;
235   UINT16                                                 ResizableBarControl;
236   UINT16                                                 Reserved;
237 } PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR_ENTRY;
238 
239 typedef struct {
240   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER               Header;
241   PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR_ENTRY  Capability[1];
242 } PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR;
243 
244 #define GET_NUMBER_RESIZABLE_BARS(x) (((x->Capability[0].ResizableBarControl) & 0xE0) >> 5)
245 
246 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ARI_CAPABILITY_ID    0x000E
247 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ARI_CAPABILITY_VER1  0x1
248 
249 typedef struct {
250   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER                Header;
251   UINT16                                                  AriCapability;
252   UINT16                                                  AriControl;
253 } PCI_EXPRESS_EXTENDED_CAPABILITIES_ARI_CAPABILITY;
254 
255 #define PCI_EXPRESS_EXTENDED_CAPABILITY_DYNAMIC_POWER_ALLOCATION_ID    0x0016
256 #define PCI_EXPRESS_EXTENDED_CAPABILITY_DYNAMIC_POWER_ALLOCATION_VER1  0x1
257 
258 typedef struct {
259   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER                Header;
260   UINT32                                                  DpaCapability;
261   UINT32                                                  DpaLatencyIndicator;
262   UINT16                                                  DpaStatus;
263   UINT16                                                  DpaControl;
264   UINT8                                                   DpaPowerAllocationArray[1];
265 } PCI_EXPRESS_EXTENDED_CAPABILITIES_DYNAMIC_POWER_ALLOCATION;
266 
267 #define PCI_EXPRESS_EXTENDED_CAPABILITY_DYNAMIC_POWER_ALLOCATION_GET_SUBSTATE_MAX(POWER) (UINT16)(((POWER->DpaCapability)&0x0000000F))
268 
269 
270 #define PCI_EXPRESS_EXTENDED_CAPABILITY_LATENCE_TOLERANCE_REPORTING_ID    0x0018
271 #define PCI_EXPRESS_EXTENDED_CAPABILITY_LATENCE_TOLERANCE_REPORTING_VER1  0x1
272 
273 typedef struct {
274   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER                Header;
275   UINT16                                                  MaxSnoopLatency;
276   UINT16                                                  MaxNoSnoopLatency;
277 } PCI_EXPRESS_EXTENDED_CAPABILITIES_LATENCE_TOLERANCE_REPORTING;
278 
279 #define PCI_EXPRESS_EXTENDED_CAPABILITY_TPH_ID    0x0017
280 #define PCI_EXPRESS_EXTENDED_CAPABILITY_TPH_VER1  0x1
281 
282 typedef struct {
283   PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER                Header;
284   UINT32                                                  TphRequesterCapability;
285   UINT32                                                  TphRequesterControl;
286   UINT16                                                  TphStTable[1];
287 } PCI_EXPRESS_EXTENDED_CAPABILITIES_TPH;
288 
289 #define GET_TPH_TABLE_SIZE(x) ((x->TphRequesterCapability & 0x7FF0000)>>16) * sizeof(UINT16)
290 
291 #endif
292