]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Include/IndustryStandard/PciExpress21.h
MdePkg/PCI: Add missing PCI/PCIE definitions
[mirror_edk2.git] / MdePkg / Include / IndustryStandard / PciExpress21.h
1 /** @file
2 Support for the latest PCI standard.
3
4 Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
5 (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14 **/
15
16 #ifndef _PCIEXPRESS21_H_
17 #define _PCIEXPRESS21_H_
18
19 #include <IndustryStandard/Pci30.h>
20
21 #pragma pack(1)
22 ///
23 /// PCI Express Capability Structure
24 ///
25 typedef union {
26 struct {
27 UINT16 Version : 4;
28 UINT16 DevicePortType : 4;
29 UINT16 SlotImplemented : 1;
30 UINT16 InterruptMessageNumber : 5;
31 UINT16 Undefined : 1;
32 UINT16 Reserved : 1;
33 } Bits;
34 UINT16 Uint16;
35 } PCI_REG_PCIE_CAPABILITY;
36
37 #define PCIE_DEVICE_PORT_TYPE_PCIE_ENDPOINT 0
38 #define PCIE_DEVICE_PORT_TYPE_LEGACY_PCIE_ENDPOINT 1
39 #define PCIE_DEVICE_PORT_TYPE_ROOT_PORT 4
40 #define PCIE_DEVICE_PORT_TYPE_UPSTREAM_PORT 5
41 #define PCIE_DEVICE_PORT_TYPE_DOWNSTREAM_PORT 6
42 #define PCIE_DEVICE_PORT_TYPE_PCIE_TO_PCI_BRIDGE 7
43 #define PCIE_DEVICE_PORT_TYPE_PCI_TO_PCIE_BRIDGE 8
44 #define PCIE_DEVICE_PORT_TYPE_ROOT_COMPLEX_INTEGRATED_ENDPOINT 9
45 #define PCIE_DEVICE_PORT_TYPE_ROOT_COMPLEX_EVENT_COLLECTOR 10
46
47 typedef union {
48 struct {
49 UINT32 MaxPayloadSize : 3;
50 UINT32 PhantomFunctions : 2;
51 UINT32 ExtendedTagField : 1;
52 UINT32 EndpointL0sAcceptableLatency : 3;
53 UINT32 EndpointL1AcceptableLatency : 3;
54 UINT32 Undefined : 3;
55 UINT32 RoleBasedErrorReporting : 1;
56 UINT32 Reserved : 2;
57 UINT32 CapturedSlotPowerLimitValue : 8;
58 UINT32 CapturedSlotPowerLimitScale : 2;
59 UINT32 FunctionLevelReset : 1;
60 UINT32 Reserved2 : 3;
61 } Bits;
62 UINT32 Uint32;
63 } PCI_REG_PCIE_DEVICE_CAPABILITY;
64
65 typedef union {
66 struct {
67 UINT16 CorrectableError : 1;
68 UINT16 NonFatalError : 1;
69 UINT16 FatalError : 1;
70 UINT16 UnsupportedRequest : 1;
71 UINT16 RelaxedOrdering : 1;
72 UINT16 MaxPayloadSize : 3;
73 UINT16 ExtendedTagField : 1;
74 UINT16 PhantomFunctions : 1;
75 UINT16 AuxPower : 1;
76 UINT16 NoSnoop : 1;
77 UINT16 MaxReadRequestSize : 3;
78 UINT16 BridgeConfigurationRetryOrFunctionLevelReset : 1;
79 } Bits;
80 UINT16 Uint16;
81 } PCI_REG_PCIE_DEVICE_CONTROL;
82
83 typedef union {
84 struct {
85 UINT16 CorrectableError : 1;
86 UINT16 NonFatalError : 1;
87 UINT16 FatalError : 1;
88 UINT16 UnsupportedRequest : 1;
89 UINT16 AuxPower : 1;
90 UINT16 TransactionsPending : 1;
91 UINT16 Reserved : 10;
92 } Bits;
93 UINT16 Uint16;
94 } PCI_REG_PCIE_DEVICE_STATUS;
95
96 typedef union {
97 struct {
98 UINT32 MaxLinkSpeed : 4;
99 UINT32 MaxLinkWidth : 6;
100 UINT32 Aspm : 2;
101 UINT32 L0sExitLatency : 3;
102 UINT32 L1ExitLatency : 3;
103 UINT32 ClockPowerManagement : 1;
104 UINT32 SurpriseDownError : 1;
105 UINT32 DataLinkLayerLinkActive : 1;
106 UINT32 LinkBandwidthNotification : 1;
107 UINT32 AspmOptionalityCompliance : 1;
108 UINT32 Reserved : 1;
109 UINT32 PortNumber : 8;
110 } Bits;
111 UINT32 Uint32;
112 } PCI_REG_PCIE_LINK_CAPABILITY;
113
114 #define PCIE_LINK_ASPM_L0S BIT0
115 #define PCIE_LINK_ASPM_L1 BIT1
116
117 typedef union {
118 struct {
119 UINT16 AspmControl : 2;
120 UINT16 Reserved : 1;
121 UINT16 ReadCompletionBoundary : 1;
122 UINT16 LinkDisable : 1;
123 UINT16 RetrainLink : 1;
124 UINT16 CommonClockConfiguration : 1;
125 UINT16 ExtendedSynch : 1;
126 UINT16 ClockPowerManagement : 1;
127 UINT16 HardwareAutonomousWidthDisable : 1;
128 UINT16 LinkBandwidthManagementInterrupt : 1;
129 UINT16 LinkAutonomousBandwidthInterrupt : 1;
130 } Bits;
131 UINT16 Uint16;
132 } PCI_REG_PCIE_LINK_CONTROL;
133
134 typedef union {
135 struct {
136 UINT16 CurrentLinkSpeed : 4;
137 UINT16 NegotiatedLinkWidth : 6;
138 UINT16 Undefined : 1;
139 UINT16 LinkTraining : 1;
140 UINT16 SlotClockConfiguration : 1;
141 UINT16 DataLinkLayerLinkActive : 1;
142 UINT16 LinkBandwidthManagement : 1;
143 UINT16 LinkAutonomousBandwidth : 1;
144 } Bits;
145 UINT16 Uint16;
146 } PCI_REG_PCIE_LINK_STATUS;
147
148 typedef union {
149 struct {
150 UINT32 AttentionButton : 1;
151 UINT32 PowerController : 1;
152 UINT32 MrlSensor : 1;
153 UINT32 AttentionIndicator : 1;
154 UINT32 PowerIndicator : 1;
155 UINT32 HotPlugSurprise : 1;
156 UINT32 HotPlugCapable : 1;
157 UINT32 SlotPowerLimitValue : 8;
158 UINT32 SlotPowerLimitScale : 2;
159 UINT32 ElectromechanicalInterlock : 1;
160 UINT32 NoCommandCompleted : 1;
161 UINT32 PhysicalSlotNumber : 13;
162 } Bits;
163 UINT32 Uint32;
164 } PCI_REG_PCIE_SLOT_CAPABILITY;
165
166 typedef union {
167 struct {
168 UINT32 AttentionButtonPressed : 1;
169 UINT32 PowerFaultDetected : 1;
170 UINT32 MrlSensorChanged : 1;
171 UINT32 PresenceDetectChanged : 1;
172 UINT32 CommandCompletedInterrupt : 1;
173 UINT32 HotPlugInterrupt : 1;
174 UINT32 AttentionIndicator : 2;
175 UINT32 PowerIndicator : 2;
176 UINT32 PowerController : 1;
177 UINT32 ElectromechanicalInterlock : 1;
178 UINT32 DataLinkLayerStateChanged : 1;
179 UINT32 Reserved : 3;
180 } Bits;
181 UINT16 Uint16;
182 } PCI_REG_PCIE_SLOT_CONTROL;
183
184 typedef union {
185 struct {
186 UINT16 AttentionButtonPressed : 1;
187 UINT16 PowerFaultDetected : 1;
188 UINT16 MrlSensorChanged : 1;
189 UINT16 PresenceDetectChanged : 1;
190 UINT16 CommandCompleted : 1;
191 UINT16 MrlSensor : 1;
192 UINT16 PresenceDetect : 1;
193 UINT16 ElectromechanicalInterlock : 1;
194 UINT16 DataLinkLayerStateChanged : 1;
195 UINT16 Reserved : 7;
196 } Bits;
197 UINT16 Uint16;
198 } PCI_REG_PCIE_SLOT_STATUS;
199
200 typedef union {
201 struct {
202 UINT16 SystemErrorOnCorrectableError : 1;
203 UINT16 SystemErrorOnNonFatalError : 1;
204 UINT16 SystemErrorOnFatalError : 1;
205 UINT16 PmeInterrupt : 1;
206 UINT16 CrsSoftwareVisibility : 1;
207 UINT16 Reserved : 11;
208 } Bits;
209 UINT16 Uint16;
210 } PCI_REG_PCIE_ROOT_CONTROL;
211
212 typedef union {
213 struct {
214 UINT16 CrsSoftwareVisibility : 1;
215 UINT16 Reserved : 15;
216 } Bits;
217 UINT16 Uint16;
218 } PCI_REG_PCIE_ROOT_CAPABILITY;
219
220 typedef union {
221 struct {
222 UINT32 PmeRequesterId : 16;
223 UINT32 PmeStatus : 1;
224 UINT32 PmePending : 1;
225 UINT32 Reserved : 14;
226 } Bits;
227 UINT32 Uint32;
228 } PCI_REG_PCIE_ROOT_STATUS;
229
230 typedef union {
231 struct {
232 UINT32 CompletionTimeoutRanges : 4;
233 UINT32 CompletionTimeoutDisable : 1;
234 UINT32 AriForwarding : 1;
235 UINT32 AtomicOpRouting : 1;
236 UINT32 AtomicOp32Completer : 1;
237 UINT32 AtomicOp64Completer : 1;
238 UINT32 Cas128Completer : 1;
239 UINT32 NoRoEnabledPrPrPassing : 1;
240 UINT32 LtrMechanism : 1;
241 UINT32 TphCompleter : 2;
242 UINT32 Reserved : 4;
243 UINT32 Obff : 2;
244 UINT32 ExtendedFmtField : 1;
245 UINT32 EndEndTlpPrefix : 1;
246 UINT32 MaxEndEndTlpPrefixes : 2;
247 UINT32 Reserved2 : 8;
248 } Bits;
249 UINT32 Uint32;
250 } PCI_REG_PCIE_DEVICE_CAPABILITY2;
251
252 #define PCIE_DEVICE_CAPABILITY_OBFF_MESSAGE BIT0
253 #define PCIE_DEVICE_CAPABILITY_OBFF_WAKE BIT1
254
255 typedef union {
256 struct {
257 UINT16 CompletionTimeoutValue : 4;
258 UINT16 CompletionTimeoutDisable : 1;
259 UINT16 AriForwarding : 1;
260 UINT16 AtomicOpRequester : 1;
261 UINT16 AtomicOpEgressBlocking : 1;
262 UINT16 IdoRequest : 1;
263 UINT16 IdoCompletion : 1;
264 UINT16 LtrMechanism : 2;
265 UINT16 Reserved : 2;
266 UINT16 Obff : 2;
267 UINT16 EndEndTlpPrefixBlocking : 1;
268 } Bits;
269 UINT16 Uint16;
270 } PCI_REG_PCIE_DEVICE_CONTROL2;
271
272 #define PCIE_COMPLETION_TIMEOUT_50US_50MS 0
273 #define PCIE_COMPLETION_TIMEOUT_50US_100US 1
274 #define PCIE_COMPLETION_TIMEOUT_1MS_10MS 2
275 #define PCIE_COMPLETION_TIMEOUT_16MS_55MS 5
276 #define PCIE_COMPLETION_TIMEOUT_65MS_210MS 6
277 #define PCIE_COMPLETION_TIMEOUT_260MS_900MS 9
278 #define PCIE_COMPLETION_TIMEOUT_1S_3_5S 10
279 #define PCIE_COMPLETION_TIMEOUT_4S_13S 13
280 #define PCIE_COMPLETION_TIMEOUT_17S_64S 14
281
282 #define PCIE_DEVICE_CONTROL_OBFF_DISABLED 0
283 #define PCIE_DEVICE_CONTROL_OBFF_MESSAGE_A 1
284 #define PCIE_DEVICE_CONTROL_OBFF_MESSAGE_B 2
285 #define PCIE_DEVICE_CONTROL_OBFF_WAKE 3
286
287 typedef union {
288 struct {
289 UINT32 Reserved : 1;
290 UINT32 LinkSpeedsVector : 7;
291 UINT32 Crosslink : 1;
292 UINT32 Reserved2 : 23;
293 } Bits;
294 UINT32 Uint32;
295 } PCI_REG_PCIE_LINK_CAPABILITY2;
296
297 typedef union {
298 struct {
299 UINT16 TargetLinkSpeed : 4;
300 UINT16 EnterCompliance : 1;
301 UINT16 HardwareAutonomousSpeedDisable : 1;
302 UINT16 SelectableDeemphasis : 1;
303 UINT16 TransmitMargin : 3;
304 UINT16 EnterModifiedCompliance : 1;
305 UINT16 ComplianceSos : 1;
306 UINT16 CompliancePresetDeemphasis : 4;
307 } Bits;
308 UINT16 Uint16;
309 } PCI_REG_PCIE_LINK_CONTROL2;
310
311 typedef union {
312 struct {
313 UINT16 CurrentDeemphasisLevel : 1;
314 UINT16 EqualizationComplete : 1;
315 UINT16 EqualizationPhase1Successful : 1;
316 UINT16 EqualizationPhase2Successful : 1;
317 UINT16 EqualizationPhase3Successful : 1;
318 UINT16 LinkEqualizationRequest : 1;
319 UINT16 Reserved : 10;
320 } Bits;
321 UINT16 Uint16;
322 } PCI_REG_PCIE_LINK_STATUS2;
323
324 typedef struct {
325 EFI_PCI_CAPABILITY_HDR Hdr;
326 PCI_REG_PCIE_CAPABILITY Capability;
327 PCI_REG_PCIE_DEVICE_CAPABILITY DeviceCapability;
328 PCI_REG_PCIE_DEVICE_CONTROL DeviceControl;
329 PCI_REG_PCIE_DEVICE_STATUS DeviceStatus;
330 PCI_REG_PCIE_LINK_CAPABILITY LinkCapability;
331 PCI_REG_PCIE_LINK_CONTROL LinkControl;
332 PCI_REG_PCIE_LINK_STATUS LinkStatus;
333 PCI_REG_PCIE_SLOT_CAPABILITY SlotCapability;
334 PCI_REG_PCIE_SLOT_CONTROL SlotControl;
335 PCI_REG_PCIE_SLOT_STATUS SlotStatus;
336 PCI_REG_PCIE_ROOT_CONTROL RootControl;
337 PCI_REG_PCIE_ROOT_CAPABILITY RootCapability;
338 PCI_REG_PCIE_ROOT_STATUS RootStatus;
339 PCI_REG_PCIE_DEVICE_CAPABILITY2 DeviceCapability2;
340 PCI_REG_PCIE_DEVICE_CONTROL2 DeviceControl2;
341 UINT16 DeviceStatus2;
342 PCI_REG_PCIE_LINK_CAPABILITY2 LinkCapability2;
343 PCI_REG_PCIE_LINK_CONTROL2 LinkControl2;
344 PCI_REG_PCIE_LINK_STATUS2 LinkStatus2;
345 UINT32 SlotCapability2;
346 UINT16 SlotControl2;
347 UINT16 SlotStatus2;
348 } PCI_CAPABILITY_PCIEXP;
349
350 #define EFI_PCIE_CAPABILITY_BASE_OFFSET 0x100
351 #define EFI_PCIE_CAPABILITY_ID_SRIOV_CONTROL_ARI_HIERARCHY 0x10
352 #define EFI_PCIE_CAPABILITY_DEVICE_CAPABILITIES_2_OFFSET 0x24
353 #define EFI_PCIE_CAPABILITY_DEVICE_CAPABILITIES_2_ARI_FORWARDING 0x20
354 #define EFI_PCIE_CAPABILITY_DEVICE_CONTROL_2_OFFSET 0x28
355 #define EFI_PCIE_CAPABILITY_DEVICE_CONTROL_2_ARI_FORWARDING 0x20
356
357 //
358 // for SR-IOV
359 //
360 #define EFI_PCIE_CAPABILITY_ID_ARI 0x0E
361 #define EFI_PCIE_CAPABILITY_ID_ATS 0x0F
362 #define EFI_PCIE_CAPABILITY_ID_SRIOV 0x10
363 #define EFI_PCIE_CAPABILITY_ID_MRIOV 0x11
364
365 typedef struct {
366 UINT32 CapabilityHeader;
367 UINT32 Capability;
368 UINT16 Control;
369 UINT16 Status;
370 UINT16 InitialVFs;
371 UINT16 TotalVFs;
372 UINT16 NumVFs;
373 UINT8 FunctionDependencyLink;
374 UINT8 Reserved0;
375 UINT16 FirstVFOffset;
376 UINT16 VFStride;
377 UINT16 Reserved1;
378 UINT16 VFDeviceID;
379 UINT32 SupportedPageSize;
380 UINT32 SystemPageSize;
381 UINT32 VFBar[6];
382 UINT32 VFMigrationStateArrayOffset;
383 } SR_IOV_CAPABILITY_REGISTER;
384
385 #define EFI_PCIE_CAPABILITY_ID_SRIOV_CAPABILITIES 0x04
386 #define EFI_PCIE_CAPABILITY_ID_SRIOV_CONTROL 0x08
387 #define EFI_PCIE_CAPABILITY_ID_SRIOV_STATUS 0x0A
388 #define EFI_PCIE_CAPABILITY_ID_SRIOV_INITIALVFS 0x0C
389 #define EFI_PCIE_CAPABILITY_ID_SRIOV_TOTALVFS 0x0E
390 #define EFI_PCIE_CAPABILITY_ID_SRIOV_NUMVFS 0x10
391 #define EFI_PCIE_CAPABILITY_ID_SRIOV_FUNCTION_DEPENDENCY_LINK 0x12
392 #define EFI_PCIE_CAPABILITY_ID_SRIOV_FIRSTVF 0x14
393 #define EFI_PCIE_CAPABILITY_ID_SRIOV_VFSTRIDE 0x16
394 #define EFI_PCIE_CAPABILITY_ID_SRIOV_VFDEVICEID 0x1A
395 #define EFI_PCIE_CAPABILITY_ID_SRIOV_SUPPORTED_PAGE_SIZE 0x1C
396 #define EFI_PCIE_CAPABILITY_ID_SRIOV_SYSTEM_PAGE_SIZE 0x20
397 #define EFI_PCIE_CAPABILITY_ID_SRIOV_BAR0 0x24
398 #define EFI_PCIE_CAPABILITY_ID_SRIOV_BAR1 0x28
399 #define EFI_PCIE_CAPABILITY_ID_SRIOV_BAR2 0x2C
400 #define EFI_PCIE_CAPABILITY_ID_SRIOV_BAR3 0x30
401 #define EFI_PCIE_CAPABILITY_ID_SRIOV_BAR4 0x34
402 #define EFI_PCIE_CAPABILITY_ID_SRIOV_BAR5 0x38
403 #define EFI_PCIE_CAPABILITY_ID_SRIOV_VF_MIGRATION_STATE 0x3C
404
405 typedef struct {
406 UINT32 CapabilityId:16;
407 UINT32 CapabilityVersion:4;
408 UINT32 NextCapabilityOffset:12;
409 } PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER;
410
411 #define PCI_EXP_EXT_HDR PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER
412
413 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ADVANCED_ERROR_REPORTING_ID 0x0001
414 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ADVANCED_ERROR_REPORTING_VER1 0x1
415 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ADVANCED_ERROR_REPORTING_VER2 0x2
416
417 typedef union {
418 struct {
419 UINT32 Undefined : 1;
420 UINT32 Reserved : 3;
421 UINT32 DataLinkProtocolError : 1;
422 UINT32 SurpriseDownError : 1;
423 UINT32 Reserved2 : 6;
424 UINT32 PoisonedTlp : 1;
425 UINT32 FlowControlProtocolError : 1;
426 UINT32 CompletionTimeout : 1;
427 UINT32 CompleterAbort : 1;
428 UINT32 UnexpectedCompletion : 1;
429 UINT32 ReceiverOverflow : 1;
430 UINT32 MalformedTlp : 1;
431 UINT32 EcrcError : 1;
432 UINT32 UnsupportedRequestError : 1;
433 UINT32 AcsVoilation : 1;
434 UINT32 UncorrectableInternalError : 1;
435 UINT32 McBlockedTlp : 1;
436 UINT32 AtomicOpEgressBlocked : 1;
437 UINT32 TlpPrefixBlockedError : 1;
438 UINT32 Reserved3 : 6;
439 } Bits;
440 UINT32 Uint32;
441 } PCI_EXPRESS_REG_UNCORRECTABLE_ERROR;
442
443 typedef struct {
444 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
445 PCI_EXPRESS_REG_UNCORRECTABLE_ERROR UncorrectableErrorStatus;
446 PCI_EXPRESS_REG_UNCORRECTABLE_ERROR UncorrectableErrorMask;
447 PCI_EXPRESS_REG_UNCORRECTABLE_ERROR UncorrectableErrorSeverity;
448 UINT32 CorrectableErrorStatus;
449 UINT32 CorrectableErrorMask;
450 UINT32 AdvancedErrorCapabilitiesAndControl;
451 UINT32 HeaderLog[4];
452 UINT32 RootErrorCommand;
453 UINT32 RootErrorStatus;
454 UINT16 ErrorSourceIdentification;
455 UINT16 CorrectableErrorSourceIdentification;
456 UINT32 TlpPrefixLog[4];
457 } PCI_EXPRESS_EXTENDED_CAPABILITIES_ADVANCED_ERROR_REPORTING;
458
459 #define PCI_EXPRESS_EXTENDED_CAPABILITY_VIRTUAL_CHANNEL_ID 0x0002
460 #define PCI_EXPRESS_EXTENDED_CAPABILITY_VIRTUAL_CHANNEL_MFVC 0x0009
461 #define PCI_EXPRESS_EXTENDED_CAPABILITY_VIRTUAL_CHANNEL_VER1 0x1
462
463 typedef struct {
464 UINT32 VcResourceCapability:24;
465 UINT32 PortArbTableOffset:8;
466 UINT32 VcResourceControl;
467 UINT16 Reserved1;
468 UINT16 VcResourceStatus;
469 } PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_VC;
470
471 typedef struct {
472 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
473 UINT32 ExtendedVcCount:3;
474 UINT32 PortVcCapability1:29;
475 UINT32 PortVcCapability2:24;
476 UINT32 VcArbTableOffset:8;
477 UINT16 PortVcControl;
478 UINT16 PortVcStatus;
479 PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_VC Capability[1];
480 } PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_CAPABILITY;
481
482 #define PCI_EXPRESS_EXTENDED_CAPABILITY_SERIAL_NUMBER_ID 0x0003
483 #define PCI_EXPRESS_EXTENDED_CAPABILITY_SERIAL_NUMBER_VER1 0x1
484
485 typedef struct {
486 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
487 UINT64 SerialNumber;
488 } PCI_EXPRESS_EXTENDED_CAPABILITIES_SERIAL_NUMBER;
489
490 #define PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_DECLARATION_ID 0x0005
491 #define PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_DECLARATION_VER1 0x1
492
493 typedef struct {
494 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
495 UINT32 ElementSelfDescription;
496 UINT32 Reserved;
497 UINT32 LinkEntry[1];
498 } PCI_EXPRESS_EXTENDED_CAPABILITIES_LINK_DECLARATION;
499
500 #define PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_DECLARATION_GET_LINK_COUNT(LINK_DECLARATION) (UINT8)(((LINK_DECLARATION->ElementSelfDescription)&0x0000ff00)>>8)
501
502 #define PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_CONTROL_ID 0x0006
503 #define PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_CONTROL_VER1 0x1
504
505 typedef struct {
506 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
507 UINT32 RootComplexLinkCapabilities;
508 UINT16 RootComplexLinkControl;
509 UINT16 RootComplexLinkStatus;
510 } PCI_EXPRESS_EXTENDED_CAPABILITIES_INTERNAL_LINK_CONTROL;
511
512 #define PCI_EXPRESS_EXTENDED_CAPABILITY_POWER_BUDGETING_ID 0x0004
513 #define PCI_EXPRESS_EXTENDED_CAPABILITY_POWER_BUDGETING_VER1 0x1
514
515 typedef struct {
516 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
517 UINT32 DataSelect:8;
518 UINT32 Reserved:24;
519 UINT32 Data;
520 UINT32 PowerBudgetCapability:1;
521 UINT32 Reserved2:7;
522 UINT32 Reserved3:24;
523 } PCI_EXPRESS_EXTENDED_CAPABILITIES_POWER_BUDGETING;
524
525 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ACS_EXTENDED_ID 0x000D
526 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ACS_EXTENDED_VER1 0x1
527
528 typedef struct {
529 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
530 UINT16 AcsCapability;
531 UINT16 AcsControl;
532 UINT8 EgressControlVectorArray[1];
533 } PCI_EXPRESS_EXTENDED_CAPABILITIES_ACS_EXTENDED;
534
535 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ACS_EXTENDED_GET_EGRES_CONTROL(ACS_EXTENDED) (UINT8)(((ACS_EXTENDED->AcsCapability)&0x00000020))
536 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ACS_EXTENDED_GET_EGRES_VECTOR_SIZE(ACS_EXTENDED) (UINT8)(((ACS_EXTENDED->AcsCapability)&0x0000FF00))
537
538 #define PCI_EXPRESS_EXTENDED_CAPABILITY_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_ID 0x0007
539 #define PCI_EXPRESS_EXTENDED_CAPABILITY_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_VER1 0x1
540
541 typedef struct {
542 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
543 UINT32 AssociationBitmap;
544 } PCI_EXPRESS_EXTENDED_CAPABILITIES_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION;
545
546 #define PCI_EXPRESS_EXTENDED_CAPABILITY_MULTI_FUNCTION_VIRTUAL_CHANNEL_ID 0x0008
547 #define PCI_EXPRESS_EXTENDED_CAPABILITY_MULTI_FUNCTION_VIRTUAL_CHANNEL_VER1 0x1
548
549 typedef PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_CAPABILITY PCI_EXPRESS_EXTENDED_CAPABILITIES_MULTI_FUNCTION_VIRTUAL_CHANNEL_CAPABILITY;
550
551 #define PCI_EXPRESS_EXTENDED_CAPABILITY_VENDOR_SPECIFIC_ID 0x000B
552 #define PCI_EXPRESS_EXTENDED_CAPABILITY_VENDOR_SPECIFIC_VER1 0x1
553
554 typedef struct {
555 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
556 UINT32 VendorSpecificHeader;
557 UINT8 VendorSpecific[1];
558 } PCI_EXPRESS_EXTENDED_CAPABILITIES_VENDOR_SPECIFIC;
559
560 #define PCI_EXPRESS_EXTENDED_CAPABILITY_VENDOR_SPECIFIC_GET_SIZE(VENDOR) (UINT16)(((VENDOR->VendorSpecificHeader)&0xFFF00000)>>20)
561
562 #define PCI_EXPRESS_EXTENDED_CAPABILITY_RCRB_HEADER_ID 0x000A
563 #define PCI_EXPRESS_EXTENDED_CAPABILITY_RCRB_HEADER_VER1 0x1
564
565 typedef struct {
566 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
567 UINT16 VendorId;
568 UINT16 DeviceId;
569 UINT32 RcrbCapabilities;
570 UINT32 RcrbControl;
571 UINT32 Reserved;
572 } PCI_EXPRESS_EXTENDED_CAPABILITIES_RCRB_HEADER;
573
574 #define PCI_EXPRESS_EXTENDED_CAPABILITY_MULTICAST_ID 0x0012
575 #define PCI_EXPRESS_EXTENDED_CAPABILITY_MULTICAST_VER1 0x1
576
577 typedef struct {
578 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
579 UINT16 MultiCastCapability;
580 UINT16 MulticastControl;
581 UINT64 McBaseAddress;
582 UINT64 McReceiveAddress;
583 UINT64 McBlockAll;
584 UINT64 McBlockUntranslated;
585 UINT64 McOverlayBar;
586 } PCI_EXPRESS_EXTENDED_CAPABILITIES_MULTICAST;
587
588 #define PCI_EXPRESS_EXTENDED_CAPABILITY_RESIZABLE_BAR_ID 0x0015
589 #define PCI_EXPRESS_EXTENDED_CAPABILITY_RESIZABLE_BAR_VER1 0x1
590
591 typedef struct {
592 UINT32 ResizableBarCapability;
593 UINT16 ResizableBarControl;
594 UINT16 Reserved;
595 } PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR_ENTRY;
596
597 typedef struct {
598 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
599 PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR_ENTRY Capability[1];
600 } PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR;
601
602 #define GET_NUMBER_RESIZABLE_BARS(x) (((x->Capability[0].ResizableBarControl) & 0xE0) >> 5)
603
604 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ARI_CAPABILITY_ID 0x000E
605 #define PCI_EXPRESS_EXTENDED_CAPABILITY_ARI_CAPABILITY_VER1 0x1
606
607 typedef struct {
608 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
609 UINT16 AriCapability;
610 UINT16 AriControl;
611 } PCI_EXPRESS_EXTENDED_CAPABILITIES_ARI_CAPABILITY;
612
613 #define PCI_EXPRESS_EXTENDED_CAPABILITY_DYNAMIC_POWER_ALLOCATION_ID 0x0016
614 #define PCI_EXPRESS_EXTENDED_CAPABILITY_DYNAMIC_POWER_ALLOCATION_VER1 0x1
615
616 typedef struct {
617 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
618 UINT32 DpaCapability;
619 UINT32 DpaLatencyIndicator;
620 UINT16 DpaStatus;
621 UINT16 DpaControl;
622 UINT8 DpaPowerAllocationArray[1];
623 } PCI_EXPRESS_EXTENDED_CAPABILITIES_DYNAMIC_POWER_ALLOCATION;
624
625 #define PCI_EXPRESS_EXTENDED_CAPABILITY_DYNAMIC_POWER_ALLOCATION_GET_SUBSTATE_MAX(POWER) (UINT16)(((POWER->DpaCapability)&0x0000000F))
626
627
628 #define PCI_EXPRESS_EXTENDED_CAPABILITY_LATENCE_TOLERANCE_REPORTING_ID 0x0018
629 #define PCI_EXPRESS_EXTENDED_CAPABILITY_LATENCE_TOLERANCE_REPORTING_VER1 0x1
630
631 typedef struct {
632 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
633 UINT16 MaxSnoopLatency;
634 UINT16 MaxNoSnoopLatency;
635 } PCI_EXPRESS_EXTENDED_CAPABILITIES_LATENCE_TOLERANCE_REPORTING;
636
637 #define PCI_EXPRESS_EXTENDED_CAPABILITY_TPH_ID 0x0017
638 #define PCI_EXPRESS_EXTENDED_CAPABILITY_TPH_VER1 0x1
639
640 typedef struct {
641 PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header;
642 UINT32 TphRequesterCapability;
643 UINT32 TphRequesterControl;
644 UINT16 TphStTable[1];
645 } PCI_EXPRESS_EXTENDED_CAPABILITIES_TPH;
646
647 #define GET_TPH_TABLE_SIZE(x) ((x->TphRequesterCapability & 0x7FF0000)>>16) * sizeof(UINT16)
648
649 #pragma pack()
650
651 #endif