NVMe系统内存结构 - 完成消息格式
本文属于《 NVMe协议基础系列教程》之一,欢迎查看其它文章。
命令需要被提交到Submission Queue中,以便NVMe控制器执行,在执行结束后,会有对应的完成状态,放入到Completion Queue中。
NVMe命令长度均为64Byte,对应的Completion消息长度均为16Byte。
1 完成消息定义
每条完成消息的大小为16字节,其数据结构,如下图所示:
- Dword 0的内容是特定于命令的。如果一个命令使用Dword 0,那么这个Dword的定义,包含在关联的命令定义中。如果命令不使用Dword 0,则保留该字段。
- Dword 1是保留的。
- Dword 2与Dword 3,都在下表中定义。将来定义的任何附加的l/O Command Set都可以使用另一种Completion Queue条目大小或格式。
Bit | Description |
---|---|
31:16 | SQ Identifier (SQID):表示当前完成消息,对应命令所在的Submission Queue的ID值。 当多个Submission Queue共享一个Completion Queue时,可以用SQID与Command Identifier (CID)唯一地确定已完成的命令,主机软件才需要使用此字段。除此以外,此字段保留。 |
15:00 | SQ Head Pointer (SQHD):表示SQID标识的Submission Queue的当前Head指针。 这用于向主机指示,已使用的Submission Queue条目,这些条目处于空闲,可重新用于新条目。 注意: 返回的值,是创建Completion Queue条目时,SQ Head pointer的值。在宿主软件消耗Completion Queue条目的时候,控制器可能有一个SQ Head pointer,它已经超出了所指示的值。 |
Bit | Description |
---|---|
31:17 | Status Field (SF):表示正在执行的命令的状态。 |
16 | Phase Tag ( P ):标识一个Completion Queue条目是否是新的。 在将CC.EN设置为“1”之前,主机软件应将所有Completion Queue条目的Phase Tag值初始化为“0”。当控制器在Completion Queue中放置一个条目时,它应该反转Phase Tag,使主机软件能够识别一个新条目。 1)具体来说,对于CC.EN设置为’ 1 ‘后的第一组Completion Queue条目,所有Phase Tag在发布时都设置为’ 1 '。 2)对于第二组Completion Queue条目,当控制器绕到Completion Queue顶部时,所有Phase Tag在发布时清除为“0”。 Phase Tag的值,在每次通过Completion Queue时被反转。 |
15:00 | Command Identifier (CID):表示正在执行的命令的标识符。 当命令提交到Submission Queue时,该标识符由主机软件分配。SQ标识符(SQID)和命令标识符(CID)的组合,可以唯一标识正在执行的命令。最大未完成请求数为64K。 |
2 Status Field定义
在完成消息的Dword 3中Status Field字段(31:17),其各个位域定义,如下表所示。
Bit | Description |
---|---|
31 | Do Not Retry (DNR):如果设置为’ 1 ',表示如果再次提交相同的命令,则预期会失败。 如果清除为“0”,表示重试相同的命令可能会成功。 如果一个命令由于时间限制的错误恢复而被放弃,这个字段应该被清除为“0”。 |
30 | More (M):如果设置为’ 1 ',则此命令的更多状态信息可以作为错误信息日志的一部分,可以使用Get Log Page命令检索。 如果清除为“0”,则此命令没有额外的状态信息。 |
29:28 | 保留 |
27:25 | Status Code Type (SCT):表示Completion Queue条目的状态码类型。这表示控制器返回的状态类型。 |
24:17 | Status Code (SC):表示一个状态码,用于标识所指示命令的任何错误或状态信息。 |
Status Field的值为0h,表示命令完成成功,没有致命或非致命错误条件。
2.1 Status Code Type (SCT)
SCT状态码类型,取值情况,如下表所示:
Value | Description |
---|---|
0h | Generic Command Status:表示本完成消息,所对应的命令已经完成。 这些状态值在所有命令类型中都是通用的,包括成功、不支持操作码和无效字段等条件。 |
1h | Command Specific Status:表示特定于特定命令opcode的状态值。这些值可能表明需要额外的处理。 此类型会报告状态值,如无效的固件映像或超过最大队列数。 |
2h | Media Errors:发生在NVM或数据完整性类型错误中的,任何媒体特定错误,都应属于这种类型。 |
3h ~ 6h | 保留 |
7h | 特定于供应商的 |
2.2 Status Code (SC)
完成消息中的状态码(SC),表示命令完成的更详细状态信息。
状态码的值,分为三个范围:
- 00h ~ 7Fh:适用于Admin Command Set,或跨多个命令集。
- 80h ~ BFh:I/O Command Set特定的状态码。
- C0h ~ FFh:供应商特定的状态码。
如果有多个状态码,适用于特定的命令故障,控制器应报告具有最小数值的状态码。
2.2.1 Generic Command Status类型
Generic Command Status类型的状态码,取值情况,如下所示。
这些状态值,在许多不同类型的命令中是通用的。
从上述,也可以看出,状态码分为了三个范围:00h ~ 7Fh,80h ~ BFh,C0h ~ FFh。
2.2.2 Command Specific Status类型
Command Specific Status类型的状态码,取值情况,如下所示。
2.2.3 Media Errors类型