nvme1.3 学习笔记 5 Admin Command Set-1

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.

 

5.1 Abort Command

Abort命令用于终止之前提交到ASQ或者I/O SQ的特定的命令。Abort命令是一种Best Effort命令;被终止的命令可能已经完成了,也可能当前正在运行或者还处在SQ的深处。

若要终止大量命令(例如:最大终止数量超过了ACL字段限制),Host应该遵循第7.3.3节描述的流程,去删除I/O SQ并重新创建I/O SQ。

Abort命令使用了命令中的DW10字段,其他的特殊字段被保留。

当前运行的Abort命令数量由Identify Controller 数据结构中的ACL字段限制。Host不应当允许超出ALC字段数量的Abort命令运行。Controller如果收到了超出的Abort命令应该回复Abort Command Limit Exceeded状态。

图43:Abort-Command Dword 10

Bit

Description

31:16

Command Identifier (CID): 这一位代表了被终止命令的ID,是在命令中的CDW0.CID中的值。

15:00

Submission Queue Identifier (SQID): 这一位代表被终止的命令来自哪一个SQ。

5.1.1 Command Completion

根据Abort命令的执行状态,Controller发送一个代表了Abort命令完成状态和被Abort的命令是否被终止成功的CQ Entry到Admin CQ中。CQ Entry中的DW0代表了被终止的命令是否被终止成功。

如果一个命令被成功终止,那么这个命令的CQ Entry应该被发送到相应的Admin CQ或者I/O CQ中,他的状态应该是Command Abort Requested,而且这个命令的CQ Entry应该在Abort命令发送CQ Enry之前发送,Abort命令的CQ Entry中的DW0的Bit0应该被清0。

如果一个命令由于任何原因没有被终止成功,那么Abort命令的CQ Entry中的DW0的Bit1应该被置1.

Abort命令的相关的状态码在图44中。

图44:Abort-Command Secific Status Values

Value

Description

3h

Abort Command Limit Exceeded: Abort命令的数量超出了ALC字段的限定。

5.2 Asynchronous Event Request Command

Asynchronous Event用来在某些事件发生时,通知Host关于状态,错误,健康信息等。

Host需要向Controller发送一个或者多个Asynchronous Event Request命令来使能Controller报告异步事件。

Controller给Host发送一个事件来完成某个Asynchronous Event Request命令。Host不要求Controller立即报告完成Asynchronous Event Request命令;这个命令在Controller内有事件发生时被报告完成。

Asynchronous Event Request命令由Host提交,去使能Controller报告一个异步事件。这个命令没有超时时间。当有异步事件需要报告给Host时,Controller产生一个CQ Entry发送到Host的CQ。如果当Controller重启时还有未回复的Asynchronous Event Request命令,那么这个命令被终止了。

Asynchronous Event Request命令中所有特殊字段都被保留了。

Host可能会发送多个Asynchronous Event Request命令来减少报告延迟。Asynchronous Event Request命令总数由图111中的,Identify Controller的AERL字段限制。

异步事件被分为几种事件类型。事件类型的信息在Asynchronous Event Request的CQ Entry中的DW0里面。

当Controller为一个未完成的Asynchronous Event Request命令发送一个CQ Entry去报告一个异步事件时,Controller将自动屏蔽该事件类型的后续事件,直到主机清除该事件为止。

使用Get Log Page命令去清楚一个相应的异步事件(参见5.14节)。

异步事件有以下几种类型:

·Error Event:代表了一个与特定命令无关的普通的命令。Host使用将Retain Astnchronous Event位清0的Get Log Page命令读取Error Information Log(参见5.14.1.1),去清楚这个异步事件。

·SMART/Health Status Event:代表了一个SMART或者健康状态事件。Host使用将Retain Astnchronous Event位清0的Get Log Page命令读取SMART/Health Information Log(参见5.14.1.1),去清楚这个异步事件。SMART/Health 触发异步事件的条件通过使用Set Feature命令里面的Asynchronous Event Configuration特性来配置(参见5.21节)。

·I/O Command Set Event:由I/O命令集定义的事件。

        o NVM Command Set Events:

                  ·Reservation Log Page Avaliable Event:代表了有一个或者更多的Reservation Notification Log Page(参见5.14.1.9.1)可以获取。Host使用将Retain Astnchronous Event位清0的Get Log Page命令读取Reservation Log Page (参见5.14.1.1),去清楚这个异步事件。

                  ·Sanitize Operation Completed Event:代表了一个sanitize操作被完成了,而且在Sanitize Status Log page(参见5.14.1.9.2)里面的Status是可获得的。Host使用将Retain Astnchronous Event位清0的Get Log Page命令读取Sanitize Status Log Page (参见5.14.1.1),去清楚这个异步事件。

·Vendor Specific Event:代表了厂商自定义的事件,清除方式同上。

异步事件被报告可以是因为一个新的条目被增加到了一个Log Page里面(例如:Error Information Log)或者是一个状态更新了(例如:SMART/Health中的状态)。一个状态改变可能是持续现象(例如:媒体变成只读的了),也可能是短暂现象(例如:温度在一段时间内超出了阈值)。

在发出一个新的Asynchronous Event Request命令之前,Host应该为短暂的或者持续的事件改变事件阈值或者屏蔽掉事件,避免重复报告这个异步事件。

如果Controller需要报告一个异步事件但是却没有一个未回复的Asynchronous Event Request命令,当一个Asynchronous Event Request被接收到时,Controller应该当发送一个单独的关于Asynchronous Event Type的Notification。如果在接收到Asynchronous Event Request命令之前,这个事件被Get Log Page清除掉了或者有进行下电操作,那么这个Notification将不会被发送。

5.2.1 Command Completion

有一个异步事件被报告给Host时,一个CQ Entry将会被发送到ACQ。与Asynchronous Event Request命令相关联的特定的状态值在图45中被定义。

