본문 바로가기
Study Technical specifications/PCIe

PCIe/NVMe Reset

by 체리 2026. 6. 6.
반응형

PCIe 기반 NVMe SSD의 Reset 정리

PCIe spec과 NVMe spec에 정의된 reset들을 한 문서로 묶은 정리본. 트리거·범위·보존 규칙, 실무 발생 상황, 그리고 "reset처럼 보이지만 reset이 아닌 것들"까지 포함.


1. 큰 그림

PCIe SSD에 걸리는 reset은 두 계층으로 나뉜다.

  • PCIe 계층 (4종) — Conventional Reset(Cold·Warm·Hot)과 FLR.
  • NVMe 계층 (2종) — Controller Reset(CC.EN→0)과 NVM Subsystem Reset(NSSR).

그리고 reset 분류에는 들어가지 않지만 자주 혼동되는 것들 — Link Disable, Loopback, 비정상 링크 다운(abnormal link down) — 이 따로 있다. 이들은 reset(디바이스 재초기화)이 아니라 링크·LTSSM 차원의 동작/사고다. (7장 참고)

핵심 한 줄: "전원이 빠졌나 / 링크가 내려갔나 / 무엇이 초기값으로 돌아가나" 를 기준으로 구분한다.


2. Reset 종류 비교표

Reset 계층 트리거 범위 핵심 특징

