目录
前言
本文从PCIe协议即软件的角度和硬件实现的角度,详细介绍讨论了NPEM(Native PCIe Enclosure Management)。文中加了很多我自己的见解,方便理解。如有错误,欢迎各位大佬指出,我将积极改正。
1. NPEM的定义
在最开始我们先搞清楚NPEM是什么?NPEM全称Native PCIe Enclosure Management,是一种新的,更高级的LED management。不熟悉的小伙伴可能要问,Enclosure是啥?LED management又是啥?
Enclosure
机柜,在这里指包含一个或多个PCIe SSD硬盘的平台、机架、一个盒子或一组盒子。说简单点就是放SSD的盒子。 盒子上有灯,用于指示SSD硬盘状态的指示灯。
LED management
说白了就是一般硬盘上有2个或者3个LED指示灯,指示硬盘的状态,怎么根据硬盘的不同状态点这个LED灯,就是LED management。
而NPEM,其实就是用于控制SSD硬盘状态灯的一种增强型的新机制,它比传统的LED management支持更多的硬盘状态,也有多种不同的实现方式。NPEM是从PCIe 4.0开始引入,预计将来的PCIe4.0 或PCIe 5.0的SSD都将支持此功能。
2. 从PCIe协议看NPEM
2.1 寄存器解析
传统的LED management模式中,通过Slot Control Register中的Bit 6-7 的Attention Indicator Control (AIC)和Bit 8-9 的Power Indicator control (PIC)来控制LED,如下图。这四个bit具体是依据什么规则控制LED的呢,这涉及到IBPI,我们放到后面再聊。
从PCIe 4.0开始为NPEM扩展了4组寄存器,分别是NPEM Extended Capability Header,NPEM Capability Register,NPEM Control Register和NPEM Status Register,如下图所示。
NPEM Extended Capability Header
只读寄存器,主要存放NPEM扩展Capability ID和version等,用于定位标识这组寄存器。与NPEM具体功能没有关系。
NPEM Capability Register
这组寄存器是用来表示NPEM在该设备上的支持情况的,该设备是否支持NPEM功能以及NPEM的可选功能是否在这个设备上实现了。如果该Bit为1,则代表该Bit对应的功能是支持的。
比如Bit 0 - NPEM Capable如果置1,代表该设备支持NPEM功能。
NPEM Control Register
这个寄存器就是控制NPEM是否使能和点灯操作了。但想要操作生效的前提就是NPEM Capability Register中的对应Bit是置1的。
NPEM Status Register
这个寄存器只有一个重要的Bit就是NPEM Command Completed。这个Bit的功能就是当NPEM机制完成了一次操作的响应后,就把这个Bit置1。所以在操作NPEM Control Register的时候,必须确定上一次的操作完成了,才能发起下一次操作。具体NPEM的软件工作流程,在后面会提到。
以上就是对NPEM的PCIe寄存器的大致介绍,具体每一个Bit是干什么用的这里就不展开讲了,感兴趣的小伙伴可以在PCIe 4.0或更新版本的规范中去找,在Native PCIe Enclosure Management Extended Capability (NPEM ExtendedCapability) 这一节。这里附上PCIe 4.0的下载地址:https://members.pcisig.com/wg/PCI-SIG/document/10912?downloadRevision=active
2.2 NPEM在系统中的位置
驱动根据SSD的状态操作NPEM寄存器,将寄存器的值转换成为LED的亮灭这一系列的操作,在这里我们称为NPEM机制。在PCIe协议中规定了NPEM机制既可以实现在下游端口(Downstream Port),也可以实现在上游端口(Upstream Port)。协议中对上下游端口的定义是:靠近RC的端口称为上游端口,扩展出来的端口称为下游端口。
我在这里的理解是NPEM机制可以实现在服务器等平台端,也可以实现在终端设备,比如SSD上。
实现在平台端框图如下:
实现在终端设备的框图如下:
2.3 软件工作流程
下图是PCIe协议中给出的,操作NPEM寄存器驱动的软件流程:
- 驱动获取到该SSD状态发生更新,就写NPEM control Capability寄存器的对应位来操作相应的LED。
- 当写操作完成,NPEM机制就发出对LED的控制信号。
- 完成后NPEM机制就将NPEM Status寄存器中的NPEM Command Completed位置1,表示上个操作执行完成。
- Enclosure上的LED控制逻辑电路会将LED的操作信号转换成符合IBPI模式的LED闪烁方式,点亮LED灯。
讲到这里我们就不得不引入IBPI的相关知识了,这个反复出现的IBPI到底是个啥?
3. 关于IBPI
3.1 IBPI的定义
Serial GPIO IBPI (International Blinking Pattern Interpretation),是一个标准协议。原本是用来统一的服务器背板上SATA和SAS盘的指示灯的,比如一个盘有几个指示灯,每个指示灯什么含义,针对硬盘的不同状态每个灯是亮是灭还是闪,闪的话是按什么频率闪等等。后来也被SSD将这一标准沿用。这里附上IBPI的协议下载地址,感兴趣的同学可以下载来看看,只有十几页。
3.2 IBPI制定的标准
IBPI定义了背板每个SAS/SATA slot可以有2个或者3个指示灯,并且规定了每个LED的含义,如下图。
并且详细的制定了当硬盘处于某种状态时,这些LED分别都应该怎么亮,如下图。
3.3 IBPI在SSD上的应用
以Intel的Eagle Stream平台为例,其SSD的LED management就借鉴了IBPI,指示灯一共可以表示4种状态SSD状态:OK、Locate、Fault和Rebuild。具体对应关系如下表:
Status | LED Status |
---|---|
OK | off |
Locate | 4 Hz Blink |
Fault | Solid on |
Rebuild | 1 Hz Blink |
对于软件来说想让LED改变状态设置寄存器就可以,将PCIe寄存器的值转化为对LED的操作就交给了硬件实现,那么硬件是怎么实现的呢?
3. 硬件实现
这一节我本打算讲传统LED management模式下和NPEM模式下的硬件实现,但由于NPEM技术太新。Intel虽然已经打算在下一代CPU上支持这个功能,但具体的硬件设计目前还没有公开,无法披露。所以这一节我们就只讲传统的LED management硬件实现原来,NPEM应该也是一样的原理,只会在传统的基础上进行改造。具体NPEM的硬件实现,会在之后更新。
3.1 传统模式的硬件实现
3.1.1 VPP和PCA9555
在开始之前我们不得不引入一个概念叫VPP。
VPP - Virtual Pin Port,翻译过来叫虚拟pin脚端口。它的作用就是让CPU通过一个端口使用SMBus操作真实的GPIO。VPP位于SMBus上为LED management和热插拔服务。VPP的实现是使用了一个叫PCA9555的芯片。这里附上PCA9555手册的下载地址。
PCA9555的作用就是I2C/SMBus转GPIO,通过I2C或者SMBus扩展你的GPIO。
下图是PCA9555的逻辑原理图,左边的I2C接口接CPU的SMBus,右边接SSD的LED。这样CPU就可以通过SMBus协议操作具体的LED了。
3.1.2 传统模式的硬件框图
上图是Intel的Eagle Stream平台上传统LED management的硬件设计框图。Eagle Stream平台上采用的是在Root port端的downstream port实现LED management电路的方式。图中实线表示真实的电路连接,虚线表示PCI Slot Control寄存器控制的对应IO,并不是真实的电路连接。
接下来我们根据序号一一解析框图的组成:
- 表示的是CPU的Slot Control寄存器,此次我们关注的主要是AIC和PIC这四个对LED进行控制的Bit。之前我们提到了SSD LED的四种状态,在IBPI里定义了用Fault和Locate两种信号来控制LED,这里将AIC和PIC复用为这两个信号:APC -> Fault, PIC -> Locate。与LED状态的对应关系如下表,其实我们可以发现起作用的只有Bit1,Bit0一直是1。
- CXPSMB:是CPU上VPP的接口,负责和VPP通信。把PCI寄存器中的读写动作翻译成SMBus数据发送给VPP。
- CPU通过SMBus与VPP(PCA9555)相连,图中SMBALERT#是用于VPP通知CPU热插拔信号的,与此次内容无关。
- PCA9555:VPP实现的主要元器件,负责把SMBus信号转换成对具体的GPIO的控制。
- IBPI逻辑模块:负责把AIC和PIC控制的Pin 0和Pin 1按照上表,转化成对应的LED状态,然后控制LED。
- SSD LED:SSD enclosure上表示SSD状态的LED。
以上就是关于NPEM的全部内容,关于NPEM的硬件实现等待后续更新。如有错误,欢迎各位大佬指出,我将积极改正。