← PCIe 상세 목차DUJINLABS.COM

Hardware · PCIe detailed manual 06 · Linux v6.18.37

6. Endpoint bus-master DMA를 iATU, IOMMU와 cache 관점에서 분리한다

Endpoint의 DMA engine이 Memory Read/Write TLP를 만들면 requester ID가 Root Port와 IOMMU를 통과합니다. DWC eDMA와 endpoint DMA는 별도 엔진이며, dma_map 결과가 IOVA인지 PA인지도 platform에 따라 달라집니다.

상세 표
3
검증 행
26
절차
5 checkpoints
기준
PCIe · Linux v6.18.37

CHAPTER 06

6. Endpoint bus-master DMA를 iATU, IOMMU와 cache 관점에서 분리한다

Endpoint의 DMA engine이 Memory Read/Write TLP를 만들면 requester ID가 Root Port와 IOMMU를 통과합니다. DWC eDMA와 endpoint DMA는 별도 엔진이며, dma_map 결과가 IOVA인지 PA인지도 platform에 따라 달라집니다.

DMA 경로의 소유권

단계소유자핵심 상태완료 증거수명 오류
buffer allocationmemory allocator/driverCPU VA/PA, sizeallocation 성공free 후 device 접근
DMA mappingDMA API/IOMMUDMA addr, direction, attrsmapping 성공/IOMMU PTEunmap 시점 오류
descriptor builddriveraddr/len/flagsownership 전환 전 내용잘못된 endian/stride
publication barrierdriver/architecturedma_wmb 등device가 완전한 descriptor 관찰doorbell이 먼저 보임
bus masteringPCI Command/endpointMASTER bitMemory TLP 발생enable 전 queue 시작
PCIe routingDWC/bridgeRID/address/attributesTLP/AERinbound window/routing 오류
IOMMU translationSMMU/IOMMUstream ID/RID, IOVA→PAfault 없음/PTE hitdomain/RID mismatch
cache visibilityDMA API/coherency fabricsync/barrierCPU/device가 같은 data 관찰stale cacheline
completiondevice/driverstatus/index/MSIqueue entry 회수IRQ만 오고 data 미완료

DMA API direction을 device 관점으로 읽기

DirectionDevice 동작CPU 동작map/sync에서 중요한 것오해
DMA_TO_DEVICEMemory Readbuffer를 준비CPU write가 device에 보이게CPU 기준 'send' 이름만 봄
DMA_FROM_DEVICEMemory Write완료 후 buffer 읽음device write가 CPU에 보이게posted write 완료를 MSI만으로 추정
DMA_BIDIRECTIONAL양방향양방향더 강한 관리 비용모르면 전부 BIDIR 사용
Coherent allocationdescriptor/status 공유일반적으로 별도 sync 불필요ordering barrier는 여전히 필요할 수 있음coherent=순서 자동 보장
Streaming mappingpayload 등map/unmap 또는 syncownership 전환마다 API 준수같은 mapping을 무기한 재사용

IOMMU fault를 queue entry로 되돌리는 항목

Fault field연결할 대상
Requester/Stream IDPCI BDF와 iommu-map03:00.0 RID
IOVAdescriptor DMA address0x124000000
Access typeDMA direction/TLPwrite fault
Length/pagedescriptor length와 mapped span4KiB boundary
Domain/PASIDdevice/domain/processdefault domain
Timestampdoorbell/completion/IRQ tracequeue entry 127
Reasontranslation/permission/abortwrite permission 없음
그림 1. 6. Endpoint bus-master DMA를 iATU, IOMMU와 cache 관점에서 분리한다의 실행 순서왼쪽에서 오른쪽으로 실제 소유권과 관찰 지점이 이동합니다.
01 dma_map/alloc
02 IOVA 획득
03 descriptor 작성
04 dma_wmb
05 doorbell MMIO
06 Endpoint Memory TLP
07 DWC/bridge
08 IOMMU
09 DRAM
10 completion/MSI

실제 검증 절차

순서실행남길 증거판정 목적
1DMA mask와 coherent mask 협상 결과를 저장합니다.device address width 안의 DMA addr32/64bit truncation 배제
2descriptor raw bytes와 driver가 해석한 addr/len/flags를 함께 dump합니다.endianness/stride/ownership 일치구조체 pretty print만 믿지 않음
3doorbell 직전 barrier와 bus-master enable을 trace합니다.descriptor 게시 뒤 device fetchordering 문제 분리
4IOMMU fault의 RID/IOVA를 정확한 queue index로 연결합니다.fault가 해당 mapping span 안에 있음무관한 device fault와 혼합 방지
5IRQ를 끄고 polling completion으로도 data visibility를 확인합니다.DMA 문제와 MSI routing 분리interrupt가 원인인지 결과인지 구분

주의Root Complex의 DWC inbound iATU가 항상 endpoint DMA를 최종 DRAM PA까지 변환한다고 가정하지 않습니다. SoC 통합에 따라 interconnect/SMMU 경로가 다르므로 실제 requester path를 확인합니다.

공개적으로 다시 확인할 수 있는 자료

공개되지 않은 vendor register나 integration별 offset을 추측해서 채우지 않았습니다. 아래 제조사 자료, architecture 문서와 Linux v6.18.37 원본에서 다시 확인할 수 있는 범위만 사용했습니다.