本文主要是介绍NVMe Reset,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Reset在PCIe设备中,是很重要的基础流程,参考NVMe Spec协议,定义了三种类型的复位:
- NVM Subsystem Reset
- Controller Level Reset
- Queue Level
下面针对这三种类型分别进行介绍:
1. NVM Subsystem Reset
触发NVM Subsystem Reset有以下几种方式:
- NVM子系统上电
- Host向Controller Register NSSR.NSSRC字段写入4E564D65h(“NVMe”);
- 通过NVMe-MI定义的NVM Subsystem Reset方法执行Reset动作;
- Vendor自定义的事件发生。
当NVM Subsystem Reset发生时,整个NVM Subsystem将会复位。这包括组成NVM子系统上所有的控制器,应该发生Controller Level Reset。禁用NVM子系统中所有控制器的Persistent Memory Region,以及将NVM子系统的PCIe端口LTSSM状态机转换到Detect状态。
NVM Subsystem Reset以后,Host可以通过CSTS.NSSRO字段来判断NVM子系统复位或其它情况。
2. Controller Level Reset
以下几种方法均可触发Controller Level Reset:
- NVM Subsystem Reset;
- Conventional Reset(参考PCIe里的常规复位,包括Cold Reset、Warm Reset);
- Function Level Reset(参考PCIe协议规范);
- Controller Reset (i.e., CC.EN transitions from '1' to '0').
当控制器触发Controller Level Reset将会执行以下动作:
- Controller停止处理任何Outstanding Admin 或 I/O Command;
- 所有I/O Submission Queue将会被删除(Host下发Delete SQ);
- 所有I/O Completion Queue将会被删除(Host下发Delete CQ);
- Controller进入Idle状态后,CSTS.RDY清为‘0’;
- 所有的Controller Register和内部Controller状态复位到初始状态,除了以下这些:
- Admin Queue registers (AQA, ASQ, or ACQ)不会被复位;
- Controller Memory Buffer Memory Space Control register(CMBMSC)在Controller Reset或Function Level Reset不会被复位;
- Persistent Memory Region (PMRMSCU和PMRMSCL)在Controller Reset中不会被复位。
在Controller Level Reset后,Host和Controller要继续通信,Host应该执行以下流程:
- 适当更新寄存器状态;
- 将CC.EN设置为1;
- 等Controller将CSTS.RDY设置为‘1’;
- 根据需要使用Admin命令配置控制器;
- 根据需要创建 I/O Completion Queues和 I/O Submission Queues;
- 继续进行正常的I/O操作。
需要注意的是,除了Controller Reset以外,所有其它Controller Level Reset,都会导致控制器立即与主机失去通信。在所有这些情况下,控制器无法指示任何 Abort 或更新任何CQE。
3. Queue Level
Host可以通过Reset 和/或 重新配置I/O Submission 和I/O Completion Queue来进行Queue Level Reset。Queue Level Reset的操作是先删除Queue,然后重新创建它。在此过程中,主机应该等待所有对适当的I/O Submission Queue的pending命令完成。要执行Reset操作,主机向Admin Queue提交删除I/O提交队列或删除I/O完成队列的命令,指定要删除的Queue的标识符。在成功完成Queue删除操作后,主机然后通过提交Create I/O Submission Queue或Create I/O Completion Queue命令重新创建队列。作为创建操作的一部分,主机可以修改队列的属性。
Host应确保在Delete Queue之前,相应的I/O Submiss Queue或I/O Completion Queue处于空闲状态。提交Delete Queue的命令会导致控制器中任何正在运行的命令被Abort;这可能导致完成队列中出现一个或多个已取消CQE(Completion Queue Entry)。
请注意,如果对I/O Completion Queue执行Queue Level Reset,则应在Reset和重新创建I/O Completion Queue之前删除正在使用该队列的I/O Submission Queue。没有对应的I/O Completion Queue 的I/O Submission Queue的行为是未定义的。
这篇关于NVMe Reset的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!