图45:Status Code-Command Specific Status Values

Value

Description

5h

Asynchronous Event Request Limit Exceeded:未回复的Async命令的数量超出了限制。

CQ Entry的DW0字段包含了异步事件相关的信息。DW0字段的定义在图46中。

图46:Asynchronous Event Request-Completion Queue Entry DW0

Bit

Description

31:24

Reserved

23:16

Log Page Identifier: 代表了异步事件相关的Log Page,Host需要读取此Log Page来清除这个异步事件。

15:08

Asynchronous Event Information: 参见图47,48,49,50关于异步事件的细节信息。

07:03

Reserved

02:00

Asynchronous Event Type: 代表了异步事件的类型,更多类型内的信息参见Asynchronous Event Information。

Value

Definition

0h

Error Status

1h

SMART/Health Status

2h

Notice

3h-5h

Reserved

6h

I/O Command Set Specific Status

7h

Vendor Specific

 

取决于异步事件类型的不同,异步时间信息返回图47,48,49,50中的一种。

图47:Asynchronous Event Information-Error Status

Value

Description

0h

Write to Invalid Doorbell Register: Host写了没有被创建Queue的Doorbell寄存器。

1h

Invalid Doorbell Write Value: Host试图写入非法的Doorbell值,错误原因可能有以下几种:

• 这个值超出了Queue的基地址和大小的范围。

• 写入了一个和之前相同的Doorbell值。

• 写入Doorbell寄存器代表的增添的命令数量超出了Queue空闲的条目数量。

•  Host试图往一个满的Queue中添加一个条目。

•  Host试图在一个空的CQ中移除一个条目

 

2h

Diagnostic Failure: 一个故障诊断被触发.这可能包含一个自检操作。

3h

Persistent Internal Error: 发生了持续性错误,Controller无法将这种错误匹配到一个命令上。如果这种错误发生了,CSTS.CFS将被置1,Host应该执行一个重启操作,像7.3节描述的那样。

4h

Transient Internal Error: 一个能够特定于一组命令的短暂性错误发生了; Controller可在不重启的情况下继续运行。

5h

Firmware Image Load Error: 无法加载固件映像,Controller应该恢复到先前活动的固件映像或者只读的基准固件映像。

6h - FFh

Reserved

图48:Asynchronous Event Information-SMART/Health Status

Value

Description

0h

NVM subsystem Reliability: NVM子系统的可靠性被破坏.这可能由于严重的媒体错误,一个内部错误,媒体在只读模式下被写入,或者易失性内存备份失败造成的。

1h

Temperature Threshold: 温度超出了或者低于了阈值 (参见 5.21.1.4)。

2h

Spare Below Threshold: 可用空间低于了阈值。

3h - FFh

Reserved

图49:Asynchronous Event Information-Notice

Value

Description

0h

Namespace Attribute Changed: 一个或者多个的Identify Namespace data structure以及在发出CNS为2h的Namespace List命令的返回值发生改变。Host应该以此事件作为指示,读取Controller的每一个Namespace Data Struct信息,来确定什么发生了改变。

或者,Host可以请求Changed Namespace List(Log Identifier 为04h)来确定在上次读取这个Log Page之前到现在读取,有哪些Namespace Information被改变了。

当Namespace Utilization可用空间改变时,Controller不应该发送事件。因为这是一种频繁的操作,Host没必要请求这种事件。当Format Progress Indicator的Bit6:0字段从0变为了非0,或者由非0变为了0时,Controller才可以报告这种事件。

 

1 h

Firmware Activation Starting: Controller开始固件激活处理,在此期间暂停命令处理。Host可能使用CSTS.PP寄存器来确定什么时候再次开启命令处理。Host通过获取 Firmware Slot Information log page来清除此事件。

2h

Telemetry Log Changed: The controller has saved the controller internal state in the Telemetry Controller-Initiated log page and set the Telemetry Controller-Initiated Data Available field to 1h in that log page. To clear this event, the host issues a Get Log Page with Retain Asynchronous Event cleared to ‘0’ for the Telemetry Controller-Initiated Log.

3h – FFh

Reserved

图50:Asynchronous Event information-NVM Command Set Specific Status

Value

Description

0h

Reservation Log Page Available: Indicates that one or more Reservation Notification log pages (refer to section 5.14.1.9.1) have been added to the Reservation Notification log.

1h

Sanitize Operation Completed: Indicates that a sanitize operation has completed and status is available in the Sanitize Status log page (refer to section 5.14.1.9.2).

2h - FFh

Reserved

5.3 Create I/O Completion Queue Command

Create I/O Completion Queue命令被用来创建所有的除去Admin Completion Queue之外的I/O Completion Queues。Admin Completion Queue通过配置位于ACQ寄存器中的基地址来创建。如果使用了一个PRP List来描述CQ,那么这个PRP List应该被Host维护在Host的相同的物理内存地址上,这个PRP List中的值不应该被修改,直到相应的删除I/O CQ命令被成功完成或者Controller重启操作。如果PRP List的值被修改了,那么这种行为是未定义的。

Create I/O Completion Queue命令使用了PRP Entry1,DW10,和DW11字段。命令中所有的其

他字段都被保留。

图51:Create I/O Completion Queue-PRP Entry1

Bit

Description

63:00

PRP Entry 1 (PRP1): 如果CDW11.PC字段被设置为1,那么本字段代表了Completion Queue在连续的物理内存而且物理内存基于内存页对齐(基于CC.MPS的值对齐)的64位的物理地址 。如果CDW11.PC被清为0,那么本字段代表了 Completion Queue在连续的物理内存而且物理内存基于内存页对齐(基于CC.MPS的值对齐)的64位的PRP List的物理地址. 在这两种情况下,该PRP Entry都应该偏移为0.在一个非连续的Completion Queue中,每一个PRP List中的PRP Entry的偏移都应该为0. 如果有一个PRP Entry偏移不是0,那么Controller应该回复一个PRP Offset Invalid的CQ。

