본문으로 건너뛰기
PCIe Deep Dive · 3/19

Ch 3: Configuration Space — 4 KB ECAM·Capability Linked List

· Hawk · 12분 읽기

#한 줄 요약

“Configuration Space는 PCIe device의 명함과 다이얼입니다.” — 처음 256 byte는 PCI Local Bus에서 정의된 영역, 다음 3840 byte는 PCIe Extended. Type 0 header (EP)·Type 1 header (Bridge) 두 형식, Capability linked listPCI-PM·MSI·PCIe Cap·Power Budgeting 같은 기능을 체인으로 연결합니다. ECAM이 그 4 KB를 MMIO로 매핑합니다.

Ch 2 TLP에서 Configuration TLP의 라우팅 방식을 봤습니다. 이 장은 Configuration TLP가 읽고 쓰는 4 KB 영역의 layout을 본격적으로 분해합니다.

#Configuration Space 4 KB

영역크기비고
PCI Configuration256 byte (offset 0x00 ~ 0xFF)원본 PCI Local Bus 정의
PCIe Extended3840 byte (offset 0x100 ~ 0xFFF)PCIe가 추가, Extended Capability 영역

각 device·function이 4 KB Configuration Space를 보유. Multi-function devicefunction별로 4 KB. Multi-host MR-IOV 같은 경우는 더 복잡.

#Type 0 vs Type 1 Header

처음 *64 byte (0x00 ~ 0x3F)*가 header. 두 가지 형식:

Type사용식별
Type 0EndpointBit 0x0E[6
] = 0x00
Type 1Bridge·Root Port·Switch PortBit 0x0E[6
] = 0x01

Switch downstream port·root portType 1. 그 아래 device로 향하는 routingprimary·secondary·subordinate bus 번호가 필요해서 Type 0와 layout 다름.

#Type 0 Header (Endpoint)

Offset필드의미
0x00Vendor IDPCI-SIG 부여
0x02Device IDVendor 부여
0x04Commandenable·bus master·memory 등 control
0x06Statuserror·capability 등
0x08Revision ID·Class Codedevice class 분류
0x0CCache Line Size·Latency Timer·Header Typeheader 종류 식별
0x10BAR0Base Address Register
0x14BAR1
0x18BAR2
0x1CBAR3
0x20BAR4
0x24BAR5
0x28Cardbus CIS Pointer(대부분 unused)
0x2CSubsystem Vendor·Subsystem DeviceOEM 식별
0x30Expansion ROM BARoption ROM
0x34Capabilities Pointercapability chain 시작 offset
0x3CInterrupt Line·Pin·Min_Gnt·Max_Latlegacy 인터럽트

#Type 1 Header (Bridge·Root Port)

Offset필드의미
0x00~0x0C(Type 0와 동일)identity·control
0x10BAR0Bridge 자체 MMIO
0x14BAR1
0x18Primary·Secondary·Subordinate Bus·Sec Latencybus routing
0x1CI/O Base·Limit·Secondary StatusI/O range
0x20Memory Base·Limitnon-prefetch memory range
0x24Prefetchable Memory Base·Limitprefetchable range
0x28~0x2CPrefetchable Base·Limit Upper 3264-bit prefetchable
0x30I/O Base·Limit Upper 16
0x34Capabilities Pointer
0x38Expansion ROM BAR
0x3CInterrupt·Bridge Control

Secondary·Subordinate bus 번호Type 1의 핵심. upstream에서 보낸 Config TLP어떤 bus로 forward할지 결정.

#Capabilities Pointer·Capability List

*Capabilities Pointer (offset 0x34)*가 capability chain의 첫 entry offset. 각 capability는 3 byte 헤더:

필드bit의미
Capability ID0~7capability 종류
Next Pointer8~15다음 capability offset (0이면 끝)
(Capability별 데이터)16~capability 본문

대표적인 PCI Capability ID:

ID의미
0x01Power Management
0x05MSI
0x10PCI Express (이게 PCIe Cap)
0x11MSI-X
0x12SATA Data·Index Config
0x13Advanced Features

#PCIe Capability (ID 0x10)

PCIe Capdevice·link·slot·root control/status를 묶음:

Sub-registeroffset의미
PCIe Capabilities+0x02device type·slot·int message #
Device Capabilities+0x04max payload·extended tag 지원 등
Device Control+0x08max payload·MaxReadReq·extended tag enable·NS·RO
Device Status+0x0Acorrectable·non-fatal·fatal·unsupported error
Link Capabilities+0x0Cmax speed·max width·ASPM 지원
Link Control+0x10ASPM enable·link disable·retrain
Link Status+0x12current speed·current width·training
Slot Capabilities·Control·Status+0x14~+0x1Ahot-plug
Root Control·Status+0x1C~+0x20PME·root port specific

lspci -vv | grep -A 10 "Express Endpoint" 출력의 LnkCap·LnkSta·LnkCtl이 이 영역들. PCIe tuning의 핵심.

#Extended Capability (offset 0x100~)

4 KB 영역에는 Extended Capability가 줄지어 있습니다. PCIe 3.0 이상 기능은 대부분 여기에:

ID명칭
0x0001Advanced Error Reporting (AER)
0x0002Virtual Channel
0x0003Device Serial Number
0x0009Vendor-Specific (VSEC)
0x000BVendor-Specific Extended (DVSEC)
0x000FAccess Control Services (ACS)
0x0010SR-IOV
0x0011MR-IOV
0x0018Latency Tolerance Reporting (LTR)
0x001DDownstream Port Containment (DPC)
0x001EL1 PM Substates
0x0023Resizable BAR (ReBAR)
0x0026Address Translation Services (ATS)
0x0027TPH Requester
0x002AProcess Address Space ID (PASID)
0x002EData Object Exchange (DOE)
0x0030Integrity & Data Encryption (IDE)

