【NVMe2.0b 11】NVMe Reset

NVMe Reset

    • 3.7Resets
      • 3.7.1NVM Subsystem Reset
        • 3.7.1.1Single Domain NVM Subsystems
        • 3.7.1.2Multiple Domain NVM Subsystems
      • 3.7.2Controller Level Reset
      • 3.7.3Queue Level Reset

3.7Resets

3.7.1NVM Subsystem Reset

3.7.1.1Single Domain NVM Subsystems

NVM Subsystem Reset 的范围取决于 NVM 子系统是否支持多个域。在不支持多个域的 NVM 子系统中,NVM Subsystem Reset 的范围是整个 NVM 子系统。

NVM Subsystem Reset 在以下情况下启动:

  • 主电源供给 NVM 子系统;
  • 将 4E564D65h(“NVMe”)的值写入 NSSR.NSSRC 字段;
  • 使用 NVMe Management Interface 规范中定义的方法请求;要么
  • 发生供应商特定事件。

当 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 子系统内部错误中恢复,该错误会阻止继续正常操作(例如,致命的硬件或固件错误)。

3.7.1.2Multiple Domain NVM Subsystems

NVM Subsystem Reset 的范围取决于 NVM 子系统是否支持多个域。在支持多个域的 NVM 子系统中,NVM Subsystem Reset 的范围是域中的控制器或整个 NVM 子系统。

在以下情况下启动域上的 NVM Subsystem Reset:

  • 给该domain供电;
  • 值 4E564D65h(即“NVMe”)被写入该域中控制器之一的 NSSR.NSSRC 字段;要么
  • 在该域内发生了供应商特定事件。

当 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。

3.7.2Controller Level Reset

以下方法启动 Controller Level Reset:

  • NVM Subsystem Reset;
  • Controller Reset (i.e., CC.EN 从 ‘1’ 转为 ‘0’); 和
  • 传输特定reset类型(请参阅适用的 NVMe Transport binding 规范),如果有的话。

Controller Level Reset 包括以下操作:

  • 控制器停止处理任何未完成的 Admin 或 I/O 命令;
  • 所有I/O Submission Queues 被删除;
  • 所有I/O Completion Queues 被删除;
  • 控制器进入Idle状态。完成后,CSTS.RDY 清0;
  • 所有在第 3.1.3 节中定义的控制器寄存器和内部控制器状态都被重置,但以下情况除外:
      o对于使用基于内存的传输的控制器:
         - Admin Queue 寄存器(AQA、ASQ 或 ACQ)不会作为 Controller Reset 的一部分进行重置;
         - Controller Memory Buffer Memory Space Control 寄存器(CMBMSC)被重置,但它既不是 Controller Reset 也不是 Function Level Reset 的一部分;和
         - Persistent Memory Region Memory Space Control Upper 寄存器 (PMRMSCU) 和 Persistent Memory Region Memory Space Control Lower 寄存器(PMRMSCL) 不会作为 Controller Reset 的一部分进行重置。

          o对于使用基于消息的传输的控制器:
               没有例外

在除 Controller Reset 之外的所有 Controller Level Reset 情况下,controller 寄存器将按照适用的 NVMe Transport binding 规范的定义进行重置。

要在 Controller Level Reset 后继续,主机应:

  • 酌情更新传输特定状态和控制器寄存器状态;
  • 将 CC.EN 设置为“1”;
  • 等待 CSTS.RDY 设置为“1”;
  • 根据需要使用 Admin commands 配置控制器;
  • 根据需要创建 I/O Completion Queues 和 I/O Submission Queues;
  • 继续正常的 I/O 操作。

注意,除了 Controller Reset 之外的所有 Controller Level Reset 都会导致控制器立即失去与主机的通信。在这些情况下,控制器无法指示任何中止或更新任何完成队列条目。

3.7.3Queue 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 命令会导致控制器中止任何挂起的命令;这可能会(可能不会)导致为中止的命令发布完成队列条目。

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