通过reset 激活firmware 更新的过程
- host发Firmware Image Download命令来将固件映像下载至控制器。固件映像(firmware image)可能有多个部分要下载,所以,要下载的固件映像的每一个部分的Offset 都应在Firmware Image Download中指定,Firmware Image Download命令里提供的数据需要符合Identify Controller 数据结构中指定的Firmware Update Granularity,否则,更新可能失败。
- 在固件下载到控制器之后,下一步是host提交Firmware Commit 命令。Firmware Commit会验证上次Download的固件映像是否有效,并将该映像提交到指定的Firm Slot以便后面使用。Offset 不是从0开始,含有空隙或者重叠Offset的固件映像视为无效。控制器可以额外采用其他vendor指定的方式(如校验和,CRC,密码哈希或数字签名)来确定固件映像的有效性:
a. Firmware Commit命令还可以用于激活与先前提交的Firmware Slot关联的固件映像。 - 最后一步是reset,然后激活”Firmware Commit”命令中”特定Firm Slot”字段里的固件映像。Reset 可以是The reset may be an NVM Subsystem Reset, Conventional Reset, Function Level Reset, or Controller Reset (CC.EN 从 ‘1’ 置为 ‘0’):
a. 在某些情况下,需要Conventional Reset 或 NVM Subsystem Reset才能激活固件映像。这种会在”Firmware Commit“中特定状态指示(NVME1.4 5.11.1)。 - Reset 完成后,host软件将重新初始化控制器。这包括重新分配I/O Submission Queues和Completion Queues. NVME1.4 7.6.1
不通过reset 激活firmware更新的过程
- host发Firmware Image Download命令来将固件映像下载至控制器。固件映像可能有多个部分要下载,所以,要下载的固件映像的每一个部分的Offset 都应在Firmware Image Download中指定,Firmware Image Download命令里提供的数据需要符合Identify Controller 数据结构中指定的Firmware Update Granularity,否则,更新可能失败。
- host 通过CA(Commit Action) = 011b提交Firmware Commit命令,这样就会立即激活映像而无需reset。Download的映像应替换原firmware slot中的映像。如果自上次reset或firmware commit命令以后(即跳过第一步)没有下载映像,那么控制器会验证并激活指定slot中有的映像。如果控制器开始激活固件,在启用 Firmware Activation Notices情况下,收新固件影响的任何控制器都会向host发送Firmware Activation Starting异步事件(参照NVME1.4 Figure 287):
a. Firmware Commit命令还可以用于激活与先前提交的Firmware Slot关联的固件映像。 - 控制器完成Firmware Commit命令。在某些错误情况下,将采取以下措施:
a. 如果固件映像无效,那么控制器报告适当的错误(如:Invalid Firmware Image);
b. 如果由于需要Controller Level Reset 来激活导致固件激活失败,那么控制器会报Firmware Activation Requires Controller Level Reset的错误,并且映像会在下次Controller Level Reset时应用。
c. 如果由于需要NVM Subsystem Reset来激活导致固件激活失败,则控制器会报Firmware Activation Requires NVM Subsystem Reset的错误,并且映像将在下一次NVM Subsystem Reset时应用;
d. 如果由于需要Conventional Reset来激活导致固件激活失败,则控制器会报Firmware Activation Requires Conventional Reset的错误,并且映像将在下一次Conventional Reset时应用;
e. 如果由于固件激活时间超过“Identify Controller”数据结构中的MTFA值而导致固件激活失败,则控制器将报Firmware Activation Requires Maximum Time Violation的错误。在这种情况下,要激活固件,需要重新发出“Firmware Commit”命令,并使用reset来激活。
如果在提交Firmware Commit命令之后且在该命令完成之前,控制器转到D3cold状态(参阅PCI Express Base Specification4.0),若Firmware Commit命令已经提交,或该固件映像已经被激活,控制器可以继续固件激活操作。
如果无法成功加载固件,则控制器应恢复到最近激活的firmware slot中存在的固件映像或基准只读固件映像(如果有),并将失败记录为一个异步事件:Firmware Image Load Error。
如果host覆盖(即更新)已激活的firmware slot中的固件,则先前激活的固件映像可能不再可用。结果是,需要使用该firmware slot的任何动作(如,控制器重启)都可以使用该firmware slot中当前的固件映像。
host软件不应同时更新多个固件映像。下载映像后,host软件会发出Firmware Commit命令,然后再下载其他固件映像。 上一次做了FW download + commit (FW1), 这次再执行FW download (FW2), 那么FW2会覆盖FW1, 等接下来发 commit命令的时候,激活的是FW2而不是FW1. 在download和commit之间来了reset,控制器会清理掉之前download进来的映像。