각 Extended Cap는 4 byte 헤더 (Cap ID + Version + Next Pointer 12-bit). 자세한 layout은 PCIe Base Spec § 7.

#DVSEC — Vendor 확장

*DVSEC (Designated Vendor-Specific Extended Capability, ID 0x000B)*은 vendor가 자기 capability를 표준 형식으로 광고하는 영역. CXL이 DVSEC로 자기를 식별합니다:

필드의미
DVSEC Header 1Length·Vendor ID
DVSEC Header 2Revision·DVSEC ID
DVSEC Bodyvendor-specific 내용

CXL 1.1+ device는 DVSEC ID = 0x0~0x10 사이 여러 entry로 자기를 광고. CXL Internals Ch 6에서 자세히.

#ECAM — Enhanced Configuration Access Mechanism

원본 PCI는 *I/O port (0xCF8·0xCFC)*로 Configuration access. PCIe는 MMIO mappingECAM을 표준화:

영역의미
ECAM base addressUEFI·ACPI가 지정 (보통 0xE0000000 근처)
1 device·function4 KB
1 bus4 KB × 256 (32 device × 8 function) = 1 MB
1 PCIe segment (256 bus)256 MB

ECAM 주소 계산: ECAM_BASE + (Bus << 20) + (Dev << 15) + (Func << 12) + Reg. segment 단위로 여러 ECAM 영역 운영도 가능.

Linux는 ACPI MCFG 테이블에서 ECAM 영역을 읽음. dmesg | grep MCFG로 확인 가능.

#Configuration Access — Type 0 vs Type 1

Configuration TLPBus 번호에 따라 routing:

시나리오적용
Bus 번호 = bridge의 secondarybridge가 Type 0로 변환해 그 bus로 보냄
Bus 번호 ∈ bridge의 secondary~subordinate 범위bridge가 Type 1으로 forward
Bus 번호가 범위 밖bridge가 unsupported request 반환

Type 1 → Type 0 변환이 bridge·switch downstream portenumeration 핵심 동작.

#Latency Tolerance Reporting (LTR)

LTR은 *EP가 RC에게 “지금 N ns latency까지 견딜 수 있다”*고 알려주는 메커니즘:

비트의미
Snoop Latency Value·Scalesnoop 가능한 max latency
No-snoop Latency Value·Scalesnoop 안 하는 max latency

RC는 이 정보로 deeper power state로 진입 결정. 모바일·저전력 platform의 핵심.

#자주 하는 실수

#”Configuration Space는 256 byte”

PCI는 256 byte, PCIe는 4 KB. *Extended Cap (AER·SR-IOV·ATS 등)*은 256 byte 너머에 있음. 0x100 이상 accessConfiguration TLP로 안 되면 ECAM이 활성 안 됨legacy CF8/CFC만 동작.

#”Vendor ID 0xFFFF면 device 없음”

Vendor ID 0xFFFF는 “device 없음” 표시. 일부 broken device0xFFFF 반환해서 enumeration이 device 미존재로 인식. 데이터시트로 vendor ID 확인 필수.

#”PCIe Cap이 곧 PCIe device 인증”

PCIe Capability ID 0x10은 해당 device가 PCIe임을 명시. 다만 없어도 PCIe device가 있음 — 일부 legacy compatible device. BIOS·UEFI가 ECAM 매핑하면 물리적 PCIe slot임은 거의 확실.

#”Capability chain은 짧다”

복잡한 device(NIC·NVMe)는 Cap 510개 + Extended Cap 1020개. NIC 같은 경우 MSI·MSI-X·SR-IOV·ARI·ATS·PASID·PRI·AER·DPC·LTR·DOE·IDE 모두 가질 수 있음.

#”ECAM이 동작하면 모든 device 보임”

ECAM은 UEFI·ACPI MCFG에 등록된 영역만 매핑. secondary domain·virtio별도 controller. lspci -Ddomain·bus 분리 확인.

#정리

  • Configuration Space는 4 KB — 256 byte PCI + 3840 byte PCIe Extended.
  • Type 0 (EP)·Type 1 (Bridge) 두 헤더 형식. Type 1bus routing 정보.
  • *Capabilities Pointer (0x34)*가 capability linked list 시작. PM·MSI·PCIe Cap·MSI-X 등 chain.
  • Extended Capability (0x100~)에 AER·SR-IOV·DPC·ATS·PASID·DOE·IDE 등 PCIe 3.0+ 기능.
  • DVSECvendor 확장 영역 — CXL이 자기 식별에 사용.
  • ECAM4 KB ConfigurationMMIO로 매핑. UEFI MCFG에 등록.
  • Type 1 → Type 0 변환enumeration의 핵심 — bridge가 secondary/subordinate로 라우팅.
  • LTREP의 latency tolerance를 RC에 알림 — power state 결정.

#다음 편

Ch 4: BAR & MMIO — 자원의 호스트 주소 공간 매핑에서 device 자원을 host address space에 매핑하는 BAR의 size 결정·prefetchable·ReBAR 등을 분해합니다.

#관련 항목

#시리즈 자료 출처 안내

본 글의 1차 자료·정책은 Ch 1 footer 참고.