图52:Create I/O Completion Queue-Command DW10

Bit

Description

31:16

Queue Size (QSIZE): 这一字段代表了被创建的CQ的大小。如果这个值是0h或者超出了Controller支持的大小,Controller应该回复一个Invalid Queue Size的CQ。参见 4.1.3节 。这是一个基于0的值。

15:00

Queue Identifier (QID):这一字段代表了分配给被创建的CQ的Identify 。这个Identify对应了被创建CQ所使用的CQ Head Doorbell(参见3.1.17节).。这个值不应该大于Number of Queue Feature中报告的值(参见5.21.1.7节)。如果这个值为0或者超出了Number of Queue报告的值或者已经被使用的值,Conroller应该回复一个Invalid Queue Identify的CQ。

图53:Create I/O Completion Queue-Command DW11

Bit

Description

31:16

Interrupt Vector (IV): 这一字段代表了这个Completion Queue所使用的中断向量。这一字段对应于MSI-X或者multiple message MSI向量。如果使用了signle message MSI或者Pin-based中断,那么这一字段应该被清0.

在MSI-X中最多有2K个向量被使用(参见MSICAP.MC.MME或者MSICAP.MXC.TS)。如果这个值超出了Controller支持的messages的数量,那么Controller应该回复一个Invalid Interrupt Vector的错误。

15:02

Reserved

01

Interrupts Enabled (IEN):如果这一位设置为1,那么本Completion Queue的中断是被使能了。如果清0则为非使能。

00

Physically Contiguous (PC): 如果这一位设置为1,那么Completion Queue是一个物理空间连续的Queue,而且PRP Entry1内存放的是连续物理空间的起始地址。如果被清为0,那么Completion不是一个连续的物理空间并且PRP Entry1里面存放的是PRP List的地址。

如果队列位于Controller 内存空间,而且这一位被清0了,那么Controller应该返回一个Invalid Use of Controller Memory Buffer Status的错误。

5.3.1 Command Completion

如果这个命令完成了,那么Controller应该发送一个CQ Entry到ACQ中,代表了这个命令的完成状态。

Create I/O Completion Queue命令的完成状态在图54中定义。

图54:Create I/O Completion Queue-Command Specific Status Values

Value

Description

1h

Invalid Queue Identifier: 所创建的CQ Identify是非法的,可能这个CQID是一个Admin Queue的ID或者超出了Controller支持的范围或者已经被存在的Queue所使用了。

2h

Invalid Queue Size: Host试图去创建一个有着不正确的条目的I/O Completion Queue(例如:该值为0或者超出了Controller所支持的最大数量,详细定义参见CAP.MQES寄存器)。

8h

Invalid Interrupt Vector: Create I/O Completion Queue由于使用了非法的中断向量。

5.4 Create I/O Submission Queue Command

Create I/O Submission Queue被用来创建一个I/O SQ。ASQ通过ASQ寄存器来创建。

如果使用了PRP List来描述这个SQ,那么PRP List应该被Host保留在Host的物理内存上,而且PRP List的值不应该被修改,直到相应的SQ的Create I/O SQ命令被成功完成或者Controller进行了一次重启操作。如果PRP List的值被修改了,那么这种行为是未被定义的。

Create I/O Submission Queue命令使用了PRP Entry1,DW10,和DW11字段。所有其他的命令字段都被保留。

图55:Create I/O Submission Queue-PRP entry1

Bit

Description

63:00

PRP Entry 1 (PRP1): 如果DW11.PC位被设置为1,那么这个字段代表了一个物理内存连续且按照内存页(CC.MSP)对齐的64位的Submission Queue的基地址。

如果DW11.PC被清为0了,那么这个字段代表了一个物理内存连续且按照内存页(CC.MSP)对齐的64位PRP List指针,这个PRP List内的指针构成了Submission Queue。

在这两种情况下,PRP Entry1的偏移都应该为0。

在非连续的物理空间下,PRP List中的每一个PRP Entry的偏移都应该为0。

如果偏移不为0,那么Controller应该返回一个PRP Offset Invalid的CQ。

图56:Create I/O Submission Queue-DW10

Bit

Description

31:16

Queue Size (QSIZE): 这一位代表了被创建的Submission Queue的大小。如果这个大小为0或者超出了Controller的支持,那么Controller应该返回一个Invalid Queue Size的CQ。参见4.1.3节。这一字段的基础值是0。

15:00

Queue Identifier (QID):这一位代表了被分配到的要创建Submission Queue的Identify。这个ID代表了被用到这个SQ上的SQ Tail Doobell(参见3.1.16节)。这个值不应该比在Number of Queue特性中表明的I/O Submission Queue的值大。如果这个值为0或者超出了Number of Queue报告的值或者已经被使用的值,Conroller应该回复一个Invalid Queue Identify的CQ。

图57:Ceate I/O Submission Queue-DW11

Bit

Description

31:16

Completion Queue Identifier (CQID):这一部分代表了一个I/O Completion Queue的ID,这个ID是与本SQ关联的Completion命令所使用的那个Queue的ID。

这个值如果出现以下几种情况:

a) 是0h(例如ACQ的ID),那么Controller应该返回一个Invalid Queue Identidier的CQ。

b) 超出了Controller所支持的范围,那么Controller应该返回一个Invalid Queue ID的CQ。

c) 在Controller支持的范围内,但是还没有此ID的Completion Queue被创建出来,那么Controller应该回复一个Completion Queue Invalid的CQ。

15:03

Reserved

02:01

Queue Priority (QPRIO): 这一字段代表了使用本Submission Queue中的命令的优先级。这一字段仅仅在带有Urgent优先级的WRR仲裁机制被使用的时候才有效,如果没有使用此仲裁机制,那么这一位应该被忽略。参见4.11节。

