| .. SPDX-License-Identifier: GPL-2.0-only | |
| ================================== | |
| PLDM Firmware Flash Update Library | |
| ================================== | |
| ``pldmfw`` implements functionality for updating the flash on a device using | |
| the PLDM for Firmware Update standard | |
| <https://www.dmtf.org/documents/pmci/pldm-firmware-update-specification-100>. | |
| .. toctree:: | |
| :maxdepth: 1 | |
| file-format | |
| driver-ops | |
| Overview of the ``pldmfw`` library | |
| ================================== | |
| The ``pldmfw`` library is intended to be used by device drivers for | |
| implementing device flash update based on firmware files following the PLDM | |
| firmware file format. | |
| It is implemented using an ops table that allows device drivers to provide | |
| the underlying device specific functionality. | |
| ``pldmfw`` implements logic to parse the packed binary format of the PLDM | |
| firmware file into data structures, and then uses the provided function | |
| operations to determine if the firmware file is a match for the device. If | |
| so, it sends the record and component data to the firmware using the device | |
| specific implementations provided by device drivers. Once the device | |
| firmware indicates that the update may be performed, the firmware data is | |
| sent to the device for programming. | |
| Parsing the PLDM file | |
| ===================== | |
| The PLDM file format uses packed binary data, with most multi-byte fields | |
| stored in the Little Endian format. Several pieces of data are variable | |
| length, including version strings and the number of records and components. | |
| Due to this, it is not straight forward to index the record, record | |
| descriptors, or components. | |
| To avoid proliferating access to the packed binary data, the ``pldmfw`` | |
| library parses and extracts this data into simpler structures for ease of | |
| access. | |
| In order to safely process the firmware file, care is taken to avoid | |
| unaligned access of multi-byte fields, and to properly convert from Little | |
| Endian to CPU host format. Additionally the records, descriptors, and | |
| components are stored in linked lists. | |
| Performing a flash update | |
| ========================= | |
| To perform a flash update, the ``pldmfw`` module performs the following | |
| steps | |
| 1. Parse the firmware file for record and component information | |
| 2. Scan through the records and determine if the device matches any record | |
| in the file. The first matched record will be used. | |
| 3. If the matching record provides package data, send this package data to | |
| the device. | |
| 4. For each component that the record indicates, send the component data to | |
| the device. For each component, the firmware may respond with an | |
| indication of whether the update is suitable or not. If any component is | |
| not suitable, the update is canceled. | |
| 5. For each component, send the binary data to the device firmware for | |
| updating. | |
| 6. After all components are programmed, perform any final device-specific | |
| actions to finalize the update. |