CHAPTER 02
2. 전원, REFCLK, reset과 LTSSM enable 순서를 파형으로 증명한다
PCIe link가 올라오지 않을 때 software register dump보다 먼저 봐야 하는 것은 rail, REFCLK, PERST#와 controller/PHY reset입니다. 각 신호가 '1'인지가 아니라 언제 안정되고 누가 해제했는지를 같은 시간축에서 확인합니다.
REFCLK stable
주파수만 100MHz라고 끝나지 않습니다. common clock인지 independent clock인지, SSC가 어느 쪽에서 생성되는지, endpoint가 같은 정책을 기대하는지 확인합니다.
PERST#
Endpoint fundamental reset 입력입니다. Root Port controller core reset과 같은 신호가 아닙니다. board GPIO, reset controller 또는 slot power controller가 소유할 수 있습니다.
PHY reset
PMA/PCS/PLL calibration reset이 여러 단계로 분리될 수 있습니다. analog reset을 풀기 전에 rail과 refclock이 안정돼야 하며 calibration done 전 LTSSM을 시작하면 receiver detect가 불안정해질 수 있습니다.
Core reset
DWC DBI/AXI/APB와 LTSSM logic reset입니다. DBI programming은 core register 접근이 가능해진 뒤, LTSSM은 PHY ready와 RC mode programming 뒤에 켭니다.
Warm reset
전체 rail을 끄지 않고 link/protocol state만 다시 시작하는 경로입니다. cold boot 성공만으로 warm reset, hot reset, suspend/resume 순서가 맞다고 볼 수 없습니다.
CLKREQ#/WAKE#
초기 link training과 runtime power management를 분리해 봅니다. ASPM off에서는 정상인데 L1SS에서만 실패하면 초기 training보다 wake/refclock restore 경계를 의심합니다.
신호별 소유자와 측정 기준
| 신호 | 구동 주체 | 관찰 위치 | 통과 조건 | 실패 시 다음 확인 |
|---|---|---|---|---|
| Core rail | PMIC/power domain | SoC test point와 power-good | datasheet 범위와 ramp/settling 충족 | brownout, droop, sequencing |
| PHY analog rail | PMIC/LDO | PHY 근처 decoupling | PLL/calibration 중 droop 없음 | LDO enable, load transient |
| REFCLK | clock generator/SoC | Root Port와 Endpoint 양쪽 | 주파수, swing, SSC와 architecture 일치 | buffer enable, mux, termination |
| PHY reset | reset controller/application | register와 가능하면 pin/debug | clock/rail 안정 후 해제 | reset polarity와 synchronizer |
| DWC core reset | SoC reset controller | reset status와 DBI ID read | DBI reset value가 안정적으로 읽힘 | APB/AXI clock gate |
| PERST# | Root Port GPIO/slot logic | Endpoint pin | board/endpoint 요구 시간 뒤 deassert | GPIO polarity, pinmux, level shifter |
| LTSSM enable | application register 또는 start_link | application bit와 DEBUG0 | PHY ready 뒤 0→1, Detect 진입 | device type과 application clock |
| CLKREQ# | Endpoint open-drain/Root policy | connector pin | L1SS 진입·복귀에서 정상 | pull-up, clock request policy |
부팅 방식별 반드시 다시 검증할 항목
| 시나리오 | 남아 있을 수 있는 상태 | 필수 reset 범위 | 통과 기준 |
|---|---|---|---|
| Cold boot | 없음 또는 strap/fuse만 유지 | rail, PHY, core, endpoint | 항상 같은 width/speed로 L0 |
| Warm reboot | PHY PLL, endpoint state, iATU | software reset 순서 확인 | 이전 kernel 상태에 의존하지 않음 |
| PCIe hot reset | 전원과 일부 PHY state 유지 | protocol hot reset | Configuration Space 재탐색 가능 |
| Endpoint secondary bus reset | Root Port와 PHY 유지 | bridge control reset | endpoint Vendor ID가 다시 나타남 |
| Suspend/resume | L1/L2, clock gate, IOMMU state | runtime/system PM callback | resume 뒤 DMA/MSI 포함 정상 |
| Link retrain | resource와 driver는 유지 | LTSSM Recovery 경로 | AER 폭증 없이 원 speed 복귀 |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | rail, REFCLK, PERST#를 같은 oscilloscope trigger에 잡습니다. | power-good부터 PERST# deassert까지 절대 시간 | 순서를 log timestamp가 아니라 파형으로 확정 |
| 2 | PHY calibration done과 LTSSM enable register를 polling trace로 저장합니다. | calibration done 뒤 LTSSM enable | PHY 준비 전 controller 시작을 배제 |
| 3 | cold boot 100회와 warm reboot 100회를 나눠 speed/width를 기록합니다. | 실패율과 협상 폭이 두 시나리오에서 동일 | 잔존 state 의존성 확인 |
| 4 | ASPM/L1SS를 끈 상태와 켠 상태를 분리해 재현합니다. | 초기 L0와 runtime 복귀 실패를 구분 | 전원 관리 경계의 문제 여부 결정 |
주의PERST# deassert와 DWC LTSSM enable은 서로 다른 사건입니다. 둘 중 하나만 log에 찍고 'reset 해제 완료'라고 쓰지 않습니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 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