NVME Reset 分为以下几种:①NVM Subsystem Reset;②Controller Reset; ③Queue Level Reset;④Power Cycle Reset
1.NVME Subsystem Reset
主电源应用于 NVM 子系统;4E564D65h (“NVMe”)被写到NSSR.NSSRC字段;使用 NVMe 管理接口规范中定义的方法请求;或者厂商定义的特殊事件发生时,NVM 子系统将会reset。
当NVM子系统复位时,整个NVM子系统将被重置。这包括在构成NVM子系统的所有控制器Controller level层次的重置,禁用与构成NVM子系统的所有控制器关联的持久内存区域,以及由NVM子系统的所有PCI Express端口转换到检测LTSSM状态。
在 NVM 子系统通电期间发生 NVM 子系统复位可以由 NVM 子系统复位后 CSTS.NSSRO 字段的初始值报告。 主机软件可以使用该字段来确定与控制器的突然失去通信是否是由于 NVM 子系统复位还是某些其他条件造成的。
主机软件通过写入NSSR.NSSRC字段来启动NVM子系统重置的能力是由CAP.NSSRS字段的状态指示的控制器的可选能力。通过不向构成NVM子系统的一个或多个控制器提供该功能,实现可以保护NVM子系统免受意外重置。
导致 NVM 子系统复位的供应商特定事件的发生旨在允许实现从阻止继续正常操作的严重 NVM 子系统内部错误中恢复(例如,致命的硬件或固件错误)。
2.Controller Reset
①有五种方法可以启动控制器级别重置:
NVM Subsystem Reset
常规复位(即 PCI Express 热复位、暖复位或冷复位)
PCI Express 事务层数据链路关闭状态
Function Level Reset(如PCI reset)
控制器复位(即 CC.EN 从“1”转换为“0”)
②控制器级别复位的时候,会产生如下动作:
控制器停止处理任何未完成的管理或 I/O 命令
删除所有的IO CQ/SQ
控制器进入空闲状态。 完成后,CSTS.RDY 被清除为“0”
除以下情况,所有控制器寄存器和内部控制器状态都将复位:管理队列寄存器(AQA、ASQ 或 ACQ)不会作为控制器重置的一部分进行重置;控制器存储器缓冲存储器空间控制寄存器 (CMBMSC) 作为控制器复位和功能级复位的一部分而复位;持久性存储器区域存储器空间控制寄存器 (PMRMSC) 不会作为控制器复位的一部分进行复位。
③ Controller Level Reset后主机的动作:
应根据需要更新寄存器状态;
设置 CC.EN 为 ‘1’
等待 CSTS.RDY 设置为“1”
根据需要使用管理命令配置控制器
根据需要创建 I/O 完成队列和 I/O 提交队列
继续正常的 I/O 操作。
需要注意的是,除controller reset之外的所有Controller Level重置情况都会导致控制器立即失去与主机的通信。 在所有这些情况下,控制器无法指示任何中止或更新任何完成队列条目
3.QUEUE Level Reset
主机可以通过重置它们来reset和/或重新配置 I/O 提交和 I/O 完成队列。 通过删除然后重新创建队列来执行队列级别重置。 在此过程中,主机应等待发送到相应 I/O 提交队列的所有未决命令完成。 为了执行重置,主机向管理队列提交删除 I/O 提交队列或删除 I/O 完成队列命令,指定要删除的队列的标识符。 命令成功完成队列删除操作后,主机然后通过提交创建 I/O 提交队列或创建 I/O 完成队列命令重新创建队列。 在创建Q的过程中,主机可以修改queue的属性。
主机应确保相应的 I/O CQ/SQ在删除该队列之前处于空闲状态。 提交队列删除命令会导致控制器中止任何挂起的命令; 这可能会也可能不会导致IOSQ entry中挂起的命令中止。 需要注意的是,如果对 I/O CQ执行队列级别重置,则应在 I/O CQ重置之前删除与该 I/O CQ相关联的 I/O SQ,并在 I/O SQ重新创建之后创建I/O CQ。 没有与相应 I/O CQ关联的 I/O SQ的行为是未定义的。