← PCIe 상세 목차DUJINLABS.COM

Hardware · PCIe detailed manual 04 · Linux v6.18.37

4. iATU region을 field와 계산 예제로 검증한다

DWC iATU는 source aperture의 [base, limit]를 target address와 TLP type으로 변환합니다. limit는 inclusive이고 region alignment와 address width 제한이 있으므로 단순히 base와 size만 맞췄다고 끝나지 않습니다.

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

CHAPTER 04

4. iATU region을 field와 계산 예제로 검증한다

DWC iATU는 source aperture의 [base, limit]를 target address와 TLP type으로 변환합니다. limit는 inclusive이고 region alignment와 address width 제한이 있으므로 단순히 base와 size만 맞췄다고 끝나지 않습니다.

Outbound iATU register programming

순서Register값의 출처검증식/주의점
1LOWER_BASEparent_bus_addr[31:0]region_align 배수
2UPPER_BASEparent_bus_addr[63:32]CPU/AXI source upper bits
3LIMIT(base + size - 1)[31:0]inclusive; size 0 금지
4UPPER_LIMITlimit[63:32]DWC ≥ 4.60a에서 4GiB crossing 지원 확인
5LOWER_TARGETpci_addr[31:0] 또는 BDF fieldMEM/IO와 CFG target 의미가 다름
6UPPER_TARGETpci_addr[63:32]64-bit PCI bus address
7REGION_CTRL1type | routing | functionMEM/IO/CFG0/CFG1/MSG type
8REGION_CTRL2ENABLE | mode bitsconfig shift, BAR match, function match
9CTRL2 readbackENABLE bitretry 후에도 0이면 timeout

주요 iATU field

FieldBit/값의미실패 시 증상
TYPE_MEM0x0Memory TLPBAR MMIO가 UR/timeout
TYPE_IO0x2I/O TLPlegacy I/O resource 접근 실패
TYPE_CFG00x4Type 0 Config직결 endpoint 미탐색
TYPE_CFG10x5Type 1 Configbridge 뒤 장치 미탐색
TYPE_MSG0x10Message TLPPME Turn Off 등 message 실패
ENABLECTRL2 bit 31region 활성모든 access miss
BAR_MODE_ENABLECTRL2 bit 30inbound BAR matchEP inbound BAR mapping 실패
CFG_SHIFT_MODECTRL2 bit 28ECAM BDF shiftBDF routing 오류
INHIBIT_PAYLOADCTRL2 bit 22data-less messageMessage TLP 형식 오류
FUNC_NUM_MATCH_ENCTRL2 bit 19function match특정 PF/VF/function만 실패
INCREASE_REGION_SIZECTRL1 bit 134GiB crossing 확장boundary 이후 주소만 실패
TDCTRL1 bit 8TLP Digest 제어특정 DWC ECRC quirk와 연결

가상 주소 예제 1: outbound MEM

항목계산/해석
CPU aperture0x6000_0000..0x6fff_ffff256MiB source window
PCI target0x8000_0000endpoint/bridge가 보는 bus base
BASE0x6000_0000LOWER_BASE
LIMIT0x6fff_ffff0x60000000 + 0x10000000 - 1
TARGET0x8000_0000LOWER_TARGET
CPU access0x6000_1000window offset 0x1000
PCI TLP address0x8000_1000target + offset
필수 typeMEMCFG type이면 BAR decode 안 됨

가상 주소 예제 2: ECAM CFG0

항목계산/해석
config base0x4000_0000가상 CPU PA 예시
bus 1 aperturebase + 1MiBLinux DWC ECAM CFG0 구성
대상 BDF01:00.0ECAM offset 0x0010_0000
register0x10BAR0
CPU PA0x4010_0010base + BDF + reg
iATU typeCFG0Root Port immediate bus
CTRL2ENABLE | CFG_SHIFTaddress의 BDF field 사용
TLPCfgRd0 01:00.0 reg 0x10analyzer에서 확인
그림 1. 4. iATU region을 field와 계산 예제로 검증한다의 실행 순서왼쪽에서 오른쪽으로 실제 소유권과 관찰 지점이 이동합니다.
01 region capability 확인
02 unused index 선택
03 base/limit/target 계산
04 CTRL1 type 작성
05 CTRL2 enable
06 enable readback
07 test transaction
08 AER/AXI 결과 확인

실제 검증 절차

순서실행남길 증거판정 목적
1dw_pcie_iatu_detect 결과의 region_align, region_limit, inbound/outbound window 수를 기록합니다.요청 window가 hardware capability 안에 있음컴파일 상수로 window 수를 가정하지 않음
2base+size-1을 64bit로 계산하고 overflow와 4GiB crossing을 확인합니다.Linux validation 조건 통과limit off-by-one/upper-limit 누락 방지
3viewport 방식과 unrolled 방식 중 실제 접근 방식을 version/capability로 확정합니다.region dump가 쓰기 방식과 동일다른 region의 값을 읽는 실수 방지
4enable readback 뒤에만 config/MMIO를 시작합니다.CTRL2 bit31=1posted DBI write가 반영되기 전 transaction 방지
5window 처음/마지막/바깥 주소 세 점을 읽습니다.경계 안 두 점 성공, 바깥은 의도대로 실패size/limit decode 검증

주의가상 예제 주소를 실제 보드에 복사하지 않습니다. 실제 값은 DT ranges/ACPI _CRS, DWC resource와 PCI resource allocator 결과로 다시 계산합니다.

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

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