PCIe Series — PCIe-18: Configuration Space — Type 0 Header — VLSI Trainers
PCIe Series · PCIe-18

Configuration Space — Type 0 Header

The 64-byte PCI-compatible header used by every PCIe endpoint — Vendor and Device ID, Command and Status registers, Class Code, the six Base Address Registers, Subsystem IDs, Expansion ROM, Capabilities Pointer, and the Interrupt registers. How BARs are sized, what each bit in Command/Status does, and the full 4 KB config space layout.

📋 What Configuration Space Is

Configuration space is a standardised address space separate from memory and IO space. Every PCIe function — whether an endpoint, a switch port, or a root port — has its own configuration space. Software uses configuration space to discover devices, learn their capabilities, assign memory and IO addresses, and control device behaviour.

Configuration space was inherited from PCI and is preserved in PCIe for complete software backward compatibility. A PCIe device driver written for Windows in 2005 accesses configuration registers the same way as one written in 2025. The register layout, offsets, and access rules are identical.

PCIe 4 KB Configuration Space per Function PCI-Compatible Header Offset 000h–00Fh (16 DW = 64 bytes) Type 0 (endpoint) or Type 1 (bridge) PCI-Compatible Device Space Offset 010h–0FFh (48 DW = 192 bytes) PCI Capability Structures Offset 040h–0FFh (linked list from Cap Ptr) PM, MSI, MSI-X, PCIe Capability, etc. PCIe Extended Capabilities Offset 100h–FFFh (960 DW = 3840 bytes) Offset 000h–0FFh Accessible via legacy PCI CF8/CFC mechanism AND PCIe ECAM (MMCFG) Offset 100h–FFFh Only accessible via PCIe ECAM (MMCFG)
Figure 1 — PCIe 4 KB configuration space per function. The first 64 bytes are the PCI-compatible header (Type 0 or Type 1). Bytes 64–255 contain PCI capability structures in a linked list. Bytes 256–4095 are the PCIe Extended Configuration Space accessible only via the Enhanced Configuration Access Mechanism (MMCFG/ECAM).

Two access mechanisms

Legacy PCI mechanism (CF8/CFC): writes to the Configuration Address Port at IO address 0CF8h (encoding bus/device/function/register) then reads/writes the Configuration Data Port at 0CFCh. Limited to the first 256 bytes (64 DWs) per function. All x86 systems support this.

Enhanced Configuration Access Mechanism (ECAM): the entire 4 KB per function is mapped into memory address space as a flat MMIO region. The base address of this region is advertised in ACPI (MCFG table). Address = ECAM_BASE + (Bus × 1MB) + (Device × 32 KB) + (Function × 4 KB) + Register_Offset. This is the only way to access Extended Configuration Space (offset 100h and above).

📋 Type 0 vs Type 1 Header

The Header Type register at offset 0Eh bits [6:0] determines which header layout a function uses. Only two layouts are defined:

Header TypeUsed byBARsWhat replaces BARs 2–5 in Type 1
Type 0 (value 0) Endpoints, Root Complex internal functions, multi-function device functions Six 32-bit BARs (BAR0–BAR5) at offsets 10h–24h — (Type 0 has all six)
Type 1 (value 1) Bridges — every switch port, root port, PCIe-to-PCI bridge Two 32-bit BARs (BAR0–BAR1) at offsets 10h–14h Bus Number registers + Memory/IO Base/Limit windows (offsets 18h–2Ch)

Bit 7 of the Header Type register is the Multi-Function Device bit. If set to 1, the device implements more than one function and software should probe functions 0–7. If bit 7 = 0, only function 0 exists. Software uses this to avoid unnecessary configuration reads on a single-function device.

This post covers Type 0 headers — the layout used by every PCIe endpoint including NVMe drives, GPUs, NICs, and USB controllers. Type 1 headers are covered in PCIe-19.

📋 Full Type 0 Header Layout

