PciExpress21.h revision cbedba8698b1a9f6e2e440219d03a263e09d2822
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/// 25typedef 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 47typedef 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 65typedef 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 83typedef 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 96typedef 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 117typedef 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 134typedef 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 148typedef 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 166typedef 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 184typedef 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 200typedef 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 212typedef union { 213 struct { 214 UINT16 CrsSoftwareVisibility : 1; 215 UINT16 Reserved : 15; 216 } Bits; 217 UINT16 Uint16; 218} PCI_REG_PCIE_ROOT_CAPABILITY; 219 220typedef 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 230typedef 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 255typedef 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 287typedef 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 297typedef 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 311typedef 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 324typedef 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 365typedef 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 405typedef 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 417typedef 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 443typedef 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 463typedef 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 471typedef 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 485typedef 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 493typedef 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 505typedef 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 515typedef 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 528typedef 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 541typedef 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 549typedef 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 554typedef 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 565typedef 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 577typedef 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 591typedef struct { 592 UINT32 ResizableBarCapability; 593 UINT16 ResizableBarControl; 594 UINT16 Reserved; 595} PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR_ENTRY; 596 597typedef 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 607typedef 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 616typedef 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 631typedef 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 640typedef 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 652