73 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| .. 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.
 |