Type 0 Configuration Header — 16 DWs (64 Bytes) Byte 3 Byte 2 Byte 1 Byte 0 DW Device ID [15:0] Vendor ID [15:0] 00h Status [15:0] Command [15:0] 04h Class Code [23:0] Revision ID [7:0] 08h BIST [7:0] Header Type [7:0] Latency Timer [7:0] Cache Line Size [7:0] 0Ch BAR0 — Base Address Register 0 [31:0] 10h BAR1 — Base Address Register 1 [31:0] 14h BAR2 — Base Address Register 2 [31:0] 18h BAR3 — Base Address Register 3 [31:0] 1Ch BAR4 — Base Address Register 4 [31:0] 20h BAR5 — Base Address Register 5 [31:0] 24h CardBus CIS Pointer (legacy, unused in PCIe) [31:0] 28h Subsystem Device ID [15:0] Subsystem Vendor ID [15:0] 2Ch Expansion ROM Base Address [31:0] 30h Reserved [31:8] Capabilities Pointer [7:0] 34h
Figure 2 — Type 0 header, DWs 0–13 (offsets 00h–34h). Not shown: DW14 (38h) is Reserved, DW15 (3Ch) holds Max_Lat [31:24] / Min_Gnt [23:16] / Interrupt Pin [15:8] / Interrupt Line [7:0]. The six BARs (purple) occupy the largest contiguous block. Command and Status (green) control and report device capability and errors.

📋 Vendor ID and Device ID

These two 16-bit read-only registers at offset 00h are the first thing software reads during enumeration. Together they uniquely identify the hardware.

RegisterOffsetWidthAccessPurpose and notes
Vendor ID 00h bits [15:0] 16 bits RO Assigned by the PCI-SIG to device manufacturers. Must be unique per company. Intel = 8086h, NVIDIA = 10DEh, AMD = 1022h, Broadcom = 14E4h. Value FFFFh means no device present — the bus returns 0xFFFF when nothing is attached. Software checks for FFFFh to detect empty slots during enumeration.
Device ID 00h bits [31:16] 16 bits RO Assigned by the vendor to identify a specific product. Combined with Vendor ID forms a globally unique device identifier. The same chip used in multiple products may have the same Device ID; variants are distinguished by Subsystem IDs.
Enumeration uses Vendor ID as the primary probe. Software reads offset 00h (which returns both Vendor ID and Device ID in one 32-bit read) for every Bus/Device/Function combination. If Vendor ID = 0xFFFF, nothing is present at that address. This is how OS enumeration scans the entire PCIe topology — reading offset 00h at every possible BDF coordinate.

📋 Command Register

The Command register at offset 04h bits [15:0] is the primary control register for the device. Most bits default to 0 after reset — the device is largely inactive until software configures it. Writing a 1 to a bit enables the corresponding capability.

Command Register — 16 bits at Offset 04h [15:0] 15:11 Rsvd 10 INTx Dis 9 FBB En 8 SERR En 7 Rsvd 6 Parity Err 5 VGA Pal 4 MWI En 3 Spec Cyc 2 Bus Mstr 1 Mem Sp En 0 IO Sp En Most Important Bits for PCIe Drivers Bit 0 IO Space Enable: allows device to claim IO address cycles. Disabled by default. Legacy only — PCIe discourages IO space. Bit 1 Memory Space Enable: allows device to claim memory address cycles targeting its BARs. Must be set before any MMIO access. Bit 2 Bus Master Enable: allows device to initiate DMA (MRd/MWr). Without this bit, the device cannot be a requester. Set by OS after BAR assignment.
Figure 3 — Command register bit fields. Bits 0, 1, and 2 are the three most important for normal operation. Bit 8 (SERR Enable) enables forwarding of fatal error messages. Bit 10 (INTx Disable) disables legacy interrupt lines when MSI/MSI-X is used.
BitNameResetMeaning when set to 1
0I/O Space Enable0Device responds to IO address cycles targeting its IO BARs. Legacy only — PCIe discourages IO space use.
1Memory Space Enable0Device responds to memory address cycles targeting its memory BARs. Must be set before any driver MMIO access to BAR space. Set to 0 during BAR programming to prevent incorrect claims.
2Bus Master Enable0Device is allowed to initiate TLPs as a Requester (DMA reads and writes). Without this, the device is a target only — it responds to requests but cannot generate them. IOMMU must be configured before this is set.
3Special Cycle Enable0Legacy PCI feature — device responds to PCI Special Cycle commands. Not used in native PCIe.
4Memory Write and Invalidate Enable0Legacy PCI feature — enables MWI transactions. Not used in native PCIe.
5VGA Palette Snoop0Legacy VGA feature. Ignore for non-VGA PCIe devices.
6Parity Error Response Enable0Device must take action when a parity error is detected. If 0, device ignores parity errors (except setting Detected Parity Error in Status).
7Reserved (IDSEL Stepping)0Legacy PCI only. Must be 0 in PCIe.
8SERR# Enable0Device sends ERR_FATAL or ERR_NONFATAL messages upstream when a system error occurs. Must be set for AER (Advanced Error Reporting) to be useful.
9Fast Back-to-Back Enable0Legacy PCI only. Has no effect in PCIe — always reads as 0 on PCIe-native devices.
10Interrupt Disable0When set, disables the device from asserting INTx legacy interrupt pin signals. Should be set by the driver when switching to MSI or MSI-X interrupt mode.
[15:11]Reserved0Must return 0 when read. Writes ignored.

