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 | 값의 출처 | 검증식/주의점 |
|---|---|---|---|
| 1 | LOWER_BASE | parent_bus_addr[31:0] | region_align 배수 |
| 2 | UPPER_BASE | parent_bus_addr[63:32] | CPU/AXI source upper bits |
| 3 | LIMIT | (base + size - 1)[31:0] | inclusive; size 0 금지 |
| 4 | UPPER_LIMIT | limit[63:32] | DWC ≥ 4.60a에서 4GiB crossing 지원 확인 |
| 5 | LOWER_TARGET | pci_addr[31:0] 또는 BDF field | MEM/IO와 CFG target 의미가 다름 |
| 6 | UPPER_TARGET | pci_addr[63:32] | 64-bit PCI bus address |
| 7 | REGION_CTRL1 | type | routing | function | MEM/IO/CFG0/CFG1/MSG type |
| 8 | REGION_CTRL2 | ENABLE | mode bits | config shift, BAR match, function match |
| 9 | CTRL2 readback | ENABLE bit | retry 후에도 0이면 timeout |
주요 iATU field
| Field | Bit/값 | 의미 | 실패 시 증상 |
|---|---|---|---|
| TYPE_MEM | 0x0 | Memory TLP | BAR MMIO가 UR/timeout |
| TYPE_IO | 0x2 | I/O TLP | legacy I/O resource 접근 실패 |
| TYPE_CFG0 | 0x4 | Type 0 Config | 직결 endpoint 미탐색 |
| TYPE_CFG1 | 0x5 | Type 1 Config | bridge 뒤 장치 미탐색 |
| TYPE_MSG | 0x10 | Message TLP | PME Turn Off 등 message 실패 |
| ENABLE | CTRL2 bit 31 | region 활성 | 모든 access miss |
| BAR_MODE_ENABLE | CTRL2 bit 30 | inbound BAR match | EP inbound BAR mapping 실패 |
| CFG_SHIFT_MODE | CTRL2 bit 28 | ECAM BDF shift | BDF routing 오류 |
| INHIBIT_PAYLOAD | CTRL2 bit 22 | data-less message | Message TLP 형식 오류 |
| FUNC_NUM_MATCH_EN | CTRL2 bit 19 | function match | 특정 PF/VF/function만 실패 |
| INCREASE_REGION_SIZE | CTRL1 bit 13 | 4GiB crossing 확장 | boundary 이후 주소만 실패 |
| TD | CTRL1 bit 8 | TLP Digest 제어 | 특정 DWC ECRC quirk와 연결 |
가상 주소 예제 1: outbound MEM
| 항목 | 값 | 계산/해석 |
|---|---|---|
| CPU aperture | 0x6000_0000..0x6fff_ffff | 256MiB source window |
| PCI target | 0x8000_0000 | endpoint/bridge가 보는 bus base |
| BASE | 0x6000_0000 | LOWER_BASE |
| LIMIT | 0x6fff_ffff | 0x60000000 + 0x10000000 - 1 |
| TARGET | 0x8000_0000 | LOWER_TARGET |
| CPU access | 0x6000_1000 | window offset 0x1000 |
| PCI TLP address | 0x8000_1000 | target + offset |
| 필수 type | MEM | CFG type이면 BAR decode 안 됨 |
가상 주소 예제 2: ECAM CFG0
| 항목 | 값 | 계산/해석 |
|---|---|---|
| config base | 0x4000_0000 | 가상 CPU PA 예시 |
| bus 1 aperture | base + 1MiB | Linux DWC ECAM CFG0 구성 |
| 대상 BDF | 01:00.0 | ECAM offset 0x0010_0000 |
| register | 0x10 | BAR0 |
| CPU PA | 0x4010_0010 | base + BDF + reg |
| iATU type | CFG0 | Root Port immediate bus |
| CTRL2 | ENABLE | CFG_SHIFT | address의 BDF field 사용 |
| TLP | CfgRd0 01:00.0 reg 0x10 | analyzer에서 확인 |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | dw_pcie_iatu_detect 결과의 region_align, region_limit, inbound/outbound window 수를 기록합니다. | 요청 window가 hardware capability 안에 있음 | 컴파일 상수로 window 수를 가정하지 않음 |
| 2 | base+size-1을 64bit로 계산하고 overflow와 4GiB crossing을 확인합니다. | Linux validation 조건 통과 | limit off-by-one/upper-limit 누락 방지 |
| 3 | viewport 방식과 unrolled 방식 중 실제 접근 방식을 version/capability로 확정합니다. | region dump가 쓰기 방식과 동일 | 다른 region의 값을 읽는 실수 방지 |
| 4 | enable readback 뒤에만 config/MMIO를 시작합니다. | CTRL2 bit31=1 | posted DBI write가 반영되기 전 transaction 방지 |
| 5 | window 처음/마지막/바깥 주소 세 점을 읽습니다. | 경계 안 두 점 성공, 바깥은 의도대로 실패 | size/limit decode 검증 |
주의가상 예제 주소를 실제 보드에 복사하지 않습니다. 실제 값은 DT ranges/ACPI _CRS, DWC resource와 PCI resource allocator 결과로 다시 계산합니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 vendor register나 integration별 offset을 추측해서 채우지 않았습니다. 아래 제조사 자료, architecture 문서와 Linux v6.18.37 원본에서 다시 확인할 수 있는 범위만 사용했습니다.
Linux v6.18.37 DWC common source
iATU programming, version/capability와 eDMA detection
Linux v6.18.37 DWC host source
ECAM/CFG access, Root Port setup, MSI irqdomain와 host lifecycle
Linux v6.18.37 PCI probe
Vendor ID read, pci_dev 생성, BAR sizing와 bridge scan
Linux v6.18.37 PCI resource assignment
bridge window와 endpoint BAR resource 배치
Linux DWC Devicetree binding
reg/ranges, iATU window 수, lane/speed와 MSI/IOMMU 연결