CHAPTER 06
6. Linux에 공개된 DWC Port Logic field를 bit 단위로 읽는다
Linux v6.18.37의 pcie-designware.h에서 공개적으로 확인 가능한 field만 정리합니다. 실제 IP databook에는 더 많은 register가 있지만, 여기 적지 않은 bit를 이름만 추측해서 사용하지 않습니다.
DWC link 관련 공개 register
| Offset | Macro/field | Bit | 의미 | bring-up에서 읽는 방법 |
|---|---|---|---|---|
| 0x710 | PCIE_PORT_LINK_CONTROL | register | Port Link Control | 원본 raw와 설정 전후 값을 모두 저장 |
| 0x710 | PORT_LINK_DLL_LINK_EN | 5 | Data Link Layer link enable | LTSSM enable과 혼동하지 않음 |
| 0x710 | PORT_LINK_FAST_LINK_MODE | 7 | fast link mode 관련 제어 | production 설정을 임의 변경하지 않음 |
| 0x710 | PORT_LINK_MODE_MASK | 21:16 | synthesis/설정 link mode | x1=0x1, x2=0x3, x4=0x7, x8=0xf, x16=0x1f encoding |
| 0x714 | PCIE_PORT_LANE_SKEW | register | lane skew 관련 Port Logic | databook의 bit 정의와 함께 사용 |
| 0x728 | PCIE_PORT_DEBUG0 | 5:0 | LTSSM state mask | 단발 값보다 transition/history로 수집 |
| 0x72c | PCIE_PORT_DEBUG1_LINK_UP | 4 | DWC가 판단한 link-up | 표준 LNKSTA와 함께 비교 |
| 0x72c | LINK_IN_TRAINING | 29 | link training 진행 | speed change 중 일시 set과 stuck을 구분 |
| 0x80c | PORT_LOGIC_SPEED_CHANGE | 17 | directed speed change trigger/status | 오래 set이면 Recovery.Speed/PHY rate 확인 |
| 0x80c | PORT_LOGIC_LINK_WIDTH_MASK | 12:8 | target link width | negotiated width는 PCIe LNKSTA에서 읽음 |
| 0x890 | GEN3_EQ_DISABLE | 16 | Gen3 equalization disable control | quirk 없이 임의 disable하지 않음 |
| 0x890 | RATE_SHADOW_SEL | 25:24 | rate별 shadow 선택 | IP version과 programming sequence 확인 |
| 0x8f8 | PCIE_VERSION_NUMBER | 32bit | DWC component version | raw hex 보존 후 version helper와 대조 |
| 0x8fc | PCIE_VERSION_TYPE | 32bit | DWC component type | SoC model이 아닌 IP 구성 식별 |
서로 다른 'link width/speed' 값
| 값 | 위치 | 무엇을 뜻하나 | 언제 달라질 수 있나 |
|---|---|---|---|
| 합성 max lanes | IP configuration report | hardware가 구현한 최대 lane | silicon에서 고정 |
| DT num-lanes | firmware | board가 사용할 lane 정책 | board variant마다 다름 |
| Port Link mode | 0x710 21:16 | controller programming mode | driver 초기화로 변경 |
| Target width | 0x80c 12:8 | retrain에 요청하는 width | retrain/quirk에서 변경 |
| Negotiated width | PCI_EXP_LNKSTA NLW | 실제로 합의된 active lane | lane failure/retrain마다 변동 |
| Max link speed | Link Capability | advertised controller 상한 | DBI RO write 구간에 programming |
| Target speed | Link Control 2 TLS | 다음 retrain 목표 | software 정책으로 변경 |
| Current speed | Link Status CLS | 현재 L0에서 사용 중인 rate | Recovery 후 변동 |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | 모든 register를 32bit raw로 먼저 덤프하고 field decode를 별도 열에 둡니다. | 원본값과 해석값 동시 보존 | decode script 오류를 재검증 가능 |
| 2 | 링크 시작 전, training 중, L0 후 세 시점의 dump를 저장합니다. | 변화해야 할 bit와 고정 bit 구분 | reset value와 runtime state 혼동 방지 |
| 3 | 표준 PCIe Capability의 LNKCAP/LNKCTL/LNKSTA/LNKCTL2와 Port Logic을 한 행에 놓습니다. | target, capability, current 값의 관계 | 한 register만 보고 속도 판정하지 않음 |
| 4 | 실패 boot와 성공 boot의 bit diff를 DWC version별로 분류합니다. | 동일 version/board끼리 비교 | 다른 silicon revision을 섞지 않음 |
주의Port Logic register는 일부 bit가 implementation-defined이거나 version별로 달라질 수 있습니다. Linux가 정의하지 않은 bit는 해당 DWC databook을 확인한 뒤에만 이름을 붙입니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 vendor register나 integration별 offset을 추측해서 채우지 않았습니다. 아래 제조사 자료, architecture 문서와 Linux v6.18.37 원본에서 다시 확인할 수 있는 범위만 사용했습니다.
Synopsys PCIe 5.0 complete solution
Controller, PHY, verification IP가 별도 구성요소이며 PIPE 5.x와 SerDes architecture를 지원한다는 공개 제품 범위
Synopsys PCIe 5.0 PHY
PHY가 담당하는 SerDes, equalization, lane margining과 진단 기능의 공개 범위
Synopsys PIPE 5.1 SerDes architecture
기존 PIPE와 SerDes architecture에서 PCS 책임이 이동하는 이유
Linux v6.18.37 DWC header
DWC Port Logic, link debug, iATU와 eDMA 공개 register offset
Linux DWC Devicetree binding
clock, reset, PHY, lane, speed와 DWC resource description