PLDM 固件闪存更新库

pldmfw 实现了使用 PLDM 进行固件更新标准的设备闪存更新功能 <https://www.dmtf.org/documents/pmci/pldm-firmware-update-specification-100>。

pldmfw 库概述

pldmfw 库旨在供设备驱动程序使用,以实现基于遵循 PLDM 固件文件格式的固件文件的设备闪存更新。

它使用操作表实现,允许设备驱动程序提供底层设备特定的功能。

pldmfw 实现逻辑以将 PLDM 固件文件的打包二进制格式解析为数据结构,然后使用提供的函数操作来确定固件文件是否与设备匹配。如果是,则使用设备驱动程序提供的设备特定实现将记录和组件数据发送到固件。一旦设备固件指示可以执行更新,固件数据就会发送到设备进行编程。

解析 PLDM 文件

PLDM 文件格式使用打包的二进制数据,其中大多数多字节字段以小端格式存储。有几个数据长度可变,包括版本字符串以及记录和组件的数量。因此,直接索引记录、记录描述符或组件并非易事。

为了避免增加对打包二进制数据的访问,pldmfw 库会解析并将这些数据提取到更简单的结构中,以便于访问。

为了安全地处理固件文件,我们会注意避免对多字节字段进行未对齐访问,并正确地从小端转换为 CPU 主机格式。此外,记录、描述符和组件存储在链表中。

执行闪存更新

要执行闪存更新,pldmfw 模块会执行以下步骤

  1. 解析固件文件以获取记录和组件信息

  2. 扫描记录并确定设备是否与文件中的任何记录匹配。将使用第一个匹配的记录。

  3. 如果匹配的记录提供包数据,则将此包数据发送到设备。

  4. 对于记录指示的每个组件,将组件数据发送到设备。对于每个组件,固件可能会响应指示更新是否合适。如果有任何组件不合适,则取消更新。

  5. 对于每个组件,将二进制数据发送到设备固件进行更新。

  6. 在所有组件都编程完毕后,执行任何最终的设备特定操作以完成更新。