NVM Subsystem Reset 的范围取决于 NVM 子系统是否支持多个域。在不支持多个域的 NVM 子系统中,NVM Subsystem Reset 的范围是整个 NVM 子系统。
NVM Subsystem Reset 在以下情况下启动:
当 NVM Subsystem Reset 发生时,整个 NVM 子系统将被复位。这包括在构成 NVM 子系统的所有控制器上启动 Controller Level Reset,禁用与构成 NVM 子系统的所有控制器关联的 Persistent Memory Region,以及适用的 NVMe 传输规范中定义的任何传输特定操作。
NVM 子系统通电时发生的 NVM Subsystem Reset 由 NVM Subsystem Reset 后的 CSTS.NSSRO 字段的初始值报告。主机软件可以使用该字段来确定突然失去与控制器的通信是否是由于 NVM Subsystem Reset 或某些其他情况。
主机软件通过写入 NSSR.NSSRC 字段来启动 NVM Subsystem Reset 的能力是控制器的可选功能,由 CAP.NSSRS 字段的状态指示。通过不向构成 NVM 子系统的一个或多个控制器提供这种 capability,实现可以保护 NVM 子系统免受无意的 NVM Subsystem Reset。
导致 NVM Subsystem Reset 的供应商特定事件的发生旨在允许实现从严重的 NVM 子系统内部错误中恢复,该错误会阻止继续正常操作(例如,致命的硬件或固件错误)。
NVM Subsystem Reset 的范围取决于 NVM 子系统是否支持多个域。在支持多个域的 NVM 子系统中,NVM Subsystem Reset 的范围是域中的控制器或整个 NVM 子系统。
在以下情况下启动域上的 NVM Subsystem Reset:
当 NVM Subsystem Reset 发生时,整个域都会重置。这包括在域中的所有控制器上启动 Controller Level Reset,禁用与域中的所有控制器关联的 Persistent Memory Region,以及适用的 NVMe 传输规范中定义的任何传输特定操作。
或者,支持多个域的 NVM 子系统中的 NVM Subsystem Reset 可能会重置整个 NVM 子系统。 NVM Subsystem Reset 的发生由 NVM Subsystem Reset 后的 CSTS.NSSRO 字段的初始值报告。主机软件可以使用该字段来确定突然失去与控制器的通信是否是由于 NVM Subsystem Reset 或某些其他情况。
主机软件通过写入 NSSR.NSSRC 字段来启动 NVM Subsystem Reset 的能力是控制器的可选功能,由 CAP.NSSRS 字段的状态指示。实现可以通过不向域中的一个或多个控制器提供此功能来保护域免受无意的 NVM Subsystem Reset。
以下方法启动 Controller Level Reset:
Controller Level Reset 包括以下操作:
o对于使用基于消息的传输的控制器:
没有例外
在除 Controller Reset 之外的所有 Controller Level Reset 情况下,controller 寄存器将按照适用的 NVMe Transport binding 规范的定义进行重置。
要在 Controller Level Reset 后继续,主机应:
注意,除了 Controller Reset 之外的所有 Controller Level Reset 都会导致控制器立即失去与主机的通信。在这些情况下,控制器无法指示任何中止或更新任何完成队列条目。
主机可以通过重置 I/O Submission 和 I/O Completion Queues 来重置和/或重新配置它们。通过删除然后重新创建队列来执行 queue level reset。在这个过程中,主机应该等待所有对相应未处理的 Submission Queue(s) 的完成。
为了在使用基于内存的传输模型的控制器上执行 queue level reset,主机将 Delete I/O Submission Queue 或 Delete I/O Completion Queue 命令提交给 Admin Queue,指定要删除的队列的标识符。在队列删除命令操作成功完成后,主机通过提交 Create I/O Submission Queue 或 Create I/O Completion Queue 命令重新创建队列。作为创建操作的一部分,主机可以修改队列的属性。注意,如果对 I/O Completion Queue 执行 queue level reset,则应在 I/O Completion Queue 重置之前删除正在使用 I/O Completion Queue的 I/O Submission Queue,并在重建 I/O Completion Queue之后重新创建I/O Submission Queue。没有相应 I/O Completion Queue 的 I/O Submission Queue 的行为是未定义的。 要使用基于消息的传输模型在控制器上执行 queue level reset,主机将 Disconnect 命令发送到要删除的 I/O Queue。在 Disconnect 命令成功完成命令后,主机通过提交 QID 不是 00h 的 Connect 命令来重新创建 I/O Submission Queue 和 I/O Completion Queue。作为 Connect 命令的一部分,主机可以修改 I/O 队列的属性。
主机应确保相应的 I/O Submission Queue 或 I/O Completion Queue在删除该队列之前处于空闲状态。提交 queue deletion 命令会导致控制器中止任何挂起的命令;这可能会(可能不会)导致为中止的命令发布完成队列条目。