📋 Status Register

The Status register at offset 04h bits [31:16] reports conditions that have occurred. Most bits are sticky — they latch when the condition occurs and stay set until software explicitly clears them by writing a 1 to the bit (write-1-to-clear). Writing a 0 has no effect.

BitNameAccessMeaning
[18:16]ReservedROReturn 0.
19Interrupt StatusROWhen 1: device is asserting a legacy INTx interrupt. Read-only snapshot — cannot be cleared by writing. Only valid when Interrupt Disable (Command bit 10) is 0.
20Capabilities ListROWhen 1: device implements a Capabilities linked list starting at the Capabilities Pointer (offset 34h). All PCIe devices must have this set to 1 because a PCIe Capability structure is mandatory.
2166 MHz CapableROLegacy PCI only. Always 0 on PCIe-native devices.
22ReservedROReturns 0.
23Fast Back-to-Back CapableROLegacy PCI only. Always 0 on PCIe-native devices.
24Master Data Parity ErrorRW1CDevice acting as Bus Master detected a parity error. Set when a poisoned TLP is received and Parity Error Response Enable (Command bit 6) is set. Latches — cleared by writing 1.
[26:25]DEVSEL TimingROLegacy PCI only. Returns 01b (Medium timing) for PCIe-native devices for compatibility.
27Signaled Target AbortRW1CDevice sent a Completion with CA (Completer Abort) status — it aborted the transaction. Latches — cleared by writing 1.
28Received Target AbortRW1CDevice received a Completion with CA status while it was a Requester. Latches — cleared by writing 1.
29Received Master AbortRW1CDevice received a Completion with UR (Unsupported Request) status while it was a Requester. Latches — cleared by writing 1.
30Signaled System ErrorRW1CDevice sent an ERR_FATAL message. Only set if SERR# Enable (Command bit 8) was set. Latches — cleared by writing 1.
31Detected Parity ErrorRW1CDevice received a TLP with the EP (Error Poison) bit set, regardless of the Parity Error Response Enable bit. Always latches. Cleared by writing 1.
RW1C — Write 1 to Clear. Sticky status bits are cleared by writing a 1 to the bit position — not a 0. This unusual access model is designed for multi-driver safety: if two drivers both read Status, both see the error bit. Either one can clear it by writing 1. Writing 0 is a no-op, so a driver cannot accidentally clear a bit it didn’t know was set by writing the whole register.

📋 Revision ID and Class Code

RegisterOffsetWidthPurpose
Revision ID 08h [7:0] 8 bits RO Vendor-specific hardware revision. Combined with Device ID, lets software distinguish between chip steppings. Value 00h is valid (first silicon). No standard meaning — purely vendor-defined.
Class Code 08h [31:8] 24 bits RO Three sub-fields: Base Class [31:24] (broad category — storage, display, network, bridge), Sub-Class [23:16] (more specific type), Programming Interface [15:8] (optional detail, 00h if not applicable). Lets the OS load a generic driver when no specific driver is found. Examples below.
Base ClassSub-ClassProg IFDevice type
01h (Storage)08h (NVM)02hNVMe controller — OS loads NVMe driver automatically
03h (Display)00h (VGA)00hVGA controller — OS loads generic display driver
02h (Network)00h (Ethernet)00hEthernet controller
04h (Multimedia)03h (HD Audio)00hHigh-Definition Audio controller
0Ch (Serial Bus)03h (USB)30hUSB XHCI (USB 3.x) controller
06h (Bridge)04h (P2P)00hPCI-to-PCI bridge (Type 1 header devices)
FFh (Unclassified)Device does not fit any standard class

📋 Header Type, BIST, Cache Line, Latency