Value

Definition

00b

Urgent

01b

High

10b

Medium

11b

Low

 

00

Physically Contiguous (PC): 如果这一位被设置为1,那么Submission Queue是一个物理连续的空间,而且PRP entry1是这块连续空间的基地址。如果清为了0,那么Submission Queue不是一个物理连续的空间,PRP Entry1是一个PRP List指针。。如果这一位被清0了而且CAP.CQR被设置为了1,那么控制器应该返回一个Invalid Field inCommand的CQ。

如果这个Queue位于Controller内存空间上而且PC被清0了,那么Controller应该返回Invalid Use of Controller Memory Buffer的CQ。

 

5.4.1 Command Completion

完成Create I/O submission Queue命令之后,Controller应该发送一个CQ Entry到ACQ队列中。

图58:Create I/O Submission Queue-Command Specific Status Values

Value

Description

0h

Completion Queue Invalid: 命令中的CQID字段相应的CQ还未被创建。

1h

Invalid Queue Identifier: 命令中的QID字段非法。此ID可能代表了一个ASQ(0h),或者超出Controller的支持范围,或者此ID已经被使用了。

2h

Invalid Queue Size: Host试图去创建一个非法的条目数量。比如Queue Size为0或者超出了Controller支持的最大值(CAP.MQES)。

5.5 Delete I/O Completion Queue Command

Delete I/O CQ命令被用来删除一个I/O CQ。这个命令使用了DW10字段。所有其他的命令字段都被保留了。这个命令完成之后,用来描述CQ的PRP List可以被Host释放掉。

Host应该确认在删除CQ之前与之相关联的任何SQ都被删除了。如果有任何一个SQ还未被删除,那么此条命令应该回复一个Invalid Queue Deletion的错误。

注意:无法删除ACQ。

图59:Delete I/O Completion Queue-Command DW10

Bit

Description

31:16

Reserved

15:00

Queue Identifier (QID): 这一字段代表了要删除队列的QID,这个值不应该是0h(ACQ)。

5.5.1 Command Completion

完成Delete I/O CQ命令之后,Controller应该发送一个CQ Entry到ACQ中。Delete I/O CQ命令的状态在图60中被定义。

图60:Delete I/O Completion Queue-Command Specific Status Values

Value

Description

1h

Invalid Queue Identifier: 要删除的QID是非法的,如果此ID为0h(ACQ ID),那么也会报告这种错误。

0Ch

Invalid Queue Deletion:这个错误代表了一个不合法的删除操作。可能是由于相应的I/O SQ还未被删除成功。.

5.6 Delete I/O Submission Queue Command

Delete I/O SQ命令被用来删除一个I/O Submission Queue。这个,命令使用了DW10字段,所有的该命令的其它字段都被保留了。这个命令完成之后。和本SQ相关的PRP List应该被Host释放掉。

这个命令成功完成之后,之前被提交到的本SQ的命令都应该被显式的或者隐式的完成了。在Delete I/O SQ命令返回一个Completion Queue Entry之前,申请自这个Queue中的其他命令可能会被用以适当的完成状态(例如:Successful Completion,Command Aborted due to SQ Deletion)。

Delete I/O SQ命令成功完成后,对于被申请自本SQ的任何的I/O 命令,Controller不应该再返回一个完成状态。

Delete I/O SQ命令有一个成功的完成状态,代表了之前申请自本SQ的,而且Controller没有为其发送一个CQ Entry的命令都有一个隐式的Aborted due to SQ Delete完成状态。

注意:ASQ不可以被删除。

图61:Delete I/O Submission Queue-Command DW10

Bit

Description

31:16

Reserved

15:00

Queue Identifier (QID): 这一字段代表了要删除的SQ的QID,此值不能为0h(ASQ)

5.6.1 Command Completion

在申请自此SQ的所有命令都被完成或者都被Abort,SQ被删除之后,Controller应该能够发送一个CQ Entry到ACQ中。Delete I/O Submission Queue命令的状态值在图62中。

图62:Delete I/O Submission Queue-Command Specific Status Values

Value

Description

1h

Invalid Queue Identifier: 命令中的QID是不合法的,有可能是一个ASQ ID。

5.7 Doorbell Buffer Config Command

5.8 Device Self-test Command

Device Self-test命令用来开启一个self-test操作或者Abort一个设备正在进行的self-test操作(参见8.11)。Device self-test命令用来进行以下操作:

       a)开启一个short device self-test操作;

       b)开启一个extended device self-test操作;

       c)开启一个厂商自定义device self-test操作;

         d)Abort一个正在进行的device self-test操作。

Device self-test操作由Device self-test命令提交到的Controller执行。Namespace Identifier字段控制哪一个Namespace进行Device self-test操作。图66进行了说明。

图66:Device self-test Namespace Test Action。

Value

Description

00000000h

Device self-test不应该包含任何的namespace,只应当包含Controller上的self-test操作。

00000001h – FFFFFFFEh

Device self-test操作只应当包含本字段指定的namespace。如果本字段是一个非法的NSID,则应该回复Host一个 Invalid Namespace or Format的状态。如果这一字段代表了一个Invalid的NSID,则应该回复Host一个 Invalid Field in Command的状态。

FFFFFFFFh

代表了当Device self-test操作启动时,应该包含所有Controller上的Active的Namespace。

图67:Device Self-test – Command Dword 10

Bit

Description

31:04

Reserved

03:00

Self-test Code (STC): 这一字段指定了采取什么样的Device selt-test方式.

Value

Defi

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.

 

5.1 Abort Command

Abort命令用于终止之前提交到ASQ或者I/O SQ的特定的命令。Abort命令是一种Best Effort命令;被终止的命令可能已经完成了,也可能当前正在运行或者还处在SQ的深处。

