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

Ch 2: TLP — Transaction Layer Packet

· Hawk · 10분 읽기

#한 줄 요약

“TLP는 Transaction Layer가 만드는 PCIe의 기본 packet입니다.”3 또는 4 DW header + payload + 선택 ECRC 구조, Memory·I/O·Config·Message·Completion 다섯 가족. Memory Readsplit transaction이라 Tag로 매칭하고 out-of-order 가능. 라우팅은 Address·ID·Implicit의 3 방식.

Ch 1 Fundamentals에서 3-Layer Stack을 봤습니다. 이 장은 Transaction Layer가 만드는 TLP의 구조와 흐름을 본격적으로 분해합니다.

#TLP 기본 구조

TLP는 고정 frame을 가집니다.

영역크기의미
Header3 또는 4 DW (12·16 byte)TLP 타입·routing·attribute
Data Payload0 ~ MaxPayloadSizeWrite payload, Completion data
Digest (ECRC)4 byte (선택)End-to-End CRC

Header 3 DW32-bit address, 4 DW64-bit address. 현대 시스템은 거의 4 DW입니다.

#TLP 종류 — 5 가족

가족종류책임
MemoryMRd·MWr·MRdLk메인메모리 또는 device memory 접근
I/OIORd·IOWrLegacy I/O space (현대 거의 unused)
ConfigurationCfgRd0/1·CfgWr0/1PCIe Configuration Space 접근
MessageMsg·MsgDInterrupt·error·power 관리
CompletionCpl·CplD·CplLk·CplDLkNon-posted 요청의 응답

MRd/MWr전체 traffic의 99%. 나머지는 드물거나 management용.

#Header DW 분해 — Memory TLP 예

*Memory Write TLP (4 DW header)*의 layout:

DW영역의미
DW0Fmt[2
]·Type[4
]·TC·Attr·AT·Length
TLP 타입·길이·attribute
DW1Requester ID·Tag·Last DW BE·First DW BESource 식별·byte enable
DW2Address High[63
]
64-bit 상위
DW3Address Low[31
]
64-bit 하위

Fmt·TypeTLP 가족과 변종을 인코딩. Memory Write 64-bitFmt=011·Type=00000. LengthDW 단위고 *최대 1024 DW (4 KB)*까지.

#Posted vs Non-Posted vs Completion

PCIe는 3가지 transaction 부류를 가집니다.

부류Completion
PostedMWr·MsgD없음 — 보내고 끝
Non-PostedMRd·CfgRd·CfgWr·IORd·IOWrCompletion 필수
CompletionCpl·CplDNon-Posted 요청에 돌아오는 응답

Memory Write는 Postedfire and forget. Memory Read는 Non-Postedrequester가 Tag로 outstanding 추적. Completion이 Tag를 같이 실어 돌아옵니다.

#Split Transaction — Memory Read 흐름

단계동작
1Requester가 MRd (Tag=5, Len=8 DW) 발송
2Tag=5를 outstanding queue에 등록
3Requester가 다른 요청 발송 가능 (parallel)
4Completer가 CplD (Tag=5, 8 DW data) 응답
5Requester가 Tag=5 retire

Tag요청-응답 매칭의 키. 한 requester는 여러 outstanding read 동시 보유. response 순서가 다를 수 있음. PCIe 기본 32 tag (5-bit), Extended Tag256·1024 tag.

큰 read는 여러 Completion으로 split 가능. MaxPayloadSize = 256 byte4 KB read16개 Completion으로 옵니다.

#Routing — 3 가지 방식

방식사용적용 TLP
Address routingAddress 기반 destinationMemory·I/O
ID routingRequester ID·Completer ID 기반Configuration·Completion
Implicit routingRC 또는 직접 destinationMessage

Switch는 Address 또는 ID를 보고 어느 downstream port로 forward. MMIO BAR range가 어떤 EP의 것인지 table로 관리, Configuration은 BDF로 라우팅.

#Header DW 1 — Requester ID·Tag·BE

DW 1의 Requester ID는 16-bit:

영역bit의미
Bus15
PCI bus 번호
Device7
Device 번호
Function2
Function 번호

ARI (Alternative Routing-ID Interpretation) 활성화 시 Function 영역 확장 — single device가 256 function 표현 가능.

Tag5/8/10-bit (Extended Tag 설정에 따라). outstanding 한계를 정함.

First DW BE·Last DW BE (각 4-bit): payload의 첫·마지막 DW에서 어느 byte가 valid인지. partial DW write에 사용.

#TLP Attribute — Ordering·Caching

DW 0의 Attribute (Attr) 비트:

비트의미
NS (No Snoop)RC가 cache snoop을 skip — graphics traffic 등
RO (Relaxed Ordering)Strict write ordering 완화, parallelism 증가
TH (TLP Hints)TPH 비트와 함께, cache hint
IDO (ID-Based Ordering)다른 ID의 traffic 사이 ordering 완화

Performance tuning의 핵심. 잘못 쓰면 데이터 손상. NIC·NVMe 드라이버가 intentionally 사용.

#Producer-Consumer Ordering

PCIe는 PCI 시절의 strict ordering 모델부분적으로 유지:

규칙효과
Posted Write가 다음 Posted Write를 추월 못 함strict write ordering
Posted Write가 이전 Read Completion을 추월 가능latency 개선
Posted Write가 Non-Posted Read추월 가능일반적인 경우

Producer-Consumer 모델: producer가 data write → flag write 순서로 보내고 consumer가 flag read → data read. PCIe가 flag write 전에 data write를 완료시킴ordering rule로 보장.

RO 활성화 시 이 보장 약화 — driver가 *barrier (memory fence·doorbell write)*로 직접 sync.

#ECRC — End-to-End CRC

기본적으로 PCIe는 DLL의 LCRC만 사용 — link 단위 보호. ECRC는 option으로 RC↔EP end-to-end 보호:

영역LCRCECRC
적용 범위Link 1 hopEnd-to-end (multi-hop)
위치DLL이 추가TL이 추가, Digest 영역
활성화항상AER capability로 enable
비용자동CPU·EP 모두 ECRC 처리 능력 필요

Switch가 중간 transformation 안 한다는 가정으로 ECRC가 RC→EP 보호. RAS-critical 시스템에서 활성화.

#TPH·ATS·PRI·PASID — 고급 기능

기능역할
TPH (TLP Processing Hints)RC에 cache placement hint 전달 — DDIO 등
ATS (Address Translation Services)EP가 직접 IOMMU translation cache 보유
PRI (Page Request Interface)EP가 page fault를 host에 요청
PASID (Process Address Space ID)process별 address space 식별

ATS·PRI·PASID 묶음은 *Shared Virtual Memory (SVM)*의 토대. Ch 11 DMA·IOMMU에서 자세히.

#자주 하는 실수

#”MWr Completion 기다린다”

PostedCompletion 없음. flush 보장은 read-back (해당 BAR 또는 다른 register read). Non-Posted Completion이 와야 이전 Posted Write가 visible 보장.

#”Tag는 무한”

기본 5-bit (32 outstanding). Extended Tag8-bit (256)·10-bit (1024). EP의 Tag 자원이 부족하면 throughput 한계. NVMe·NIC는 Extended Tag 활성화 필수.

#”Address routing이면 IOMMU 불필요”

EP가 보낸 addressdevice가 본 address. IOMMU 활성화면 device 입장의 IOVAhost 입장의 PA로 translate. EP는 IOMMU 존재를 모름 (ATS 제외).

#”ECRC만 켜면 RAS 완벽”

ECRC는 RC↔EP 데이터 무결성. Header corruptionpoisoned TLP 메커니즘이 다룸. AER capability까지 같이 enable 해야 fault report. Switch DPC까지 묶어야 containment.

#”Length는 byte”

Length는 DW (4 byte) 단위. Length=832 byte. 0 → 4096 byte (1024 DW). 최대 MaxPayloadSize 또는 MaxReadRequestSize 제한.

#정리

  • TLP는 3 또는 4 DW header + payload + 선택 ECRC 구조의 PCIe 기본 packet.
  • 5 가족: Memory·I/O·Config·Message·Completion. MRd/MWr가 대부분.
  • Posted (Write)·Non-Posted (Read·Config)·Completion3 transaction 부류.
  • Memory Read는 split transaction — Tag로 매칭, out-of-order 가능.
  • 라우팅: Address (Memory)·ID (Config·Cpl)·Implicit (Msg).
  • Attributesnoop·ordering·hint 제어. RO·NSperformance tuning의 핵심.
  • Producer-Consumer orderingdriver의 write barrier 가정의 토대.
  • ECRCend-to-end 무결성 option, AER과 함께 RAS에 사용.
  • ATS·PRI·PASIDSVM의 토대.

#다음 편

Ch 3: Configuration Space — 4 KB ECAM·Capability에서 PCIe device의 명함인 Configuration Space와 capability linked list를 본격적으로 분해합니다.

#관련 항목

#시리즈 자료 출처 안내

본 글은 PCI-SIG 공개 자료·Linux drivers/pci 소스·CPU 벤더 매뉴얼을 1차 자료로 합니다. PCIe Base Specification은 § navigation aid로만 인용. 자세한 정책은 Ch 1 footer 참고.