← PCIe 상세 목차DUJINLABS.COM

Hardware · PCIe detailed manual 01 · Linux v6.18.37

1. 주소를 하나로 부르지 말고 translation ledger를 만든다

MMIO 한 번과 DMA 한 번은 서로 반대 방향의 주소 변환을 사용합니다. 각 단계의 입력 주소, 출력 주소, 길이, 속성, requester ID와 소유자를 표로 적으면 iATU와 IOMMU가 뒤섞이지 않습니다.

상세 표
2
검증 행
20
절차
4 checkpoints
기준
PCIe · Linux v6.18.37

CHAPTER 01

1. 주소를 하나로 부르지 말고 translation ledger를 만든다

MMIO 한 번과 DMA 한 번은 서로 반대 방향의 주소 변환을 사용합니다. 각 단계의 입력 주소, 출력 주소, 길이, 속성, requester ID와 소유자를 표로 적으면 iATU와 IOMMU가 뒤섞이지 않습니다.

CPU virtual address

ioremap/pci_iomap으로 만들어진 kernel VA입니다. page table을 지나 CPU physical address가 된 뒤 SoC interconnect로 나갑니다.

CPU physical/parent bus address

DWC AXI slave aperture가 decode하는 주소입니다. Linux DWC 코드의 parent_bus_addr가 이 공간을 뜻합니다.

PCI bus address

TLP header에 실리는 address입니다. endpoint BAR가 decode하는 주소이며 CPU physical address와 같을 필요가 없습니다.

BAR offset

Endpoint 내부 register/filed offset입니다. assigned BAR base에 더해 TLP address가 됩니다.

DMA address/IOVA

DMA API가 device에 제공하는 주소입니다. IOMMU가 있으면 PA가 아니라 IOVA일 수 있습니다.

System physical address

IOMMU와 interconnect translation 뒤 실제 DRAM page가 위치한 주소입니다. descriptor에 이 값을 직접 쓰는 것은 DMA API 계약을 깨뜨릴 수 있습니다.

주소 공간별 이름과 소유자

번호 공간예시누가 할당/변환하나어디에 기록되나수명
Kernel VAffff800012340000ioremap/pci_iomapdriver pointermap 해제까지
CPU PA0x6000_0000firmware resource/host bridgepage table PTE와 resourcehost window 유지 동안
DWC AXI aperture0x6000_0000..0x6fff_ffffSoC address decodeDT ranges와 iATU base/limitcontroller 설정 동안
PCI bus address0x8000_0000PCI resource allocatorBAR/bridge windowenumeration/resource assignment 동안
BAR-relative offsetBAR0 + 0x1000endpoint specificationdriver register definitiondevice lifetime
DMA address/IOVA0x1_2400_0000DMA/IOMMU APIdescriptormap/unmap 또는 coherent allocation lifetime
System PA0x9a40_0000memory allocator/IOMMU mappingIOMMU PTE/physical pagepage allocation lifetime
MSI doorbell addressplatform별 addressMSI domain/remapperMSI capability/tableIRQ vector allocation lifetime

한 transaction을 기록하는 ledger

필드CPU→Endpoint MMIO 예Endpoint→Memory DMA 예왜 필요한가
OriginatorCPU coreEndpoint function 03:00.0requester와 ordering 주체
Input addressCPU PA 0x60001000DMA addr 0x124000000translation 입력
Translator 1outbound iATU region 2Root Port inbound routing/SMMU첫 경계
Output address 1PCI 0x80001000SMMU input IOVATLP/stream 관찰값
Requester IDRoot Port03:00.0 RIDIOMMU/AER 연결
Translator 2없음 또는 bridge windowSMMU IOVA→PA최종 memory target
Length/attributes4B non-posted read4KiB posted writecompletion/ordering 판정
Completion evidenceCplD + MMIO valuedevice completion + memory visibility완료 정의
그림 1. 1. 주소를 하나로 부르지 말고 translation ledger를 만든다의 실행 순서왼쪽에서 오른쪽으로 실제 소유권과 관찰 지점이 이동합니다.
01 Kernel VA
02 CPU page table
03 CPU PA/AXI
04 outbound iATU
05 PCI bus address
06 Endpoint BAR
07 device register

실제 검증 절차

순서실행남길 증거판정 목적
1DT ranges 또는 ACPI _CRS를 CPU PA와 PCI bus address 두 열로 펼칩니다.각 window의 size/flags/offsethost aperture의 translation 식 확보
2DWC outbound iATU base/limit/target을 raw dump합니다.firmware window와 1:1 대응software description과 hardware programming 대조
3sysfs resource와 driver pci_iomap 대상을 같은 BAR 행에 적습니다.assigned bus address와 CPU PA 관계잘못된 BAR mapping 배제
4DMA descriptor의 address를 dma_map 결과와 IOMMU fault의 IOVA에 대조합니다.동일 queue entry/RID/lengthPA/IOVA 혼동 제거

주의driver가 출력한 0x12340000을 문맥 없이 '물리 주소'라고 기록하지 않습니다. 그 값이 CPU PA, PCI bus address, IOVA 중 무엇인지 반드시 열 이름에 적습니다.

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

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