RegisterOffsetAccessPurpose
Cache Line Size 0Ch [7:0] RW Legacy PCI concept. Specifies the system cache line size in units of 32-bit DWs. Example: 10h (16 DWs = 64 bytes) for typical x86 systems. Used by legacy PCI MWI (Memory Write and Invalidate) transactions. Has no operational effect in native PCIe — ignored by most PCIe devices, but BIOS typically programs it anyway for PCI backward compatibility.
Latency Timer 0Ch [15:8] RW Legacy PCI bus master latency timer. Specifies the minimum number of PCI clock cycles a bus master can hold the bus. Not relevant in PCIe (point-to-point, no shared bus). Returns 0 or is ignored on native PCIe devices.
Header Type 0Ch [22:16] RO Bits [6:0] = 0 for Type 0 (endpoint), 1 for Type 1 (bridge). Bit 7 = Multi-Function Device bit. If bit 7 = 1, probe all 8 functions (0–7). If bit 7 = 0, only function 0 exists.
BIST 0Ch [31:24] RW / RO Built-In Self Test. Bit 7: BIST Capable (RO) — device supports self-test. Bit 6: Start BIST (RW) — software writes 1 to trigger the test. Device clears this bit when done. Bits [3:0]: Completion Code — 0 = test passed, non-zero = specific failure code. Bits [5:4] reserved. If bit 7 = 0, BIST not supported and writing bit 6 has no effect.

📋 Base Address Registers (BARs)

The six BARs (offsets 10h–24h) are the mechanism by which a device requests memory and IO address space from the system. The device designer hard-codes the lower bits to specify the type and size of space needed. Software reads these bits to discover the request, then programs the upper bits with the base address of the allocated region.

A Type 0 header has six 32-bit BARs. A 64-bit memory BAR uses two consecutive 32-bit slots (e.g. BAR0+BAR1 form one 64-bit BAR). Unimplemented BARs are hardwired to all zeros and read back as 0 — software recognises this as “not implemented” and skips allocation.

Memory Space Enable and BAR programming. Before programming BARs, software clears the Memory Space Enable bit (Command bit 1) and the I/O Space Enable bit (Command bit 0). This prevents the device from accidentally claiming transactions while its BARs are being written with temporary values (all-1s for sizing). After all BARs are programmed with correct base addresses, software re-enables the relevant bits.

📋 BAR Sizing — How Software Discovers Space Needed

The device designer hardcodes the lower N bits of each BAR to specific values that encode the size of the requested region. Software cannot know the size just by reading the uninitialized BAR. Instead, it uses a three-step procedure:

  1. Write all 1s to the BARconfig_write(offset, 0xFFFFFFFF). The lower hardcoded bits are unaffected. Only the writable upper bits flip to 1.
  2. Read the BAR back. The value returned reveals which bits are actually writable — the lower fixed bits remain at their original values.
  3. Find the lowest set bit in the non-fixed region — this is the alignment bit. Size = 2^(position of lowest writable 1-bit). For example, if the lowest writable bit is bit 12, size = 2¹² = 4 KB.
BAR Sizing — Three Steps to Discover Requested Space ① Before: uninitialized XXXX XXXX XXXX 0000 Upper bits: unknown (X) Lower bits: hardcoded by designer Bits [3:0] = 0000: non-prefetchable memory, 32-bit, size unknown ② Write all 1s, read back 1111 1111 1111 0000 Upper bits all flip to 1 (writable) Lower bits stay at hardcoded values Lowest writable bit = bit 12 → requested size = 2¹² = 4 KB ③ Write base address F900_0000h Software writes the base address of the 4 KB region it allocated Device now claims all accesses to F900_0000h – F900_0FFFh
Figure 4 — BAR sizing procedure. Writing all-1s to a BAR forces all writable bits high. The lowest bit position that returns 1 identifies the required alignment and therefore the size. Software then allocates a 4 KB block from available address space and writes the base address back to the BAR. The device uses this to claim matching TLPs.

After programming all BARs, software re-enables Memory Space Enable and/or I/O Space Enable in the Command register. From this point, any TLP with an address that falls within a programmed BAR range is claimed and processed by the device.

📋 BAR Types — Memory vs IO, 32 vs 64-bit, Prefetchable

The lower bits of each BAR are hardcoded by the device designer and reveal the type of address space requested:

BAR Lower-Bit Encodings — Memory BAR vs IO BAR Memory BAR (bit 0 = 0) Bit: 31 Base Address [31:4] (writable) Pref[3] Typ[2:1] 0 Bit 0 = 0 always: identifies Memory BAR Bits [2:1] Type: 00=32-bit · 10=64-bit · 01=reserved (20-bit/legacy) Bit 3 Prefetchable: 0=non-prefetchable · 1=reads have no side-effects 64-bit BAR: bits [2:1]=10b, this BAR + next BAR together hold 64-bit address Prefetchable=1: bridge may speculatively read ahead · write merging OK IO BAR (bit 0 = 1) Bit: 31 IO Base Address [31:2] (writable) 0 1 Bit 0 = 1 always: identifies IO BAR Bit 1: Reserved (always 0) Bits [31:2]: IO base address (4-byte aligned minimum) IO space strongly discouraged in PCIe for native devices Only used for backward compatibility with legacy software
Figure 5 — BAR type encoding. Bit 0 distinguishes memory BAR (0) from IO BAR (1). For memory BARs, bits [2:1] encode 32-bit vs 64-bit, and bit 3 encodes prefetchable. A 64-bit memory BAR requires two consecutive 32-bit BAR slots — the first holds the lower 32 bits of the address, the second holds the upper 32 bits.
BAR typeBit 0Bits [2:1]Bit 3BAR slots usedTypical use
32-bit non-prefetchable memory00001 (single 32-bit)Control/status registers
32-bit prefetchable memory00011 (single 32-bit)Read-only data regions (rare in 32-bit)
64-bit non-prefetchable memory01002 (pair of 32-bit)Large control register spaces above 4 GB
64-bit prefetchable memory01012 (pair of 32-bit)GPU framebuffer, NVMe queues, large DMA windows
IO space1n/an/a1 (single 32-bit)Legacy COM/LPT port compatibility only
Not implementedReads all 0sUnused BAR slots; software skips allocation

📋 CardBus CIS Pointer

Offset 28h (DW 10). This register is a legacy pointer to the CardBus Card Information Structure — a format used by CardBus (the 32-bit successor to PC Card) to describe the card to the host. In a PCIe device this field has no function and must return 0. Software and drivers ignore it. It exists only because the PCIe Type 0 header is layout-compatible with the original PCI Type 0 header which included this field.

📋 Subsystem Vendor ID and Subsystem Device ID

Offset 2Ch. These two 16-bit read-only registers are assigned by the board/card manufacturer, not by the chip manufacturer. They allow identification of the specific product SKU or reference design in cases where many products share the same chip (same Vendor ID + Device ID) but differ in configuration, memory size, cooling, or firmware.

ExampleVendor IDDevice IDSubsystem Vendor IDSubsystem Device ID
NVIDIA GA102 chip (RTX 3080)10DEh2206h10DEh (NVIDIA FE)1459h
Same chip, ASUS variant10DEh2206h1043h (ASUS)8777h
Same chip, EVGA variant10DEh2206h3842h (EVGA)2477h

Operating systems and drivers use Subsystem IDs to load card-specific firmware, VBIOS, fan profiles, or OC settings. The OS device driver database (INF files on Windows, modalias on Linux) can match on Vendor+Device+Subsystem combinations to load the exact right configuration.

📋 Expansion ROM Base Address

Offset 30h. The Expansion ROM BAR holds the base address of the device’s option ROM — a block of firmware code that runs at POST time to initialise the hardware before the OS loads. Network boot (PXE), GPU BIOS, and RAID controller initialisation are classic uses.

The register format is similar to a memory BAR but with bit 0 as an Enable bit rather than a type indicator. Bits [10:1] are hardcoded to 0 (making the ROM addressable at minimum on 2 KB boundaries; in practice typically 4 KB or larger). The upper bits hold the base address once software programs it.

If a device has no ROM, this register reads back as all zeros regardless of what is written to it. Software checks this by writing all-1s and reading back — if bits [31:11] are all 0, no Expansion ROM is present.

📋 Capabilities Pointer

Offset 34h bits [7:0]. This byte is the offset (within configuration space) of the first entry in the PCI Capabilities linked list. Capabilities are optional feature structures that extend the base header. They live in the 192-byte device-specific region (offsets 40h–FFh) of the PCI-compatible space.