若要终止大量命令(例如:最大终止数量超过了ACL字段限制),Host应该遵循第7.3.3节描述的流程,去删除I/O SQ并重新创建I/O SQ。

Abort命令使用了命令中的DW10字段,其他的特殊字段被保留。

当前运行的Abort命令数量由Identify Controller 数据结构中的ACL字段限制。Host不应当允许超出ALC字段数量的Abort命令运行。Controller如果收到了超出的Abort命令应该回复Abort Command Limit Exceeded状态。

图43:Abort-Command Dword 10

Bit

Description

31:16

Command Identifier (CID): 这一位代表了被终止命令的ID,是在命令中的CDW0.CID中的值。

15:00

Submission Queue Identifier (SQID): 这一位代表被终止的命令来自哪一个SQ。

5.1.1 Command Completion

根据Abort命令的执行状态,Controller发送一个代表了Abort命令完成状态和被Abort的命令是否被终止成功的CQ Entry到Admin CQ中。CQ Entry中的DW0代表了被终止的命令是否被终止成功。

如果一个命令被成功终止,那么这个命令的CQ Entry应该被发送到相应的Admin CQ或者I/O CQ中,他的状态应该是Command Abort Requested,而且这个命令的CQ Entry应该在Abort命令发送CQ Enry之前发送,Abort命令的CQ Entry中的DW0的Bit0应该被清0。

如果一个命令由于任何原因没有被终止成功,那么Abort命令的CQ Entry中的DW0的Bit1应该被置1.

Abort命令的相关的状态码在图44中。

图44:Abort-Command Secific Status Values

Value

Description

3h

Abort Command Limit Exceeded: Abort命令的数量超出了ALC字段的限定。

5.2 Asynchronous Event Request Command

Asynchronous Event用来在某些事件发生时,通知Host关于状态,错误,健康信息等。

Host需要向Controller发送一个或者多个Asynchronous Event Request命令来使能Controller报告异步事件。

Controller给Host发送一个事件来完成某个Asynchronous Event Request命令。Host不要求Controller立即报告完成Asynchronous Event Request命令;这个命令在Controller内有事件发生时被报告完成。

Asynchronous Event Request命令由Host提交,去使能Controller报告一个异步事件。这个命令没有超时时间。当有异步事件需要报告给Host时,Controller产生一个CQ Entry发送到Host的CQ。如果当Controller重启时还有未回复的Asynchronous Event Request命令,那么这个命令被终止了。

Asynchronous Event Request命令中所有特殊字段都被保留了。

Host可能会发送多个Asynchronous Event Request命令来减少报告延迟。Asynchronous Event Request命令总数由图111中的,Identify Controller的AERL字段限制。

异步事件被分为几种事件类型。事件类型的信息在Asynchronous Event Request的CQ Entry中的DW0里面。

当Controller为一个未完成的Asynchronous Event Request命令发送一个CQ Entry去报告一个异步事件时,Controller将自动屏蔽该事件类型的后续事件,直到主机清除该事件为止。

使用Get Log Page命令去清楚一个相应的异步事件(参见5.14节)。

异步事件有以下几种类型:

·Error Event:代表了一个与特定命令无关的普通的命令。Host使用将Retain Astnchronous Event位清0的Get Log Page命令读取Error Information Log(参见5.14.1.1),去清楚这个异步事件。

·SMART/Health Status Event:代表了一个SMART或者健康状态事件。Host使用将Retain Astnchronous Event位清0的Get Log Page命令读取SMART/Health Information Log(参见5.14.1.1),去清楚这个异步事件。SMART/Health 触发异步事件的条件通过使用Set Feature命令里面的Asynchronous Event Configuration特性来配置(参见5.21节)。

·I/O Command Set Event:由I/O命令集定义的事件。

        o NVM Command Set Events:

                  ·Reservation Log Page Avaliable Event:代表了有一个或者更多的Reservation Notification Log Page(参见5.14.1.9.1)可以获取。Host使用将Retain Astnchronous Event位清0的Get Log Page命令读取Reservation Log Page (参见5.14.1.1),去清楚这个异步事件。

                  ·Sanitize Operation Completed Event:代表了一个sanitize操作被完成了,而且在Sanitize Status Log page(参见5.14.1.9.2)里面的Status是可获得的。Host使用将Retain Astnchronous Event位清0的Get Log Page命令读取Sanitize Status Log Page (参见5.14.1.1),去清楚这个异步事件。

·Vendor Specific Event:代表了厂商自定义的事件,清除方式同上。

异步事件被报告可以是因为一个新的条目被增加到了一个Log Page里面(例如:Error Information Log)或者是一个状态更新了(例如:SMART/Health中的状态)。一个状态改变可能是持续现象(例如:媒体变成只读的了),也可能是短暂现象(例如:温度在一段时间内超出了阈值)。

在发出一个新的Asynchronous Event Request命令之前,Host应该为短暂的或者持续的事件改变事件阈值或者屏蔽掉事件,避免重复报告这个异步事件。

如果Controller需要报告一个异步事件但是却没有一个未回复的Asynchronous Event Request命令,当一个Asynchronous Event Request被接收到时,Controller应该当发送一个单独的关于Asynchronous Event Type的Notification。如果在接收到Asynchronous Event Request命令之前,这个事件被Get Log Page清除掉了或者有进行下电操作,那么这个Notification将不会被发送。

5.2.1 Command Completion

有一个异步事件被报告给Host时,一个CQ Entry将会被发送到ACQ。与Asynchronous Event Request命令相关联的特定的状态值在图45中被定义。

图45:Status Code-Command Specific Status Values

Value

Description

5h

Asynchronous Event Request Limit Exceeded:未回复的Async命令的数量超出了限制。

CQ Entry的DW0字段包含了异步事件相关的信息。DW0字段的定义在图46中。

