← PCIe 상세 목차

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/field 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 중 무엇인지 반드시 열 이름에 적습니다.

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

공개되지 않은 제조사 레지스터나 제품별 오프셋은 추측하지 않았습니다. 아래의 제조사 자료, 아키텍처 문서, Linux v6.18.37 원본으로 확인할 수 있는 내용만 다뤘습니다.