[FPGA 实现及PCIe IP 核知识点] NVMe 热插拔过程以及常见问题(一)

NVMe简介

SATA 3.0的速度上限只有6Gbps,随着高性能运算等需求的发展,已经难以满足很多企业级应用场景的需求。而基于PCIe (PCI Express) 3.0的x4 NVMe (Non-Volatile Memory express)理论速度最大可以达到32GT/s,基于PCIe 4.0的x4 NVMe理论速度甚至可以达到64GT/s。另外一方面,Intel和AMD服务器CPU对于PCIe IO lane的数量也越来越给力。Intel从Purley时代开始,单CPU达到48 lanes,下一代Eagle Stream将达到 80 lanes;而AMD更是从Naples开始单CPU就支持128 lanes。客户的需要和更多的PCIe lanes,使得NVMe的使用变得越来越流行了。

但是毕竟NVMe真正开始流行时间尚短,开发过程中也常常遇到各种问题,尤为常见的是各种掉盘和热插拔失败问题。

从电气和软件逻辑角度来说,NVMe跟常见的PCIe CEM (Card Electromechanical)并没有太多区别,最主要的一点区别就是CEM add-in Card一般装在机箱内,通常不需要支持热插拔 (Hot plug/Hot remove/Surprise remove) 和热交换 (Hot swap),而对于NVMe作为外接硬盘这基本是标配功能。

学习热插拔之前,我们先看一下硬件设计的框图示例:

pcie nvme.jpg

跟CEM比,有以下几个特点:

  1. 根据SFF-8639规范定义,U.2接口的NVMe盘是通过IFDET# (InterfaceDetect)信号和PRSNT#逻辑电平检测判断是否存在
  2. 用PWRDIS#关闭12V电源,提供安全移除的支持
  3. 复杂的I2C链接:背板 – 主板 – CPU (VPP)
  4. 硬盘活动信号ACTIVITY和LED
  5. 接口类型(X2或X4)

NVMe 热插入过程

我们再来看一个常见的NVMe插入(不包含Retimer和PCIE Switch)的流程:

  1. NVMe 插入,触发IfDet#,让背板知道有盘插入

  2. 背板侦测到IfDet#,并且通过I2C发给主板

  3. 主板再通过I2C转给VPP

  4. VPP再把这个信号转给CPU

  5. CPU触发中断通知操作系统

  6. 操作系统检测PCIe Capability中的Slot Status寄存器里面PRESENCE_DETECT_STATE和PRESENCE_DETECT_CHANGED

  7. 如果PCIe Capability中的Slot Capability寄存器里面的PWR_CONTROLLER_PRESENT被设置,则可以通过系统软件(如操作系统)控制置起Slot Control寄存器里面的PWR_CONTROLLER_CNTL bit来打开电源,否则电源由主板控制及时打开(也有的一直是打开的)

  8. 主板准备Clock

  9. 等待一段时间,Clock准备好之后,通过I2C发生PERST#给背板

  10. 背板收到PERST#之后,将NVMe的PERST#拉高

  11. CPU开始NVMe的PCIe Training过程

  12. Training完成后,置起PCIe Capability中Link Status寄存器中的 Data Link Layer Link Active

  13. CPU发送中断通知操作系统

  14. 操作系统检测设备并且初始化,比如分配内存资源。

下篇文章我们会详细介绍在热插拔过程中出现的问题以及简单的识别方法。

编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除
匿名用户

匿名