图46:Asynchronous Event Request-Completion Queue Entry DW0

Bit

Description

31:24

Reserved

23:16

Log Page Identifier: 代表了异步事件相关的Log Page,Host需要读取此Log Page来清除这个异步事件。

15:08

Asynchronous Event Information: 参见图47,48,49,50关于异步事件的细节信息。

07:03

Reserved

02:00

Asynchronous Event Type: 代表了异步事件的类型,更多类型内的信息参见Asynchronous Event Information。

Value

Definition

0h

Error Status

1h

SMART/Health Status

2h

Notice

3h-5h

Reserved

6h

I/O Command Set Specific Status

7h

Vendor Specific

 

取决于异步事件类型的不同,异步时间信息返回图47,48,49,50中的一种。

图47:Asynchronous Event Information-Error Status

Value

Description

0h

Write to Invalid Doorbell Register: Host写了没有被创建Queue的Doorbell寄存器。

1h

Invalid Doorbell Write Value: Host试图写入非法的Doorbell值,错误原因可能有以下几种:

• 这个值超出了Queue的基地址和大小的范围。

• 写入了一个和之前相同的Doorbell值。

• 写入Doorbell寄存器代表的增添的命令数量超出了Queue空闲的条目数量。

•  Host试图往一个满的Queue中添加一个条目。

•  Host试图在一个空的CQ中移除一个条目

 

2h

Diagnostic Failure: 一个故障诊断被触发.这可能包含一个自检操作。

3h

Persistent Internal Error: 发生了持续性错误,Controller无法将这种错误匹配到一个命令上。如果这种错误发生了,CSTS.CFS将被置1,Host应该执行一个重启操作,像7.3节描述的那样。

4h

Transient Internal Error: 一个能够特定于一组命令的短暂性错误发生了; Controller可在不重启的情况下继续运行。

5h

Firmware Image Load Error: 无法加载固件映像,Controller应该恢复到先前活动的固件映像或者只读的基准固件映像。

6h - FFh

Reserved

图48:Asynchronous Event Information-SMART/Health Status

Value

Description

0h

NVM subsystem Reliability: NVM子系统的可靠性被破坏.这可能由于严重的媒体错误,一个内部错误,媒体在只读模式下被写入,或者易失性内存备份失败造成的。

1h

Temperature Threshold: 温度超出了或者低于了阈值 (参见 5.21.1.4)。

2h

Spare Below Threshold: 可用空间低于了阈值。

3h - FFh

Reserved

图49:Asynchronous Event Information-Notice

Value

Description

0h

Namespace Attribute Changed: 一个或者多个的Identify Namespace data structure以及在发出CNS为2h的Namespace List命令的返回值发生改变。Host应该以此事件作为指示,读取Controller的每一个Namespace Data Struct信息,来确定什么发生了改变。

或者,Host可以请求Changed Namespace List(Log Identifier 为04h)来确定在上次读取这个Log Page之前到现在读取,有哪些Namespace Information被改变了。

当Namespace Utilization可用空间改变时,Controller不应该发送事件。因为这是一种频繁的操作,Host没必要请求这种事件。当Format Progress Indicator的Bit6:0字段从0变为了非0,或者由非0变为了0时,Controller才可以报告这种事件。

 

1 h

Firmware Activation Starting: Controller开始固件激活处理,在此期间暂停命令处理。Host可能使用CSTS.PP寄存器来确定什么时候再次开启命令处理。Host通过获取 Firmware Slot Information log page来清除此事件。

2h

Telemetry Log Changed: The controller has saved the controller internal state in the Telemetry Controller-Initiated log page and set the Telemetry Controller-Initiated Data Available field to 1h in that log page. To clear this event, the host issues a Get Log Page with Retain Asynchronous Event cleared to ‘0’ for the Telemetry Controller-Initiated Log.

3h – FFh

Reserved

图50:Asynchronous Event information-NVM Command Set Specific Status

Value

Description

0h

Reservation Log Page Available: Indicates that one or more Reservation Notification log pages (refer to section 5.14.1.9.1) have been added to the Reservation Notification log.

1h

Sanitize Operation Completed: Indicates that a sanitize operation has completed and status is available in the Sanitize Status log page (refer to section 5.14.1.9.2).

2h - FFh

Reserved

5.3 Create I/O Completion Queue Command

Create I/O Completion Queue命令被用来创建所有的除去Admin Completion Queue之外的I/O Completion Queues。Admin Completion Queue通过配置位于ACQ寄存器中的基地址来创建。如果使用了一个PRP List来描述CQ,那么这个PRP List应该被Host维护在Host的相同的物理内存地址上,这个PRP List中的值不应该被修改,直到相应的删除I/O CQ命令被成功完成或者Controller重启操作。如果PRP List的值被修改了,那么这种行为是未定义的。

Create I/O Completion Queue命令使用了PRP Entry1,DW10,和DW11字段。命令中所有的其

他字段都被保留。

图51:Create I/O Completion Queue-PRP Entry1

Bit

Description

63:00

PRP Entry 1 (PRP1): 如果CDW11.PC字段被设置为1,那么本字段代表了Completion Queue在连续的物理内存而且物理内存基于内存页对齐(基于CC.MPS的值对齐)的64位的物理地址 。如果CDW11.PC被清为0,那么本字段代表了 Completion Queue在连续的物理内存而且物理内存基于内存页对齐(基于CC.MPS的值对齐)的64位的PRP List的物理地址. 在这两种情况下,该PRP Entry都应该偏移为0.在一个非连续的Completion Queue中,每一个PRP List中的PRP Entry的偏移都应该为0. 如果有一个PRP Entry偏移不是0,那么Controller应该回复一个PRP Offset Invalid的CQ。

图52:Create I/O Completion Queue-Command DW10

Bit

Description

31:16

