NVMe Spec 2장에서는 어떻게 PCI header, PCI capabilities, PCIe extended capabilites가 NVMe controller에 대해 구성되어 있는지를 살펴 본다.
PCIe register에 대한 큰 틀에서의 구성이다. SSD 내에 존재하는 controller의 PCIe와 관련된 IP의 register들에 대한 설정이다. PCI header는 0x00 ~ 0x3F까지 범위이며, 뒤의 register들은 펌웨어에서 메모리 어느 부분에 베이스 주소를 가지고 갈 것인지에 따라 다르게 설정될수 있다.
가장 먼저 PCI header에 대해 살펴 볼 것이다.
PCI Header
PCI header는 디바이스의 타입에 따라 Type 0, Type 1 두 종류로 나뉘며 Type에 따라 header의 bit가 다르게 사용된다. 하지만, 여기에서는 RC 혹은 Bridge를 사용한 디바이스가 아닌 RC에 다이렉트로 연결된 End device를 가정으로 설명한다.
- Type 0 header: PCI Express 디바이스
- Type 1 header: Switch 및 Root Complex 가상 PCI Bridges
그리고 PCI header에 대해 spec을 그냥 읽는 것 보다는 하나의 디바이스를 예제로 보는 것이 좋기 때문에 아래처럼 실행하자.
$ lspci -x
PCI slot에 연결된 디바이스들에 대해 정보를 알기 위해선 리눅스에서 lspci 명령을 통해 알수 있다. Configuration address 중 PCI header 부분에 대해서만 알고 싶다면 -x 옵션을 전체 4KB에 대한 영역 전부 알고 싶다면 -xxx 옵션을 주면 된다. 아래는 Virutual box에서 가상으로 생성한 NVMe device의 결과이다.
- ID - identifiers
- ID 값에 대한 비트 필드를 나타낸다.
- vendor ID와 devie ID 두개의 필드를 가진다.
- vendor ID: 80ee
- devcie ID: 4e56
- 삼성 디바이스의 경우 144d의 vendor ID를 가지게 된다.
- vendor ID list를 보고 싶으면 여기를 들어가면 볼 수 있다.
- CMD - command
- 2B의 값을 가진다.
- 값: 0x0007
- Enable
- I/O space enable
- Memory space enable
- bus master enable
- device로 하여금 I/O space와 memory space 영역에 접근을 가능하도록 한다.
- bus master로 동작하기 때문에 위의 영역을 통해 데이터 전송을 할 수 있다. (어떤 데이터를 주고 받는 것일까?)
- STS - device status
- 2B의 값을 가진다.
- 값: 0x0010
- Enable
- capabilites list
- capabilities list가 존재 함을 나타낸다.
- RID - revision ID
- 1B의 값을 가진다.
- 값: 0x00
- controller의 수정 버전을 나타내는 것 같다. (확실치 않음, 내가 본 5대의 SSD는 모두 0의 값을 가짐)
- CC - class code
- 3B의 값을 가진다.
- 값: 0X010802
- Programming interface : 0x02, 즉 I/O controller가 있음을 나타낸다.
- sub class code : 0x08
- base class code: 0x01
- PCI의 class 분류를 볼려면 여기를 누르면 된다.
- 대 분류, 중분류라고 생각 하면 될거 같다. mass storage 중에서도 플로피 디스크, IDE 등 다양한 storage들이 존재하는데 그 중에서 sub class code가 0x08이므로 non-volatile memory를 나타낸다.
- CLS - cache line size
- 1B의 값을 가진다.
- 현재 여기에서는 0의 값을 가져 cache 가 없는 것으로 확인 되지만, 실제 SSD중 일부 제품의 경우 해당 크기가 정해져있는 것으로 확인 되었다.
- MLT - master latency timer
- 1B의 값을 가진다.
- 값: 0X40
- HTYPE - header type
- 1B의 값을 가진다.
- 여기에서는 두개의 필드 모두 0의 값을 가진다. 하지만, NVM subsyetem에서 multi function을 지원하는 경우 해당 7번 bit는 set된다.
- BIST - build in self test
- 1B의 값을 가진다.
- 모두 0의 값을 가진다. BIST를 지원하지 않는다.
- MLBAR - memory register base address
- 4B의 값을 가진다.
- 값: 0xf0808000
- MUBAR - memory register base address
- MLBAR의 base address와 합쳐서 최대 64bit의 base address 주소 공간을 가질 수 있다.
- BAR2 - index/data pair register base address
- 4B의 값을 가진다.
- 값: 0x0000d271
- CCPTR - cardbus cis pointer
- 지원 안함
'Storage System' 카테고리의 다른 글
[NVMe] Spec 1.4 정리 - 4장 Data Structures (0) | 2020.02.20 |
---|---|
[NVMe] Spec 1.4 정리 - 3장 Controller Registers (0) | 2020.01.16 |
[NVMe] Spec 1.4 정리 - 2장 System BUS (PCI Express) Registers (2/?) (0) | 2020.01.14 |
[NVMe] Spec 1.4 정리 - 2장 System BUS (PCI Express) Registers (1/?) (0) | 2020.01.08 |
[NVMe] Spec 1.4 정리 - 1장 Introduction (0) | 2020.01.08 |