CHAPTER 04
4. LTSSM을 한 단어가 아니라 하위 상태별로 기록한다
DEBUG0의 하위 상태 값이나 vendor application history를 읽을 수 있다면 'Polling에 있다'에서 멈추지 말고 세부 상태의 체류 시간과 반복 경로를 기록합니다. 단발 read는 빠른 상태를 놓치므로 histogram 또는 transition trace가 필요합니다.
LTSSM 주요 상태와 실패 경계
| 상태 | 그 상태에서 하는 일 | 정상 다음 상태 | 오래 머물 때 우선 증거 | 대표 원인 |
|---|---|---|---|---|
| Detect.Quiet | receiver detect 전 quiet 시간 | Detect.Active | LTSSM enable, power state | controller가 시작되지 않음 |
| Detect.Active | lane termination detect | Polling.Active | lane별 detect bitmap | endpoint reset, routing, termination |
| Polling.Active | TS1 전송과 bit/symbol lock | Polling.Configuration | Rx valid/block lock, TS count | REFCLK, polarity, severe SI |
| Polling.Configuration | TS2와 lane/link 조건 합의 | Configuration | TS1/TS2 decode, lane map | lane reversal/numbering |
| Polling.Compliance | compliance pattern 경로 | 상황에 따라 Polling | compliance request/strap | 의도치 않은 compliance 진입 |
| Configuration.Linkwidth.Start | link/lane number 시작 | Linkwidth.Accept | 수신 TS의 link/lane field | lane 수 불일치 |
| Configuration.Linkwidth.Accept | width 합의 | Lanenum.Wait | active lane mask | 일부 lane training 실패 |
| Configuration.Lanenum.Wait | lane number 정렬 | Lanenum.Accept | lane별 TS field | lane swap/reversal 설정 |
| Configuration.Lanenum.Accept | lane 번호 확정 | Complete | negotiated width | 상대편 응답 불일치 |
| Configuration.Complete | 최종 TS2 교환 | Configuration.Idle | TS2 count | ordered set decode |
| Configuration.Idle | idle 교환과 link finalize | L0 | DLL active 준비 | Data Link 초기화 |
| L0 | 정상 TLP/DLLP 전송 | L0 유지 또는 PM/Recovery | DLL active, replay/credit | L0여도 transaction stall 가능 |
| Recovery.RcvrLock | 수신 lock 재획득 | Recovery.RcvrCfg | CDR/block lock | SI, rate transition |
| Recovery.RcvrCfg | TS 교환/재구성 | Recovery.Idle | TS decode/equalization | preset/coeff mismatch |
| Recovery.Speed | directed speed change | Recovery.RcvrLock | rate request/PHY complete | PLL/rate profile |
| Recovery.Equalization | Gen3+ equalization phase | Recovery.RcvrLock/L0 | phase/status/FOM | channel margin/preset |
| L0s/L1/L1SS | 저전력 진입·복귀 | L0 | CLKREQ#, refclock, wake latency | ASPM 정책/clock restore |
| Disabled/Hot Reset/Loopback | 관리 또는 시험 상태 | Detect/Recovery | 누가 해당 bit를 요청했는지 | application 설정/상대편 요청 |
상태 기록 형식
| 필드 | 예시 | 해석 목적 |
|---|---|---|
| timestamp | 123456789 us | 다른 PHY/clock/reset trace와 정렬 |
| LTSSM raw | 0x0b | 문서의 exact state code 보존 |
| decoded state | Recovery.Speed | 사람이 읽을 수 있는 이름 |
| duration | 842 us | timeout과 비정상 체류 판정 |
| lane mask | 0x3/expected 0xf | 처음 탈락한 lane 확인 |
| target/current speed | Gen4/Gen1 | directed speed change 진행 |
| PHY flags | PLL=1 CDR=1 RxDet=0xf | PIPE 경계 비교 |
| AER/counters | BadDLLP +3 | 상태 변화와 protocol error 연결 |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | 1ms polling만 하지 말고 가능한 경우 hardware history/debug trace를 사용합니다. | 짧은 Recovery와 Polling 전이를 포착 | 평균 상태가 아니라 반복 edge 확인 |
| 2 | 각 상태의 enter time, exit time, lane mask와 speed를 CSV로 남깁니다. | 재부팅 간 diff 가능한 형식 | 재현성 수치화 |
| 3 | 실패 직전 마지막 32개 transition을 PHY status와 합칩니다. | 첫 불일치가 한 행으로 보임 | controller/PHY 책임 분리 |
| 4 | Gen1/x1 강제 조건으로 동일 trace를 반복합니다. | 기본 path가 통과하는 최소 조건 | width와 speed 중 민감한 축 식별 |
주의DWC release마다 LTSSM code의 해석표가 달라질 수 있습니다. Linux의 DEBUG0 mask는 값을 꺼낼 뿐, 모든 code의 이름을 보장하지 않습니다. 사용 중인 databook의 state encoding과 대조합니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 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