← PCIe 상세 목차DUJINLABS.COM

Hardware · PCIe detailed manual 02 · Linux v6.18.37

2. dw_pcie_setup_rc()가 DBI에 쓰는 값을 순서대로 해석한다

Root Port setup은 class code 하나를 쓰는 함수가 아닙니다. DBI read-only override를 열고 공통 link 설정, MSI, RC BAR, bus number, Command, equalization preset, iATU를 programming한 뒤 class와 speed change를 설정하고 override를 닫습니다.

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

CHAPTER 02

2. dw_pcie_setup_rc()가 DBI에 쓰는 값을 순서대로 해석한다

Root Port setup은 class code 하나를 쓰는 함수가 아닙니다. DBI read-only override를 열고 공통 link 설정, MSI, RC BAR, bus number, Command, equalization preset, iATU를 programming한 뒤 class와 speed change를 설정하고 override를 닫습니다.

dw_pcie_setup_rc()의 실제 순서

순서코드 동작register/field의도검증값
1DBI RO write enable0x8bc bit 0RO field 초기화 허용함수 끝에서 반드시 clear
2dw_pcie_setuplane/speed/link capability공통 DWC 설정DT lane/speed와 DBI 일치
3dw_pcie_msi_initMSI addr/mask/enable내부 MSI block 초기화외부 MSI domain일 때 경로 확인
4RC BAR0/1 임시 설정BAR0=0x4, BAR1=064-bit BAR 형식 초기화뒤에서 BAR0=0으로 정리
5Interrupt Pin 설정PCI_INTERRUPT_LINE dwordINTA pin 정보legacy IRQ 사용 여부와 분리
6bus number 초기값Primary=0 Secondary=1 Subordinate=255초기 downstream scan 허용scan 후 bridge bus number와 비교
7Command enableIO/MEM/MASTER/SERRRoot Port decode와 master 허용endpoint Command와 혼동 금지
8unsupported L1SS 숨김capability 조정미지원 power state 노출 방지실제 PHY/clock capability 대조
9equalization presetLink EQ control registers지원 rate/lane preset programmingGen3/4/5/6 target별 값
10iATU setupCFG/MEM/IO windowsCPU↔PCI translationchild_ops가 generic DWC일 때만
11RC BAR0 clearBAR0=0Root Port BAR 정리resource scan 전에 값 확인
12class codePCI_CLASS_DEVICE=PCI bridgePCI core에 Root Port type 제시0604 class
13speed change0x80c bit 17target speed retrain 요청Recovery와 current speed
14DBI RO write disable0x8bc bit 0 clearruntime 보호 복구성공/오류 경로 모두 확인

DBI write override를 점검할 이유

상황위험관찰 증상수정 원칙
override를 열지 않음RO field write 무시class/bus/link capability가 reset value초기화 범위에서만 enable
너무 일찍 닫음뒤쪽 preset/class write 무시Gen speed 또는 class만 틀림마지막 RO write 뒤 close
닫지 않음runtime에서 보호 field 변경 가능우발 write가 topology를 깨뜨림함수 exit 전에 반드시 disable
오류 경로에서 returnoverride가 열린 채 남음다음 probe 결과가 비결정적goto cleanup 또는 finally 성격 경로
DBI와 DBI2 혼동다른 shadow/BAR bank writereadback은 되지만 실제 header 불변accessor와 aperture 확인
그림 1. 2. dw_pcie_setup_rc()가 DBI에 쓰는 값을 순서대로 해석한다의 실행 순서왼쪽에서 오른쪽으로 실제 소유권과 관찰 지점이 이동합니다.
01 RO write enable
02 공통 lane/speed setup
03 MSI init
04 RC header/bus/command
05 EQ preset
06 iATU windows
07 class/speed change
08 RO write disable

실제 검증 절차

순서실행남길 증거판정 목적
1setup 전후 DBI Type-1 header와 PCIe Capability를 dump합니다.의도한 field만 변경reset value와 programming diff 확보
20x8bc bit 0을 함수 진입/탈출에서 trace합니다.탈출 뒤 0RO protection lifetime 검증
3Primary/Secondary/Subordinate와 Linux가 만든 root bus 번호를 비교합니다.scan 시점에 routing 가능한 범위CFG1 실패를 bus-number 문제와 연결
4Link Capability/Control/Status와 Port Logic target을 한 표로 저장합니다.capability≥target≥current 관계속도 policy와 협상 결과 분리

주의Root Port Command의 BUS_MASTER enable은 endpoint driver가 DMA를 시작했다는 뜻이 아닙니다. endpoint의 PCI_COMMAND_MASTER와 queue programming은 별도 수명입니다.

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

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