NVMe Spec 2장에서는 어떻게 PCI header, PCI capabilities, PCIe extended capabilites가 NVMe controller에 대해 구성되어 있는지를 살펴 본다.

PCIe registers

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

Type 0 header
PCI header 설명

그리고 PCI header에 대해 spec을 그냥 읽는 것 보다는 하나의 디바이스를 예제로 보는 것이 좋기 때문에 아래처럼 실행하자. 

$ lspci -x

 

$ lspci --help 결과

PCI slot에 연결된 디바이스들에 대해 정보를 알기 위해선 리눅스에서 lspci 명령을 통해 알수 있다. Configuration address 중 PCI header 부분에 대해서만 알고 싶다면 -x 옵션을 전체 4KB에 대한 영역 전부 알고 싶다면 -xxx 옵션을 주면 된다. 아래는 Virutual box에서 가상으로 생성한 NVMe device의 결과이다. 

$ lspci -x 결과

  • 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
    • 지원 안함

+ Recent posts