控制器初始化过程
- 3.5控制器初始化
- 3.5.1基于内存传输的控制器初始化
- 3.5.2基于消息传输的控制器初始化
- 3.5.3Controller Ready Modes During Initialization
- 3.5.4初始化过程中的Controller Ready Timeouts
- 3.5.4.1Handling Errors During Initialization
3.5控制器初始化
本节介绍推荐的初始化控制器过程。
3.5.1基于内存传输的控制器初始化
完成相关 NVMe Transport binding 规范中定义的传输特定控制器初始化步骤后,主机应执行以下操作序列来初始化控制器以开始执行命令:
- 主机通过等待 CSTS.RDY 变为“0”来表示控制器先前的Reset已完成;
- 主机通过将 Admin Queue Attributes(AQA)、Admin Submission Queue Base Address(ASQ)和 Admin Completion Queue Base Address(ACQ)设置为适当的值来配置 Admin Queue;
- 主机通过检查CAP.CSS的状态和适当初始化CC.CSS来确定支持的 I/O Command Sets,如下:
a. 如果 CAP.CSS bit 7 设置为“1”,则 CC.CSS 字段应设置为 111b;
b.如果 CAP.CSS bit 6 设置为“1”,则 CC.CSS 字段应设置为 110b;
c.如果 CAP.CSS bit 6 被清为“0”并且bit 0 被设为“1”,则 CC.CSS 字段应设为 000b; - 应配置控制器设置。具体来说:
a.仲裁机制应在CC.AMS中选择;且
b.memory page size 应在CC.MPS中初始化; - 主机通过设置CC.EN为‘1’ enable 控制器;
- 主机等待控制器指示控制器已准备好处理命令。当 CSTS.RDY 设置为“1”时,控制器准备好处理命令;
- 主机通过发出指定Identify Controller data structure(即CNS 01h)的Identify命令来确定控制器的配置;
- 主机确定任何I/O Command Set 具体配置信息如下:
a.如果CC.CSS字段设置为000b,那么主机应该通过为每个命名空间发出Identify命令来确定每个命名空间的配置,指定Identify Namespace data structure(CNS 00h);
b.如果 CAP.CSS bit 6 设置为“1”,则主机执行以下操作:
i. 发出指定 Identify I/O Command Set data structure(CNS 1Ch) 的Identify命令;
ii.使用 I/O Command Set Profile Feature Identifier(FID 19h) 发出 Set Features 命令,指定要enable的 I/O Command Set Combination 的索引(参见Figure 289);
iii.对于每个enable的 I/O Command Set:
1.发出 Identify 命令,指定 I/O Command Set 特定的 Active Namespace ID list(CNS 07h) 以及该 I/O Command Set 的适当 Command Set Identifier(CSI) 值;
2.对于返回的每个 NSID:
a.如果enable的 I/O Command Set 是 NVM Command Set 或基于 NVM Command Set 的 I/O Command Set(例如,Zoned Namespace Command Set),则发出指定 Identify Namespace data structure 的 Identify 命令(CNS 00h );
b.发出指定以下每个数据结构的 Identify 命令(参见Figure 274): I/O Command Set specific Identify Namespace data structure、 I/O Command Set specific Identify Controller data structure 和I/O Command Set independent Identify Namespace data structure; - 如果控制器实现了 I/O 队列,那么主机应该使用带有 Number of Queues feature identifier 的 Set Features 命令确定支持的 I/O Submission Queues 和 I/O Completion Queues 的数量。在确定 I/O 队列的数量后,应配置 NVMe Transport 特定的中断寄存器(例如 MSI 和/或 MSI-X 寄存器);
- 如果控制器实现了I/O队列,那么主机应根据系统配置所需的数量和控制器支持的数量,分配合适数量的I/O Completion Queues。I/O Completion Queue是使用 Create I/O Completion Queue 命令分配的;
- 如果控制器实现了I/O队列,那么主机应该根据系统配置所需的数量和控制器支持的数量,分配合适数量的I/O Submission Queues。I/O Submission Queues 是使用 Create I/O Submission Queue 命令分配的;
- 要enable可选事件的异步通知,主机应发出 Set Features 命令,指定要enable的事件。要启用事件的异步通知,主机应提交适当数量的 Asynchronous Event Request 命令。此步骤可以在控制器发出控制器准备就绪信号(即 CSTS.RDY 设置为“1”)之后的任何时间点完成。
执行这些步骤后,控制器应准备好处理主机发出的 Admin 或 I/O 命令。
要退出 D3 power state,应遵循概述的初始化步骤。
3.5.2基于消息传输的控制器初始化
主机选择用于创建主机到控制器关联的 NVM 子系统。主机首先与 NVM 子系统建立 NVMe Transport 连接。接下来,主机与控制器建立连接,并使用 Fabrics Connect 命令创建 Admin Queue。最后,主机配置控制器并创建 I/O Queues。Figure 102 是描述 Admin Queue 或 I/O Queue 的队列创建过程的梯形图。
建立关联后的控制器初始化步骤如下所述。为了确定capabilities或配置寄存器,主机分别使用 Property Get 和 Property Set 命令。
- 如果需要,进行NVMe带内认证(参考8.13.2节);
- 主机决定控制器capabilities;
- 主机通过检查CAP.CSS的状态和适当的初始化CC.CSS来确定支持的I/O Command Sets 如下:
a.如果 CAP.CSS bit 7 设置为“1”,则 CC.CSS 字段应设置为 111b;
b.如果 CAP.CSS bit 6 设置为“1”,则 CC.CSS 字段应设置为 110b;
c.如果 CAP.CSS bit 6 被清除为“0”并且bit 0 被设置为“1”,则 CC.CSS 字段应设置为 000b; - 主机配置控制器设置。具体设置包括:
a.仲裁机制应在CC.AMS中选择;
b.memory page size 应在CC.MPS中初始化; - 通过将CC.EN设置为“1”来 enable 控制器;
- 主机应等待控制器指示控制器已准备好处理命令。当 CSTS.RDY 设置为“1”时,控制器准备好处理命令;
- 主机通过发出指定Identify Controller data structure(即CNS 01h)的Identify命令来确定控制器的配置;
- 主机确定I/O Command Set 具体配置信息如下:
a.如果CC.CSS字段设置为000b,那么主机应该通过为每个命名空间发出Identify命令来确定每个命名空间的配置,指定Identify Namespace data structure(CNS 00h);
b.如果 CAP.CSS 位 6 设置为“1”,则主机执行以下操作:
i.发出指定Identify I/O Command Set data structure(CNS 1Ch) 的identify命令;
ii.使用 I/O Command Set Profile Feature Identifier(FID 19h) 发出 Set Features 命令,指定要启用的 I/O Command Set Combination的索引(参见Figure 289);
iii.对于每个启用的 I/O Command Set:
1.发出Identify命令,指定 I/O Command Set specific Active Namespace ID list(CNS 07h) 以及该 I/O Command Set 的适当Command Set Identifier(CSI) 值;
2.对于返回的每个 NSID:
a.如果启用的 I/O Command Set 是 NVM Command Set 或基于 NVM Command Set 的 I/O Command Set(例如,Zoned Namespace Command Set),则发出指定Identify Namespace data structure的Identify命令(CNS 00h );
b.发出指定以下每个数据结构的Identify命令(参见Figure 274):I/O Command Set specific Identify Namespace data structure、 I/O Command Set specific Identify Controller data structure 和I/O Command Set independent Identify Namespace data structure; - 主机需要决定:
a.使用 CAP.MQES 决定最大 I/O Queue大小;和
b.使用来自Number of Queues feature identifier 的 Set Features 命令的响应支持I/O Submission Queues 和 I/O Completion Queues 的数量; - 主机应使用Connect命令(参考6.3节)创建 I/O Submission 和 Completion Queue对;
- 要启用可选事件的异步通知,主机应发出 Set Features 命令,指定要启用的事件。主机可以提交一个或多个 Asynchronous Event Request 命令以通知异步事件,如第 5.2 节所述。此步骤可以在控制器发出控制器准备就绪信号(即 CSTS.RDY 设置为“1”)之后的任何时间点完成。
如果在建立连接后 2 分钟内未完成第 4 步(将 CC.EN 设置为“1”),则可以删除连接。
3.5.3Controller Ready Modes During Initialization
有两种可能的控制器就绪模式:
-
Controller Ready With Media: 在控制器enable后(即 CC.EN 从“0”转为“1”)控制器准备就绪(即 CSTS.RDY 从“0”转为“1”时),然后 :
a) 控制器应能够正确处理所有命令,如第 3.5.4.1 节所述;
b) 连接到控制器的所有命名空间和处理Admin命令所需的所有介质都应准备好(即,不允许使用“Namespace Not Ready”状态码中止命令,并将“Do Not Retry”位清为“0”;或 Admin Command Media Not Ready,并将“Do Not Retry”位清0)。 -
Controller Ready Independent of Media: enable控制器后,连接到控制器的所有命名空间和处理Admin命令所需的介质可能会(也可能不会)在控制器准备好时准备好。任何指定连接到控制器的一个或多个命名空间的 NVM 命令都可以被中止,状态码为 Namespace Not Ready,并且 Do Not Retry 位被清为“0”,这个status code可以在控制器enable后的 CRTO.CRWMT 时间内(含)返回。
允许需要访问介质的 Admin 命令被中止,状态码为 Admin Command Media Not Ready 且 Do Not Retry 位被清为“0”,仅在控制器enable后的 CRTO.CRWMT 时间内(含)可以返回这个status code。请参阅Figure 103 以获取允许中止且status code为 Admin Command Media Not Ready 的 Admin 命令列表。
控制器应能够按照第 3.5.4.1 节所述无错误处理:
a)控制器准备就绪时未在Figure 103 中列出的所有Admin命令;
b)在控制器enable后的直至并包括 CRTO.CRWMT 时间内,处理Figure 103 中列出的所有Admin命令;
c)在控制器enable后,在直至并包括 CRTO.CRWMT 时间内,处理所有 NVM 命令。
Controller Ready Modes Supported(CAP.CRMS) 字段(参见Figure 36)指示支持哪些控制器就绪模式。CAP.CRMS 字段由两个位组成:
- the Controller Ready With Media Support (CAP.CRMS.CRWMS) bit; 和
- the Controller Ready Independent of Media Support (CAP.CRMS.CRIMS) bit.
控制器需要将 CAP.CRMS.CRWMS 位设为“1”(即将 CAP.CRMS 字段设为 01b 或 11b)。CAP.CRMS.CRWMS 位没有在 NVM Express Base Specification revision 1.4及更早版本中定义。符合 NVM Express Base Specification revision 1.4及更早版本的控制器可以将 CAP.CRMS.CRWMS 字段清为 00b。
Controller Ready Independent of Media Enable(CC.CRIME) 位(参见Figure 46)根据 CAP.CRMS 字段的值控制控制器就绪模式,如下所示:
a)如果 CAP.CRMS 字段被清为 00b,则无法选择控制器就绪模式。在这种情况下,只读的 CC.CRIME 位应清为“0”,并且应被主机软件忽略;b)如果 CAP.CRMS 字段设为 01b(即 CAP.CRMS.CRIMS 位被清为“0”并且 CAP.CRMS.CRWMS 位被设为“1”),则控制器处于 Controller Ready With Media 模式,并且只读 CC.CRIME 位应清为“0”;c)如果 CAP.CRMS 字段设为 11b,则支持两种控制器就绪模式,主机可以通过修改 CC.CRIME 位的值来选择控制器就绪模式。在这种情况下,主机应在控制器enable之前通过写入 CC.CRIME 位来设置控制器就绪模式(例如,作为第 3.5 节中描述的操作初始化序列的一部分)。
3.5.4初始化过程中的Controller Ready Timeouts
CAP.CRMS 字段没有在 NVM Express Base Specification revision 1.4 及更早版本中定义。符合 NVM Express Base Specification revision 1.4 及更早版本的控制器可以将 CAP.CRMS 字段清为 00b。本节适用于将 CAP.CRMS 字段清除为 00b 的控制器和将 CAP.CRMS 设置为非0值的控制器。
共有三个controller ready timeout字段:
- CAP.TO (参考 Figure 36);
- CRTO.CRWMT (参考 Figure 62);
- CRTO.CRIMT (参考 Figure 62).
控制器初始化期间有关这些timeouts的详细信息如下:
a)CAP.TO 字段应按Figure 36 所述设置。
b)如果 CAP.CRMS 字段被清为 00b’,则:
i.Controller Ready Independent of Media Timeout(CRTO.CRIMT) 字段是reserved;
ii.Controller Ready With Media Timeout (CRTO.CRWMT) 字段是reserved;和
iii.控制器enable后主机应等待的最坏情况时间(即 CC.EN 从“0”转换为“1”)以使控制器准备就绪(CSTS.RDY 从“0”转换为“1” ') 由 CAP.TO 指示。
c)如果控制器处于 Controller Ready With Media 模式(即 CC.CRIME 位清0),则:
i.Controller Ready Independent of Media Timeout(CRTO.CRIMT) 字段不适用;
ii.Controller Ready With Media Timeout(CRTO.CRWMT) 指示在控制器enable后主机应等待的最坏情况时间可以:
1. 控制器准备好并能够正确处理所有命令,如第 3.5.4.1 节所述;且2.处理 Admin 命令所需的所有attach上命名空间和介质准备就绪。
d)如果控制器处于 Controller Ready Independent of Media 模式(即 CC.CRIME 位设为“1”),则
i.Controller Ready With Media Timeout(CRTO.CRWMT) 字段表示主机软件应等待所有attach上的命名空间和介质在控制器enable后准备好处理Admin命令所需的最坏情况时间;
ii.Controller Ready Independent of Media Timeout(CRTO.CRIMT) 字段指示在控制器enable后主机应等待的最坏情况时间,以使控制器就绪并能够处理:
1. 所有不需要访问attach了的命名空间的命令2. 不需要访问介质的Admin 命令
没有错误,如第 3.5.4.1 节所述。
CC.CRIME 位值的更改对 CRTO.CRWMT 和 CRTO.CRIMT 字段的值没有影响。更改 CC.CRIME 位的值可能会影响 CAP.TO 字段的值(参见Figure 36)。
3.5.4.1Handling Errors During Initialization
如果 CAP.CRMS 字段不为0,并且控制器已通过将 CC.EN 从“0”转换为“1”来enable,并且控制器遇到故障,阻止以下情况可以发生:
a)至少一个命令能够被正确处理;
b)至少一个attach到控制器的命名空间在控制器enable后的至多 CRTO.CRWMT 时间内准备就绪;或
c)至少一个Admin命令所需的介质在控制器enable后的至多 CRTO.CRWMT 时间内准备就绪
那么:
a)如果控制器尚未准备好,则控制器应在控制器enable后的最多 CRTO.CRWMT 时间内准备好(即,将 CSTS.RDY 设置为“1”);且
b)如果支持 Persistent Event Log,则控制器应记录 NVM Subsystem Hardware Error Event,其中 NVM Subsystem Hardware Error Event 代码设置为Persistent Event Log中的Controller Ready Timeout Exceeded(参见 Figure 233)。