Queue Size (QSIZE): 这一字段代表了被创建的CQ的大小。如果这个值是0h或者超出了Controller支持的大小,Controller应该回复一个Invalid Queue Size的CQ。参见 4.1.3节 。这是一个基于0的值。

15:00

Queue Identifier (QID):这一字段代表了分配给被创建的CQ的Identify 。这个Identify对应了被创建CQ所使用的CQ Head Doorbell(参见3.1.17节).。这个值不应该大于Number of Queue Feature中报告的值(参见5.21.1.7节)。如果这个值为0或者超出了Number of Queue报告的值或者已经被使用的值,Conroller应该回复一个Invalid Queue Identify的CQ。

图53:Create I/O Completion Queue-Command DW11

Bit

Description

31:16

Interrupt Vector (IV): 这一字段代表了这个Completion Queue所使用的中断向量。这一字段对应于MSI-X或者multiple message MSI向量。如果使用了signle message MSI或者Pin-based中断,那么这一字段应该被清0.

在MSI-X中最多有2K个向量被使用(参见MSICAP.MC.MME或者MSICAP.MXC.TS)。如果这个值超出了Controller支持的messages的数量,那么Controller应该回复一个Invalid Interrupt Vector的错误。

15:02

Reserved

01

Interrupts Enabled (IEN):如果这一位设置为1,那么本Completion Queue的中断是被使能了。如果清0则为非使能。

00

Physically Contiguous (PC): 如果这一位设置为1,那么Completion Queue是一个物理空间连续的Queue,而且PRP Entry1内存放的是连续物理空间的起始地址。如果被清为0,那么Completion不是一个连续的物理空间并且PRP Entry1里面存放的是PRP List的地址。

如果队列位于Controller 内存空间,而且这一位被清0了,那么Controller应该返回一个Invalid Use of Controller Memory Buffer Status的错误。

5.3.1 Command Completion

如果这个命令完成了,那么Controller应该发送一个CQ Entry到ACQ中,代表了这个命令的完成状态。

Create I/O Completion Queue命令的完成状态在图54中定义。

图54:Create I/O Completion Queue-Command Specific Status Values

Value

Description

1h

Invalid Queue Identifier: 所创建的CQ Identify是非法的,可能这个CQID是一个Admin Queue的ID或者超出了Controller支持的范围或者已经被存在的Queue所使用了。

2h

Invalid Queue Size: Host试图去创建一个有着不正确的条目的I/O Completion Queue(例如:该值为0或者超出了Controller所支持的最大数量,详细定义参见CAP.MQES寄存器)。

8h

Invalid Interrupt Vector: Create I/O Completion Queue由于使用了非法的中断向量。

5.4 Create I/O Submission Queue Command

Create I/O Submission Queue被用来创建一个I/O SQ。ASQ通过ASQ寄存器来创建。

如果使用了PRP List来描述这个SQ,那么PRP List应该被Host保留在Host的物理内存上,而且PRP List的值不应该被修改,直到相应的SQ的Create I/O SQ命令被成功完成或者Controller进行了一次重启操作。如果PRP List的值被修改了,那么这种行为是未被定义的。

Create I/O Submission Queue命令使用了PRP Entry1,DW10,和DW11字段。所有其他的命令字段都被保留。

图55:Create I/O Submission Queue-PRP entry1

Bit

Description

63:00

PRP Entry 1 (PRP1): 如果DW11.PC位被设置为1,那么这个字段代表了一个物理内存连续且按照内存页(CC.MSP)对齐的64位的Submission Queue的基地址。

如果DW11.PC被清为0了,那么这个字段代表了一个物理内存连续且按照内存页(CC.MSP)对齐的64位PRP List指针,这个PRP List内的指针构成了Submission Queue。

在这两种情况下,PRP Entry1的偏移都应该为0。

在非连续的物理空间下,PRP List中的每一个PRP Entry的偏移都应该为0。

如果偏移不为0,那么Controller应该返回一个PRP Offset Invalid的CQ。

图56:Create I/O Submission Queue-DW10

Bit

Description

31:16

Queue Size (QSIZE): 这一位代表了被创建的Submission Queue的大小。如果这个大小为0或者超出了Controller的支持,那么Controller应该返回一个Invalid Queue Size的CQ。参见4.1.3节。这一字段的基础值是0。

15:00

Queue Identifier (QID):这一位代表了被分配到的要创建Submission Queue的Identify。这个ID代表了被用到这个SQ上的SQ Tail Doobell(参见3.1.16节)。这个值不应该比在Number of Queue特性中表明的I/O Submission Queue的值大。如果这个值为0或者超出了Number of Queue报告的值或者已经被使用的值,Conroller应该回复一个Invalid Queue Identify的CQ。

图57:Ceate I/O Submission Queue-DW11

Bit

Description

31:16

Completion Queue Identifier (CQID):这一部分代表了一个I/O Completion Queue的ID,这个ID是与本SQ关联的Completion命令所使用的那个Queue的ID。

这个值如果出现以下几种情况:

a) 是0h(例如ACQ的ID),那么Controller应该返回一个Invalid Queue Identidier的CQ。

b) 超出了Controller所支持的范围,那么Controller应该返回一个Invalid Queue ID的CQ。

c) 在Controller支持的范围内,但是还没有此ID的Completion Queue被创建出来,那么Controller应该回复一个Completion Queue Invalid的CQ。

15:03

Reserved

02:01

Queue Priority (QPRIO): 这一字段代表了使用本Submission Queue中的命令的优先级。这一字段仅仅在带有Urgent优先级的WRR仲裁机制被使用的时候才有效,如果没有使用此仲裁机制,那么这一位应该被忽略。参见4.11节。

Value

Definition

00b

Urgent

01b

High

10b

Medium

11b

Low

 

00