Capabilities Linked List — From Cap Ptr to End Type 0 Hdr Cap Ptr = 40h offset 34h Cap ID = 01h Power Mgmt Cap Next Cap Ptr = 60h Cap ID = 05h MSI Capability Next Cap Ptr = 80h Cap ID = 10h PCIe Capability Next Cap Ptr = 00h Ptr=00h → End Each capability structure starts with two fixed bytes: Byte 0: Capability ID (01h=PM · 05h=MSI · 10h=PCIe · 11h=MSI-X) Byte 1: Next Capability Pointer (00h = end of list) Status register bit 20 (Capabilities List) = 1 means this list is present — mandatory for all PCIe devices
Figure 6 — Capabilities linked list. The Capabilities Pointer at offset 34h points to the first capability structure. Each structure’s second byte points to the next. The list ends when Next Pointer = 00h. Software walks this list to discover PM, MSI, MSI-X, PCIe Capability, and extended capability structures.
Capability IDStructure nameRequired in PCIe?
01hPower Management CapabilityMandatory for all PCIe devices
05hMSI (Message Signalled Interrupts)Mandatory for endpoints
10hPCIe Capability (Link Control, Link Status, Device Control, Device Status)Mandatory for all PCIe devices
11hMSI-X (Extended MSI with table in BAR space)Optional but common in high-performance devices
03hVital Product Data (VPD)Optional
09hVendor-Specific CapabilityOptional
The Capabilities Pointer must be DWORD aligned. The pointer value is always aligned to a 4-byte boundary — bits [1:0] are hardwired to 00b and should be masked off before use. A device that has no capabilities must set Status bit 20 to 0 and the Capabilities Pointer to 00h.

📋 Interrupt Pin and Interrupt Line

RegisterOffsetAccessPurpose
Interrupt Line 3Ch [7:0] RW System interrupt vector number (0–254) as assigned by the OS/BIOS. Maps the device’s INTx legacy interrupt to a specific IRQ line in the interrupt controller. Value 255 (FFh) means “not connected.” This field has no operational effect on hardware — it is purely a software-managed annotation field. Drivers read this to know which IRQ to attach a handler to for legacy INTx interrupts.
Interrupt Pin 3Ch [15:8] RO Indicates which legacy PCI interrupt pin this function uses: 0 = no interrupt, 1 = INTA#, 2 = INTB#, 3 = INTC#, 4 = INTD#. This is hardcoded by the device designer. Most single-function PCIe endpoint devices use INTA# (value 1). When MSI or MSI-X is used, this field is ignored at runtime but remains as a fixed declaration of legacy intent.
Min_Gnt 3Ch [23:16] RO Legacy PCI only. Minimum grant time the device needs when it has the bus. Has no effect in PCIe (no shared bus). Typically 0 in native PCIe devices.
Max_Lat 3Ch [31:24] RO Legacy PCI only. Maximum latency tolerance before device suffers data loss. Has no effect in PCIe. Typically 0 in native PCIe devices.
INTx is legacy. All modern PCIe drivers use MSI or MSI-X for interrupts. Legacy INTx interrupt pin signalling is emulated in PCIe via INTx Message TLPs (Assert_INTx / Deassert_INTx) rather than a real wire. The Interrupt Line and Interrupt Pin registers remain for backward compatibility with legacy PCI drivers that still probe these fields, but drivers should set Interrupt Disable (Command bit 10) and switch to MSI/MSI-X as early as possible.

📋 Extended Configuration Space — Offset 100h onwards

PCIe extends the original 256-byte PCI configuration space to 4 KB per function. The region from offset 100h to FFFh (3840 bytes = 960 DWs) is the PCIe Extended Configuration Space, accessible only via ECAM (MMCFG). Legacy CF8/CFC IO-indirect access cannot reach this region.

Extended capabilities use a different linked list format than PCI capabilities. Each PCIe Extended Capability structure starts with a 32-bit header:

