4.8 Namespace List
图37定义了一个有序的Namespace IDs的列表,没有使用的字段为0。
图37:Namespace List Format
Bytes | Description |
3:0 | Identifier 0:这一字段包含了列表中最小的Namespace ID或者当列表为空时为0 |
7:4 | Identifier 1:这一字段包含了第二小的NS ID,或者当只有小于两个的Identify时,此字段为0 |
。。。 | 。。。 |
(N*4+3):(N*4) | Identifier N:这一字段包含了第N+1小的NSID,或者当只有小于N个Identify时,此字段为0 |
4.9 Controller List
图38定义了一个Controller列表,是按照升序顺序排列的Controller IDs列表,Controller ID在图11的78:79字节定义,未使用的部分为0。
图38:Controller List Format
Bytes | Description |
1:0 | Nember of Identifiers:这一字段包含了Controller的entries 列表。可以包含到2047个id |
3:2 | Identifier 0:这一字段包含了nvme系统中的第一个独一无二的 |
5::4 |
|
… | …. |
(n*2)`` | Identifier N: |
4.10 Fused Operaation
Fused操作使能了两条简单命令之间的混合操作,这个特性的可选的;图111的Identify Controller data struct决定了是否支持此特性。在一个Fused操作中,要求如下:
·命令应该按照原子单位的顺序执行。Controller应该表现的在两条命令之间没有其他命令运行。
·两条命令中的任何一条发生错误此操作都会终止,如果第一条命令发生错误,则第二条命令应当被Abort。如果第二条命令发生错误,那么第一条命令的完成状态是根据序列来的。
·两条命令使用的LBA Range应该是相同的。如果LBA Range不匹配,那么这个命令应当被Abort,Status应该是Invalid Field in Command。
·命令应该被插入到相同的SQ中,如果第一条命令在SQ的最后一条,那么第二条命令应该回到SQ的开始。
·如果Host想要Abort Fuse操作,那么Host应该为每一条命令都发送一个Abort。
·Controller应该回复命令的每一个CQ。
图10中的命令的Dword0决定了是否是一个fuse操作,是第一条还是第二条命令。
4.11 Command Arbitration
对于基于PCIe的NVMe来说,当SQ Tail Doorbell被Host写入一个Tail Pointer去告知一个新的SQ Entry被放入到SQ中时,一个命令应该被应用到Controller。
当一条命令访问修改Controller或者namespace状态时,表示这条命令正在被处理。
当一个命令相应的CQ Entry被发送到CQ时,代表这条命令被完成了。完成后,所有的被此条命令修改的Controller状态和Namespace状态对于所有随后的命令来说都是可见的。
接下来要处理的命令已经被传输到Controller中并且Controller已经做好处理的准备。Controller应该在每个SQ中选择要执行的命令。包含一个fused操作的命令应该被Controller一起处理。Controller可以按照任何顺序去选择处理候补命令,但是候补命令处理完成的顺序未必就是开始处理的顺序。
仲裁机制用来决定从哪一个SQ中获取一个要处理的候补命令。一旦使用仲裁选择了SQ,仲裁突发设置决定了Controller在下次仲裁发生前可以从该SQ开始处理的命令的最大数量。
Fused操作可能被Controller当做一条或者两条命令处理。
所有Controller都应该支持Round Robin仲裁机制。Controller可以实现带有紧急优先级的Weighted Round Robin仲裁机制或者厂商自定义的仲裁机制。Controller中的Controller Capabilities Register(CC.AMS)寄存器表明了Controller支持的仲裁机制。
为了更有效的利用non-volatile memory,controller经常并行处理来自一个SQ的多条命令。对于那些使用了带有紧急优先级的Weighted Round Robin或者Round Robin机制,Host可能会配置一个仲裁突发设置。仲裁突发设置表明了可以再同一时间内在一个特别的SQ中运行的命令数量。建议Host将仲裁突发机制配置的尽量贴合Controller的推荐值(在图111中的Identify Controller Data Struct中的Arbitration Burst位指定),考虑延时需求请参见5.21.1.1节。
4.11.1 Round Robin Arbitration
如果Controller实现了RR仲裁机制,包括ASQ在内的所有SQ都应该实现RR仲裁。在这种情况下,所有的SQ都被赋予相同的优先级。Controller可以根据仲裁突发设置在每个SQ中选择多个命令进行处理。
图39:Round Robin Arbitration
4.11.2 Weighted Round Robin with Urgent Priority Class Arbitration
在WRR仲裁机制中,有三个绝对优先级(Strict Priority)和三个WRR优先级。如果SQ-A有一个比SQ-B高的绝对优先级,那么在SQ-A所有的候补命令都应该比SQ-B中的候补命令早做处理。
绝对优先级最高的是Admin Class,包括了申请到Admin SQ的任何命令,这种的优先级代表了这个SQ的命令总是优先于其他SQ的命令被处理。
绝对优先级第二高的是Urgent Class。任何在应用WRR优先级之前,被应用此优先级的I/O SQ都将在Admin SQ申请完毕之后被申请。Host应该谨慎的将任何SQ分配为Urgent Class优先级,由于Urgent优先级的SQ和Not Urgent优先级的SQ之间没有公平的协议,所以这可能会导致正在WRR优先级的SQ遭到中断。
绝对优先级中最低的是WRR Class(加权循环优先级)。这种类型包含了三种加权轮询优先级(High,Medium,Low),他们使用加权轮询仲裁共享剩余的带宽。
Host通过Set Feature命令设置High,Medium,Low的加权权重。如果多个SQ的WRR等级相同,那么他们之间使用RR仲裁。每轮每个SQ中可能开始处理的候选命令的数量,可以由仲裁突发设置,也可以是剩余WRR积分,以较小的值为准。
图40:Weighted Round Robin with Urgent Priority Class Arbitration
4.11.3 Vendor Specific Arbitration
长商可以选择自己实现一种仲裁机制。
5 Admin Command Set
Admin Command Set说明了可以提交到Admin SQ中的命令。
Admin SQ Entry的通用的结构定义和字段在第4.2节中说明了。Admmin CQ Entry的通用结构和字段在第4.6节中说明。本节说明的是SQE和CQE中的特定于Admin命令的结构和字段(例如:SQE中的DW10-15和CQE中的DW0)。
对于所有的Admin命令,DW14和DW15只是I/O 命令用到了。
Admin命令不应该受到I/O队列状态的影响(例如:I/O CQ满了但是不应当对Delete IO SQ造成延迟或者停止)。
图41:Opcodes for Admin Commands
Opcode by field | Combined Opcede | O/M | Namespace Identifier Used | Command | |||||||||
(07) | (06:02) | (01:00) | |||||||||||
Geneic Command | Function | Data Transfer | |||||||||||
0b | 000 00b | 00b | 00h | M | No | Delete_IO_Submission_Queue | |||||||
0b | 000 00b | 01b | 01h | M | No | Create_IO_Submission_Queue | |||||||
0b | 000 00b | 10b | 02h | M | Yes | Get_Log_Page | |||||||
0b | 000 01b | 00b | 04h | M | No | Delete_IO_Completion_Queue | |||||||
0b | 000 01b | 01b | 05h | M | No | Create_IO_Completion_Queue | |||||||
0b | 000 01b | 10b | 06h | M | Yes | Identify | |||||||
0b | 000 10b | 00b | 08h | M | No | Abort | |||||||
0b | 000 10b | 01b | 09h | M | Yes | Set_Features | |||||||
0b | 000 10b | 10b | 0Ah | M | Yes | Get_Features | |||||||
0b | 000 11b | 00b | 0Ch | M | No | Asynchronous_Event_Request | |||||||
0b | 000 11b | 01b | 0Dh | O | Yes | Namespace Management | |||||||
0b | 001 00b | 00b | 10h | O | No | Firmware_Commit | |||||||
0b | 001 00b | 01b | 11h | O | No | Firmware_Image_Download | |||||||
0b | 001 01b | 00b | 14h | O | Yes | Device Self-test | |||||||
0b | 001 01b | 01b | 15h | O | Yes6 | Namespace Attachment | |||||||
0b | 001 10b | 00b | 18h | NOTE 5 | No | Keep Alive | |||||||
0b | 001 10b | 01b | 19h | O | Yes7 | Directive Send | |||||||
0b | 001 10b | 10b | 1Ah | O | Yes7 | Directive Receive | |||||||
0b | 001 11b | 00b | 1Ch | O | No | Virtualization Management | |||||||
0b | 001 11b | 01b | 1Dh | O | No | NVMe-MI Send | |||||||
0b | 001 11b | 10b | 1Eh | O | No | NVMe-MI Receive | |||||||
0b | 111 11b | 00b | 7Ch | O | No | Doorbell Buffer Config | |||||||
0b | 111 11b | 11b | 7Fh | O | Refer to the NVMe over Fabrics specification. | ||||||||
I/O Command Set Specific | |||||||||||||
1b | n/a | NOTE 4 | 80h – BFh | O | I/O Command Set specific | ||||||||
Vendor Specific | |||||||||||||
1b | na | NOTE 4 | C0h – FFh | O | Vendor specific | ||||||||
NOTES: 1. O/M 定义:O可选,M强制 2. Opcodes:没在此表中的Opcode应当是reserved的. 3. 一个命令的子集使用了Namespace Identify字段(CDW1.NSID)。如果使用了NSID字段,这一字段应该支持值FFFFFFFFh,除了脚注6所阐述的外。如果不使用此字段,则此字段应该被清0,参见图11。 4. Data Transfer代表了数据传输的方向。命令所有选项都应该按照指定方式传输数据,或者不传输数据。所有命令,包括厂商自定义命令,都应该按照以下约定:00b = 没有数据传输;01b = Host到Controller;10b = Controller到Host;11b = 双向传输。 5. 对于NVMe over PCIe来说,Keep Alive 命令时可选的。 6. 这些命令不支持Namespace Identify字段(CSW1.NSID),应该被设置为FFFFFFFFh。 7. Support for the Namespace Identifier field set to FFFFFFFFh is dependant on the Directive Operation (refer to section 9).
| |||||||||||||
图42定义了特定于NVM 命令集的Admin命令
图42:Opcodes for Admin Commands-NVM Command Set Specific
Opcode (07h) | Opcode (06:02) | Opcode (01:00) | Opcode | O/M | Namespace Identifier Used | Command |
Generic Command | Function | Data Transfer | ||||
1b | 000 00b | 00b | 80h | O | Yes | Format NVM |
1b | 000 00b | 01b | 81h | O | NOTE 5 | Security Send |
1b | 000 00b | 10b | 82h | O | NOTE 5 | Security Receive |
1b | 000 01b | 00b | 84h | O | No | Sanitize |
NOTES: 1. O/M definition: O = Optional, M = Mandatory. 2. Opcodes not listed are reserved. 3. A subset of commands uses the Namespace Identifier field (CDW1.NSID). If the Namespace Identifier field is used, then unless otherwise specified, the value FFFFFFFFh is supported in this field. When this field is not used, the field is cleared to 0h as described in Figure 11. 4. Indicates the data transfer direction of the command. All options to the command shall transfer data as specified or transfer no data. All commands, including vendor specific commands, shall follow this convention: 00b = no data transfer; 01b = host to controller; 10b = controller to host; 11b = bidirectional. 5. The use of the Namespace Identifier is Security Protocol specific.
|