← PCIe 상세 목차DUJINLABS.COM

Hardware · PCIe detailed manual 05 · Linux v6.18.37

5. Linux enumeration과 BAR sizing을 함수 경계로 따라간다

pci_host_probe() 이후 PCI core는 Vendor ID를 읽어 pci_dev를 만들고 header/capability/BAR를 조사하며 bridge를 재귀적으로 scan합니다. BAR size probe와 resource assignment는 driver probe보다 앞에서 일어나므로 'driver가 BAR 주소를 정한다'고 쓰면 안 됩니다.

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

CHAPTER 05

5. Linux enumeration과 BAR sizing을 함수 경계로 따라간다

pci_host_probe() 이후 PCI core는 Vendor ID를 읽어 pci_dev를 만들고 header/capability/BAR를 조사하며 bridge를 재귀적으로 scan합니다. BAR size probe와 resource assignment는 driver probe보다 앞에서 일어나므로 'driver가 BAR 주소를 정한다'고 쓰면 안 됩니다.

Linux PCI scan의 핵심 함수 흐름

순서함수/단계입력출력/소유권실패 증상
1pci_host_probehost bridge/windows/opsroot bus scan 시작root bus 생성 실패
2pci_scan_root_bus_bridgeroot bus number/resourcesstruct pci_buswindow/resource 불일치
3pci_scan_child_busbus발견한 max busbridge 뒤 topology 누락
4pci_scan_slotdevice numberfunction scanmultifunction/ARI 누락
5pci_scan_devicebus/devfn임시 pci_devVendor ID 0xffff
6pci_setup_deviceconfig headerclass/header/resource 정보unknown header/class
7pci_read_basesBAR registersresource size/flagsBAR size/type 오류
8pci_scan_bridgeType-1 bridgesecondary bus treebus number/CFG1 실패
9resource assignmenthost/bridge windowsBAR assigned addressno space/collision
10pci_bus_add_devicesconfigured pci_devdriver core 등록driver match/probe 안 됨

BAR bit와 sizing 해석

항목32-bit Memory BAR64-bit Memory BARI/O BAR주의점
type bitbit0=0bit0=0, type bits=10bbit0=1raw low bits는 address가 아님
prefetchablebit3bit3해당 없음CPU cacheable 의미와 다름
address mask~0xflow ~0xf + upper dword~0x3type bit 제거 후 계산
size probeall ones write/readlow/high를 한 resource로all ones write/readdecode 끄고 원값 복원
size 식~mask + 164bit mask에 적용~mask + 10 또는 미구현 BAR 처리
alignmentsize와 동일size와 동일size와 동일bridge/host window도 포함해야 함

resource window의 포함 관계

레벨반드시 포함해야 하는 것검증 위치
Host MEM windowCPU PA↔PCI MEM모든 downstream non-prefetchable BARDT ranges/_CRS, root bus resource
Host PREF window64-bit prefetchableprefetchable BAR와 child bridge windowroot resource tree
Bridge MEM windowbus 1 bridge그 bridge 아래 non-pref BARType-1 header 0x20..
Bridge PREF windowbus 1 bridge그 아래 prefetchable BARType-1 header 0x24..
Endpoint BAR03:00.0 BAR0device register aperturesysfs resource/lspci
DWC outbound iATUCPU aperture→PCI windowhost resource가 실제 transaction으로 변환되는 범위iATU raw dump
그림 1. 5. Linux enumeration과 BAR sizing을 함수 경계로 따라간다의 실행 순서왼쪽에서 오른쪽으로 실제 소유권과 관찰 지점이 이동합니다.
01 Vendor ID
02 pci_dev 할당
03 header/class 읽기
04 BAR size probe
05 bridge 재귀 scan
06 resource requirement 합산
07 window/BAR 배치
08 driver match/probe

실제 검증 절차

순서실행남길 증거판정 목적
1`lspci -tv`와 모든 bridge의 Primary/Secondary/Subordinate를 저장합니다.tree와 bus number가 일치CFG1 routing 전제 확인
2각 BAR의 raw 값, size, flags, assigned bus address와 CPU resource를 한 행에 둡니다.64-bit BAR pair와 window 포함 관계BAR 종류/주소 혼동 방지
3host/bridge/DWC iATU window를 interval로 그려 겹침과 누락을 검사합니다.parent가 child 전체를 포함일부 offset만 실패하는 문제 탐지
4driver bind 전 `resource`와 bind 후 request owner를 비교합니다.PCI core 할당과 driver 소유 전환driver가 주소를 할당했다는 오해 제거

주의BAR에 all-ones를 쓰는 size probe는 PCI core가 decode와 동시 접근을 제어하는 문맥에서 수행합니다. 실행 중인 device에 devmem으로 그대로 따라 하면 안 됩니다.

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

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