PCIe/NVMe Reset
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 Reset과 Disabled(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
구분의 두 축:
- 지정(directed) vs 비지정(event) — Hot Reset·Disabled는 비트를 써서 명령하는 상태, 비정상 링크 다운은 아무도 명령하지 않은 사고.
- 복귀 방식 — 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 데이터시트에서 최종 확인할 것.