Physically Contiguous (PC): 如果这一位被设置为1,那么Submission Queue是一个物理连续的空间,而且PRP entry1是这块连续空间的基地址。如果清为了0,那么Submission Queue不是一个物理连续的空间,PRP Entry1是一个PRP List指针。。如果这一位被清0了而且CAP.CQR被设置为了1,那么控制器应该返回一个Invalid Field inCommand的CQ。

如果这个Queue位于Controller内存空间上而且PC被清0了,那么Controller应该返回Invalid Use of Controller Memory Buffer的CQ。

 

5.4.1 Command Completion

完成Create I/O submission Queue命令之后,Controller应该发送一个CQ Entry到ACQ队列中。

图58:Create I/O Submission Queue-Command Specific Status Values

Value

Description

0h

Completion Queue Invalid: 命令中的CQID字段相应的CQ还未被创建。

1h

Invalid Queue Identifier: 命令中的QID字段非法。此ID可能代表了一个ASQ(0h),或者超出Controller的支持范围,或者此ID已经被使用了。

2h

Invalid Queue Size: Host试图去创建一个非法的条目数量。比如Queue Size为0或者超出了Controller支持的最大值(CAP.MQES)。

5.5 Delete I/O Completion Queue Command

Delete I/O CQ命令被用来删除一个I/O CQ。这个命令使用了DW10字段。所有其他的命令字段都被保留了。这个命令完成之后,用来描述CQ的PRP List可以被Host释放掉。

Host应该确认在删除CQ之前与之相关联的任何SQ都被删除了。如果有任何一个SQ还未被删除,那么此条命令应该回复一个Invalid Queue Deletion的错误。

注意:无法删除ACQ。

图59:Delete I/O Completion Queue-Command DW10

Bit

Description

31:16

Reserved

15:00

Queue Identifier (QID): 这一字段代表了要删除队列的QID,这个值不应该是0h(ACQ)。

5.5.1 Command Completion

完成Delete I/O CQ命令之后,Controller应该发送一个CQ Entry到ACQ中。Delete I/O CQ命令的状态在图60中被定义。

图60:Delete I/O Completion Queue-Command Specific Status Values

Value

Description

1h

Invalid Queue Identifier: 要删除的QID是非法的,如果此ID为0h(ACQ ID),那么也会报告这种错误。

0Ch

Invalid Queue Deletion:这个错误代表了一个不合法的删除操作。可能是由于相应的I/O SQ还未被删除成功。.

5.6 Delete I/O Submission Queue Command

Delete I/O SQ命令被用来删除一个I/O Submission Queue。这个,命令使用了DW10字段,所有的该命令的其它字段都被保留了。这个命令完成之后。和本SQ相关的PRP List应该被Host释放掉。

这个命令成功完成之后,之前被提交到的本SQ的命令都应该被显式的或者隐式的完成了。在Delete I/O SQ命令返回一个Completion Queue Entry之前,申请自这个Queue中的其他命令可能会被用以适当的完成状态(例如:Successful Completion,Command Aborted due to SQ Deletion)。

Delete I/O SQ命令成功完成后,对于被申请自本SQ的任何的I/O 命令,Controller不应该再返回一个完成状态。

Delete I/O SQ命令有一个成功的完成状态,代表了之前申请自本SQ的,而且Controller没有为其发送一个CQ Entry的命令都有一个隐式的Aborted due to SQ Delete完成状态。

注意:ASQ不可以被删除。

图61:Delete I/O Submission Queue-Command DW10

Bit

Description

31:16

Reserved

15:00

Queue Identifier (QID): 这一字段代表了要删除的SQ的QID,此值不能为0h(ASQ)

5.6.1 Command Completion

在申请自此SQ的所有命令都被完成或者都被Abort,SQ被删除之后,Controller应该能够发送一个CQ Entry到ACQ中。Delete I/O Submission Queue命令的状态值在图62中。

图62:Delete I/O Submission Queue-Command Specific Status Values

Value

Description

1h

Invalid Queue Identifier: 命令中的QID是不合法的,有可能是一个ASQ ID。

5.7 Doorbell Buffer Config Command

5.8 Device Self-test Command

Device Self-test命令用来开启一个self-test操作或者Abort一个设备正在进行的self-test操作(参见8.11)。Device self-test命令用来进行以下操作:

       a)开启一个short device self-test操作;

       b)开启一个extended device self-test操作;

       c)开启一个厂商自定义device self-test操作;

         d)Abort一个正在进行的device self-test操作。

Device self-test操作由Device self-test命令提交到的Controller执行。Namespace Identifier字段控制哪一个Namespace进行Device self-test操作。图66进行了说明。

图66:Device self-test Namespace Test Action。

Value

Description

00000000h

Device self-test不应该包含任何的namespace,只应当包含Controller上的self-test操作。

00000001h – FFFFFFFEh

Device self-test操作只应当包含本字段指定的namespace。如果本字段是一个非法的NSID,则应该回复Host一个 Invalid Namespace or Format的状态。如果这一字段代表了一个Invalid的NSID,则应该回复Host一个 Invalid Field in Command的状态。

FFFFFFFFh

代表了当Device self-test操作启动时,应该包含所有Controller上的Active的Namespace。

图67:Device Self-test – Command Dword 10

Bit

Description

31:04

Reserved

03:00

Self-test Code (STC): 这一字段指定了采取什么样的Device selt-test方式.

Value

Definition

0h

Reserved

1h

Start a Short Device self-test operation

2h

Start an externed device self-test opetarion

3h-Dh

Reserved

Eh

Vendor Specific

Fh

Abort device self-test operation

 

nition

0h

Reserved

1h

Start a Short Device self-test operation

2h

Start an externed device self-test opetarion

3h-Dh

Reserved

Eh

Vendor Specific

Fh

Abort device self-test operation

 

你可能感兴趣的:(PCIe,NVMe)