管理命令集之一
本文属于《 NVMe协议基础系列教程》之一,欢迎查看其它文章。
1 命令格式回顾
在前面的章节,我们介绍过,关于NVMe命令和完成消息,通用格式的定义。
- 命令
NVMe的命令(64Byte),按如下结构,进行组织:
其中,DW10 ~ DW15为特定于具体命令的字段,本章节会描述这些字段。
对于所有Admin命令,DW14和DW15是特定于I/O命令集的。
- 完成消息
NVMe的完成消息(16Byte),按如下结构,进行组织:
其中,DW0为特定于具体命令的字段,本章节也会描述该字段。
2 操作码定义
管理命令集(Admin Command Set),定义了可以提交到Admin Submission Queue的命令,这些命令以操作码(Opcode)的形式,进行编码,如下表所示:
注意:
- O/M定义:O = 可选,M = 强制
- 未列出的操作码被保留
在命令的“Dword 0”中Opcode字段(07:00),定义了8位的操作码,其值如上表所示,主要分为三个部分:
- 00 ~ 11h,命令主要负责I/O Queue与Firmware等管理工作。
- 80 ~ BFh,特定于I/O命令集。
- C0 ~ FFh,特定于供应商的。
接下来,陆续介绍,各个命令的字段组成,及其对应完成消息的字段组成。
3 Abort command
Abort command,用于中止之前提交到Admin Submission Queue或I/O Submission Queue的特定命令。
Abort command是尽力执行的命令;要中止的命令可能,已经完成、当前正在执行或正在深度队列中。当没有找到要中止的命令时,控制器选择完成该命令,它是特定于实现的。
主机软件可能有多个未完成的Abort command,受Identify Controller Data Structure中Abort Command Limit字段的约束。
Abort command使用Command Dword 10字段,所有其他字段都是保留的。
Bit | Description |
---|---|
31:16 | Command Identifier (CID):表示要中止的命令的命令标识符,也就是被终止命令的CDW0.CID字段值。 |
15:00 | Submission Queue Identifier (SQID):表示要中止的命令所在的Submission Queue标识符。 |
3.1 Command Completion
如果Admin命令已完成,则Completion Queue条目(完成消息),将被添加到Admin Completion Queue。
完成消息的Dword 0,表示命令是否被中止。
- 如果命令被成功中止,那么Dword 0的位0,清除为“0”。
- 如果命令没有被中止,那么Dword 0的位0,设置为“1”。
完成消息,可以具备“Command Specific Status”类型的状态码,状态码具体值,如下表所示:
Value | Description |
---|---|
3h | Abort Command Limit Exceeded:并发执行Abort命令的数量,超过了Identify Controller Data Structure中指定的限制。 |
4 Asynchronous Event Request command
异步事件(Asynchronous Event),用于在发生这些事件时,通知主机软件有关状态、错误和健康状况信息。为了使控制器能够异步上报事件,主机软件需要向控制器提交一个或多个Asynchronous Even Request命令。控制器通过完成Asynchronous Even Request命令,向主机指定一个事件。主机软件应该预料到,控制器可能不会立即执行命令;当有事件需要报告时,该命令应该被完成。
Asynchronous Even Request命令由主机软件提交,用于启用控制器异步事件上报。该命令没有超时时间。当有异步事件要报告给主机时,控制器为该命令,提交一个Completion Queue条目。当控制器复位时,如果Asynchronous Even Request命令未完成,则中止该命令。
Asynchronous Even Request命令,其DW10 ~ DW15无特定含义,均为保留。
主机软件可以提交多个Asynchronous Even Request命令,以减少事件报告的延迟。
同时执行的Asynchronous Even Request命令的总数,受Identify Controller Data Structure中指定的Asynchronous Event Request Limit限制。
异步事件,按事件类型分组。Asynchronous Even Request命令的完成消息的Dword 0中,显示了事件类型信息。当控制器为一个未完成的Asynchronous Even Request命令提交一个Completion Queue条目,从而报告一个异步事件时,该事件类型的后续事件,被控制器自动屏蔽,直到主机清除该事件。
通过Get Log Page命令读取与事件相关的日志页面,来清除该事件。
定义了下列事件类型:
- Error event:指示与特定命令无关的一般错误。为了清除此事件,主机软件使用Get Log Page命令读取错误信息日志。
- SMART / Health Status event:表示SMART或Health状态事件。要清除此事件,主机软件使用Get Log Page读取SMART/Health信息日志。触发异步事件的SMART / Health条件,可以使用Set Features命令在Asynchronous Even Configuration特性中配置。
- I/O Command Set events:I/O命令集定义的事件。
NVM Command Set Events:Reservation Log Page Available event,表示一个或多个Reservation Notification日志页面可用。为了清除此事件,主机软件使用Get Log Page命令读取Reservation Notification日志页面。 - Vendor Specific event:表示厂商特定事件。要清除此事件,主机软件使用Get Log Page命令读取指定供应商特定的日志页面。
当控制器需要报告一个事件,但没有未完成的Asynchronous Event Request命令时,控制器将事件排队到控制器内部,并在接收到Asynchronous Event Request命令时报告它。
4.1 Command Completion
如果有异步事件要报告给主机,则将Completion Queue条目发送到Admin Completion Queue。
Completion Queue条目,可以具备“Command Specific Status”类型的状态码,状态码具体值,如下表所示:
Value | Description |
---|---|
5h | Asynchronous Event Request Limit Exceeded:并发执行的异步事件请求命令的数量,已经超过限制。 |
Completion Queue条目的Dword 0,包含关于异步事件的信息。Dword 0定义,如下表所示:
Bit | Description |
---|---|
31:24 | 保留 |
23:16 | Associated Log Page:表示异步事件的日志页面。 该日志页需要被主机读取以清除事件。 |
15:08 | Asynchronous Event Information:有关异步事件的详细信息,请参见下表。 |
07:03 | 保留 |
02:00 | Asynchronous Event Type:表示异步事件的类型。 Asynchronous Event Information字段中,提供了有关该事件的更具体信息。 |
Error Status类型的异步事件信息(Asynchronous Event Information字段),取值情况,如下表所示:
SMART / Health Status类型的异步事件信息(Asynchronous Event Information字段),取值情况,如下表所示:
NVM(I/O) Command Set Specific Status类型的异步事件信息(Asynchronous Event Information字段),取值情况,如下表所示:
参考文档: