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. 所有组件编程完成后,执行任何最终的设备特定操作以完成更新。