Cold Reset PCIe (Fundamental) 메인 전원 off→on (PERST#) 디바이스 전체 + 링크 sticky는 Vaux 유지 시만 보존, HwInit 재초기화
Warm Reset PCIe (Fundamental) 전원 유지 + PERST# 토글 디바이스 전체 + 링크 sticky 보존, HwInit 재초기화
Hot Reset PCIe (Conventional) in-band, Secondary Bus Reset 비트 포트 하위 전체(형제 포함) + 링크 sticky·HwInit 보존, 일반 config 초기화
FLR PCIe Device Control의 Initiate FLR 비트 function 1개, 링크 유지 sticky·HwInit·특수 레지스터 보존, 100ms 내 완료
Controller Reset NVMe CC.EN 1→0 컨트롤러만, 링크 유지 PCIe config·AQA/ASQ/ACQ 보존, 큐 삭제
NVM Subsystem Reset NVMe NSSR 레지스터에 "NVMe"(0x4E564D65) 기록 서브시스템 전체 + 링크 다운 옵션(CAP.NSSRS), 모든 컨트롤러 리셋
  • Cold/Warm/Hot = Conventional Reset. 이 중 Cold/Warm은 Fundamental Reset.
  • FLR은 NVMe 1.4 spec에서 필수("shall")로, 요즘 NVMe SSD는 사실상 모두 지원.

3. 상태·레지스터 보존 매트릭스 (PCIe 계층)

reset이 끝났을 때 각 상태가 초기화되는지 / 보존되는지.

상태 / 레지스터 Cold Warm Hot FLR

일반 config (RW · RO · RW1C) 초기화 초기화 초기화 초기화
Sticky (RWS · ROS · RW1CS, AER) 조건부 (Vaux) 보존 보존 보존
HwInit (스트랩 · serial EEPROM) 재초기화 재초기화 보존 보존
Link / LTSSM 상태 재학습 재학습 재학습 영향 없음
다른 function (동일 디바이스) 초기화 초기화 초기화 영향 없음
진행 중 TLP / Flow Control 상태 소거 소거 소거 소거(해당 function)

읽는 법:

  • Sticky 행이 거의 다 "보존" — sticky는 모든 Conventional Reset과 FLR에서 제외된다. 에러 로깅 정보를 reset 후에도 소프트웨어가 읽게 하려는 설계. Cold만 "Vaux 유지 시 보존"으로 조건부.
  • HwInit은 Fundamental(Cold/Warm)에서만 재초기화 — 스트랩/EEPROM 재로딩이 Fundamental Reset에 묶여 있어서, Hot/FLR에서는 그대로 유지.
  • FLR 열은 링크·다른 function이 "영향 없음" — function 단위 리셋의 핵심. (단, FLR이 초기화하지 않는 특수 레지스터 — MPS·RCB, 전원관리·flow control·link control 관련 — 도 보존되며, 정확한 목록은 spec rev에 따라 확인.)

4. NVMe 계층 reset 효과

PCIe 매트릭스와 레벨이 다르므로 별도 정리.

대상 Controller Reset (CC.EN→0) NVM Subsystem Reset (NSSR)

I/O 큐 삭제 삭제 (전 컨트롤러)
Admin 큐 리셋(비워짐) 리셋
Admin Queue 레지스터 (AQA/ASQ/ACQ) 보존 초기화
컨트롤러 레지스터 (CC 등, 비영구 상태) 기본값 기본값
PCIe config space 보존 초기화 (재열거 필요)
PCIe 링크 유지 다운 → LTSSM Detect
범위 컨트롤러 1개 서브시스템 전체(모든 컨트롤러)
  • Controller Reset: 가장 가벼움. 큐만 비우고 컨트롤러 상태를 되돌리되 PCIe config와 Admin Queue 레지스터는 안 건드림. 드라이버의 정상 재초기화 경로(CC.EN=1 → CSTS.RDY 대기 → Identify …).
  • NVM Subsystem Reset: 가장 무거움. 옵션 기능(CAP.NSSRS로 지원 여부 확인). 링크까지 내려서 재열거가 필요하므로, 컨트롤러가 완전히 무응답일 때의 마지막 수단에 가깝다.

5. PERST# 와 sticky — 자주 헷갈리는 부분

  • PERST#는 reset 종류가 아니라 신호다. Fundamental Reset을 일으키는 트리거이며, 전원이 유지된 채 토글하면 Warm, 전원 인가 시점이면 Cold로 동작한다. (즉 PERST#는 Cold/Warm 둘 다의 트리거)
  • sticky를 지우는 건 PERST# 신호가 아니라 전원(Vaux)이 사라지는 것. PERST# 어서션은 "재초기화해"라는 신호일 뿐 전원을 끊지 않는다. 그래서 전원이 유지되는 Warm Reset에서는 sticky가 보존되고, 메인 전원이 제거되는 Cold Reset에서만 Vaux 유무에 따라 갈린다.
  • ⚠ spec 거동 ≠ 구현 거동. spec상 보존이라도 일부 IP는 다르게 동작한다. 예: Intel P-Tile PCIe IP는 warm reset 또는 PERST 어서션이 config space의 sticky를 지우는 errata가 있어, 필요 시 소프트웨어가 값을 복원해야 한다. → 타겟 IP의 데이터시트·errata 확인 필수.

6. 계층 관계와 범위

  • PCIe → NVMe 전파: PCIe의 FLR·Conventional Reset이 SSD의 function을 리셋하면, 그 결과로 NVMe 컨트롤러도 함께 리셋된다. (PCIe 리셋은 컨트롤러 리셋을 포함하는 상위 동작)
  • 범위 사다리:
  • Controller Reset (컨트롤러만) ⊂ FLR (function) ⊂ Conventional Reset (+ 링크) ~ NVM Subsystem Reset (서브시스템 전체 + 링크 다운, 가장 광범위)
  • 비대칭 포인트: NVMe 계층 중 Controller Reset은 PCIe를 안 건드리는데, NSSR은 오히려 PCIe 링크까지 내린다. 두 계층이 단방향이 아니라 양방향으로 얽혀 있다.

7. NVMe SSD에서 각 reset이 발생하는 상황

Cold Reset — "메인 전원 off→on"

  • 시스템 전원 인가: S5(완전 off)·S4(hibernate)에서 부팅, AC 복구.
  • 전원 관리: 노트북의 D3cold → D0 복귀(런타임 PM이 SSD 전원을 끊었다 켤 때, 정상 사용 중에도 반복 가능).
  • 드라이브 단위: U.2/U.3/EDSFF hot-plug 삽입, BMC/엔클로저의 명령 전원 사이클.

Hot Reset — "상위 포트가 SBR을 때림"

  • PCIe 에러 복구(가장 흔함): fatal/uncorrectable 링크 에러 시 AER의 기본 복구 방식이 hot reset(다운스트림 포트의 Secondary Bus Reset). DPC 복구도 여기 연관.
  • 소프트웨어 리셋 폴백: FLR 등 더 가벼운 리셋을 지원하지 않으면 Linux가 부모 브리지의 secondary bus reset으로 폴백(reset_method의 bus).
  • 가상화/패스스루(VFIO), 링크 width/speed 재협상.
  • ⚠ 범위 주의: SBR은 그 포트 하위의 모든 디바이스를 리셋한다. 스위치 다운스트림 포트 뒤라면 형제 드라이브까지 같이 리셋. (M.2가 전용 Root Port 직결이면 그 드라이브만)

FLR — "function 1개만"

  • PCI 패스스루(VFIO): VM 할당 시 깔끔한 기본 리셋. 형제 디바이스를 안 건드려 hot/bus reset보다 선호(reset_method의 flr).
  • SR-IOV VF 리셋: 한 테넌트의 VF만 리셋, PF·다른 VF는 계속 동작.
  • 드라이버 재바인드: 호스트 드라이버 ↔ vfio-pci 전환 시 상태 정리.
  • ⚠ CRS 함정: FLR은 100ms 내 완료돼야 하지만 직후 컨트롤러가 CRS를 반환할 수 있다. 너무 일찍 접근하면 config 복원이 깨져 probe가 실패(Intel 750 NVMe 사례). 커널은 100ms 대기 후 최대 1초까지 CRS 폴링.

Controller Reset / NVM Subsystem Reset

  • 보통 드라이버는 점점 센 reset을 시도: Controller Reset(정상 재초기화) → FLR(에러 복구/패스스루) → NSSR(컨트롤러 무응답) → 전원 사이클(최후).

8. Reset가 아닌 것들 (구분)

분류 기준은 "디바이스를 재초기화하느냐". 아래 셋은 reset이 아니다.

항목 정체 특징

Link Disable 링크 상태 제어 Link Control의 Link Disable 비트(또는 TS1의 Disable Link 비트). 링크를 Disabled 상태로 내려서 유지. 디바이스 config는 그대로(재활성화 시 config 복원 불필요).
Loopback 테스트 모드 directed LTSSM 상태. reset 아님.
비정상 링크 다운 이벤트(사고) 명령 없이 발생. L0에서 신호 손실/에러로 빠짐.

Link Disable을 풀면 링크는 Detect부터 재학습하지만, 디바이스 config space는 살아 있다. Hot Reset 후엔 BAR·Command 등을 복원해야 하지만 Link Disable 사이클엔 불필요 — 이 차이가 "reset이냐 아니냐"를 가른다.

LTSSM에서의 위치

  • Hot ResetDisabled(Link Disable) 는 각각 LTSSM의 독립적인 top-level 상태(박스)다.
  • 비정상 링크 다운은 상태가 아니라, L0에서 비자발적으로 빠져 Recovery→Detect로 떨어지는 **이벤트(edge)**다.
  • 셋의 공통점: 모두 Recovery를 거쳐 Detect에서 링크를 다시 세운다. (Fundamental/Hot Reset 직후 첫 상태도 Detect)
flowchart TD
  Detect["Detect (재시작 지점)"] --> PC["Polling / Config (링크 학습)"]
  PC --> L0["L0 (정상 동작)"]
  L0 <--> Recovery["Recovery (재학습 허브)"]
  Recovery -->|directed| HotReset["Hot Reset (지정 리셋)"]
  Recovery -->|directed| Disabled["Disabled (Link Disable)"]
  HotReset -->|자동 재학습| Detect
  Disabled -->|재활성화 시| Detect
  Recovery -. "비정상 링크 다운 / 복구 실패" .-> Detect

구분의 두 축:

  1. 지정(directed) vs 비지정(event) — Hot Reset·Disabled는 비트를 써서 명령하는 상태, 비정상 링크 다운은 아무도 명령하지 않은 사고.
  2. 복귀 방식 — Hot Reset은 끝나면 Detect로 자동 재학습, Disabled는 재활성화 전까지 머묾.

9. 한 줄 체크리스트

  • sticky 정보가 중요하면 reset/전원 이벤트 전에 수집 (구현에 따라 날아갈 수 있음).
  • FLR 후엔 CRS 대기(100ms~최대 1s) 후 접근.
  • Hot Reset(SBR)은 포트 하위 형제까지 영향 — 영향 범위 먼저 확인.
  • "spec 거동"으로 표를 쓰되, 타겟 IP의 errata를 항상 교차 확인.

참고

본 문서는 PCIe Base Specification과 NVMe Base Specification의 reset 관련 동작을 토대로 정리한 것이다. 레지스터 비트 위치·타이밍 값·FLR 비초기화 레지스터 목록 등 세부 사항은 사용 중인 spec revision과 컨트롤러/IP 데이터시트에서 최종 확인할 것.

반응형

댓글