Extended Cap IDStructureKey function
0001hAdvanced Error Reporting (AER)Detailed error logging, correctable/uncorrectable error status, header log, TLP prefix log
0002hVirtual Channel (VC)Configures VC TC mapping, VC arbitration
0003hDevice Serial Number (DSN)64-bit globally unique serial number
0004hPower BudgetingSlot power allocation for hot-plug controllers
000BhVendor-Specific Extended Capability (VSEC)Vendor-defined extended registers
000DhAccess Control Services (ACS)Controls peer-to-peer DMA, AT=10 validation
000FhATS (Address Translation Services)IOMMU translation caching negotiation
0018hLTR (Latency Tolerance Reporting)Device advertises its memory and snoop latency tolerance
0019hL1 PM SubstatesASPM L1.1 / L1.2 sub-states for deeper power savings
0026hPhysical Layer 16.0 GT/s (Gen 4)Equalization status, lane margining, retimer support
002AhPhysical Layer 32.0 GT/s (Gen 5)Gen 5 equalization and signal integrity
002BhAlternate ProtocolCXL and other PCIe-based protocols negotiate here

Configuration Space in Gen 6

The Type 0 header layout, all register definitions, all bit positions, the Capabilities Pointer, the Extended Configuration Space structure — everything described in this post — is completely unchanged in Gen 6. Configuration space is a software-visible abstraction above the Physical Layer. Gen 6 changes only the Physical Layer.

What Gen 6 adds to configuration space is a few new Extended Capability structures:

Driver and firmware code does not change for Gen 6. A driver that reads Vendor ID at offset 00h, programs BARs, sets Bus Master Enable, and walks the Capabilities list works identically whether the PCIe link is running at 2.5 GT/s Gen 1 or 64 GT/s Gen 6. The hardware handles all the Physical Layer complexity invisibly. Configuration space is the stable, version-independent software API that spans the entire PCIe generation history.

📋 Quick Reference

RegisterOffsetAccessKey rule or value
Vendor ID00h [15:0]ROPCI-SIG assigned. FFFFh = no device. First thing software reads during enumeration.
Device ID00h [31:16]ROVendor-assigned product identifier. Unique within a vendor.
Command04h [15:0]RWBit 0: IO Enable · Bit 1: Memory Enable · Bit 2: Bus Master Enable · Bit 8: SERR Enable · Bit 10: INTx Disable. All default 0 after reset.
Status04h [31:16]mixedBit 20: Capabilities List present (must be 1 for PCIe). Bits [31:24]: error flags — RW1C (write 1 to clear).
Revision ID08h [7:0]ROVendor-specific chip revision. 00h = first silicon. No standard meaning.
Class Code08h [31:8]ROBase Class [31:24] · Sub-Class [23:16] · Prog IF [15:8]. Used by OS for driver matching.
Cache Line Size0Ch [7:0]RWSystem cache line in DWs. BIOS programs to 10h (64 bytes). No effect on native PCIe operations.
Header Type0Ch [22:16]ROBits [6:0] = 0 for Type 0. Bit 7 = Multi-Function Device (probe functions 0–7 if set).
BIST0Ch [31:24]mixedBit 7 RO: BIST capable. Bit 6 RW: Start BIST. Bits [3:0] RO: result (0 = pass).
BAR0–BAR510h–24hmixedSix 32-bit slots. 64-bit BAR uses two slots. Bit 0=0 → memory, bit 0=1 → IO. Bits [2:1]: 00=32-bit, 10=64-bit. Bit 3: prefetchable. Write all-1s then read to size.
CardBus CIS28hROAlways 0 in PCIe. Legacy CardBus field, not used.
Subsystem Vendor ID2Ch [15:0]ROCard/board manufacturer’s PCI-SIG ID. Distinguishes OEM variants of same chip.
Subsystem Device ID2Ch [31:16]ROCard/board manufacturer’s product ID. Used by driver database for SKU-specific firmware.
Expansion ROM30hmixedBit 0: Enable. Bits [10:1]: hardwired 0. Bits [31:11]: base address (RW). Size via write-all-1s procedure.
Capabilities Pointer34h [7:0]ROOffset to first PCI Capability structure. Must be DWORD aligned. Mask bits [1:0] before use. 00h if no capabilities (but PCIe requires capabilities, so never 00h).
Interrupt Line3Ch [7:0]RWOS/BIOS writes the system IRQ number here. Software annotation only — no hardware effect.
Interrupt Pin3Ch [15:8]RO1=INTA# · 2=INTB# · 3=INTC# · 4=INTD# · 0=none. Hardcoded by device designer.
Extended Config Space100h–FFFhvariesOnly via ECAM (MMCFG). PCIe Extended Capabilities linked list with 32-bit headers (16-bit Cap ID + version + next offset). AER, ATS, VC, DSN, LTR, L1SS, Gen 4/5/6 PHY caps.
Scroll to Top