본문으로 건너뛰기
Embedded Debugging · 8/9

CXL Link Training 디버깅 — LTSSM 상태와 Protocol Analyzer 활용

· Hawk · 4분 읽기
cxl link-training ltssm protocol-analyzer debugging

#왜 어려운가

CXL 링크 문제는 원인이 여러 층에 흩어집니다. PCIe PHY·LTSSM·Flex Bus·CXL 프로토콜·DVSEC·CEDT 어디서든 막힐 수 있고, 각 층의 진단 도구가 다릅니다. 링크가 안 올라옴이라는 한 증상으로 최소 5가지 원인 후보가 나옵니다.

이 장은 증상별 진단 흐름을 정리합니다.

#LTSSM 상태 — 어디서 멈췄나

LTSSM(Link Training and Status State Machine)이 L0에 도달하지 못하면 config space access 자체가 불가능합니다. 멈춘 상태가 어디인지를 먼저 알아야 합니다.

LTSSM은 Detect → Polling → Configuration → L0 순으로 진행하며, L0 이후에는 일시 오류 시 Recovery로 빠졌다가 재training하거나 L0s/L1/L2 전력 절감 상태로 내려갑니다. 각 상태가 하는 일은 다음과 같습니다.

상태하는 일
Detect슬롯에 디바이스가 있는지 확인
PollingTS1/TS2 ordered set 교환
ConfigurationLane 번호 정렬, link width 협상
L0정상 동작
Recovery일시 오류, 재training
L0s / L1 / L2전력 절감 상태
멈춘 상태의심 원인
Detect디바이스 미인식 — 슬롯 불량·디바이스 전원 없음·reset 잘못
PollingTS1/TS2 못 받음 — PHY 설정 오류·신호 무결성·equalization 실패
ConfigurationLane reverse·width mismatch·polarity 문제
Recovery 반복신호 marginal — eye margin 부족, retimer 필요

SoC의 PCIe controller register가 LTSSM 상태 필드를 노출하는 경우가 있습니다. 레지스터 offset과 상태 값 인코딩은 컨트롤러마다 다르므로, 해당 SoC reference manual에서 확인한 값으로 읽습니다.

#Protocol Analyzer 캡처

물리적 디버깅의 마지막 무기가 protocol analyzer입니다.

도구회사가격대용도
Summit T516Teledyne LeCroy—PCIe 5.0 / CXL, x16 32GT/s 캡처

가격은 벤더가 공개하지 않아 —로 둡니다.

캡처할 항목:

  • TS1·TS2 ordered set — Polling 단계 분석
  • Flit 흐름 — CXL.mem M2S·S2M sequence
  • Flex Bus 모드 협상 — link training 중 modified TS1/TS2 ordered set으로 CXL 지원 여부를 주고받는 구간

#호스트 측 진단 명령

Terminal window
# 1. 디바이스가 PCIe로 보이는지
$ lspci -nn | grep -i cxl
5e:00.0 CXL [0502]: ...
# 안 보이면 — LTSSM이 L0에 도달하지 못한 것
# 2. Link 속도/폭 확인
$ lspci -vvv -s 5e:00.0 | grep -E "LnkSta|LnkCap"
LnkCap: Port #0, Speed 32GT/s, Width x16, ASPM ...
LnkSta: Speed 32GT/s, Width x16
# LnkSta 폭이 LnkCap보다 좁으면 — Configuration에서 일부 lane만으로 협상된 것
# 3. CXL DVSEC 발견 여부
$ lspci -vvv -s 5e:00.0 | grep -A 2 "Designated Vendor-Specific"
Capabilities: [...] Designated Vendor-Specific: Vendor=1e98 ID=0000 Rev=1 Len=56: CXL
PCIe DVSEC for CXL Devices
CXLCap: Cache- IO+ Mem+ ...
# 없으면 — CXL 호환 디바이스 아니거나 firmware 문제
# 4. CXL 서브시스템 등록
$ ls /sys/bus/cxl/devices/
# 비어 있으면 — CEDT 누락 또는 cxl_acpi 미로딩
$ dmesg | grep -i cxl
$ lsmod | grep cxl

#자주 만나는 함정

증상원인
lspci에 안 보임LTSSM이 L0 미도달. 슬롯·전원·reset 점검
lspci엔 있는데 cxl 디렉터리 비어 있음CEDT 누락 또는 cxl_acpi 미로딩
LinkSta “Train+” 깜빡임Recovery 반복 — eye margin 부족·retimer 필요
dmesg에 “Device DVSEC not present, skip CXL.mem init”cxl_pci가 CXL Device DVSEC을 찾지 못해 CXL.mem 초기화를 건너뜀 (drivers/cxl/pci.c)

#디버깅 체크리스트

  1. lspci -nn에 디바이스 보이는가 → 없으면 LTSSM 멈춤
  2. lspci -vvv의 LnkSta가 정상인가 → Recovery 반복이면 신호 문제
  3. DVSEC이 있는가 → 없으면 CXL 미지원 디바이스
  4. /sys/bus/cxl/devices/에 등록되었는가 → 비면 CEDT 또는 드라이버 문제
  5. cxl list -RT로 토폴로지 확인 → 누락 노드 있으면 enumeration 문제
  6. Protocol analyzer 캡처 (마지막 수단)

#정리

  • CXL 링크 디버깅은 원인이 PHY·LTSSM·Flex Bus·DVSEC·CEDT·드라이버 여러 층에 흩어집니다.
  • LTSSM 상태를 먼저 확인해 어느 단계에서 멈췄는지 파악합니다.
  • lspci → cxl-cli → dmesg 순으로 호스트 측 진단을 진행합니다.
  • 신호 무결성 의심이면 protocol analyzer가 마지막 무기입니다.

#다음 장 예고

Ch 9 — CXL 디바이스 트러블슈팅. RAS 이벤트·poison list·media error를 추적하는 흐름.

#관련 항목