1*4882a593Smuzhiyun.. SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun================================== 4*4882a593SmuzhiyunPLDM Firmware file format overview 5*4882a593Smuzhiyun================================== 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunA PLDM firmware package is a binary file which contains a header that 8*4882a593Smuzhiyundescribes the contents of the firmware package. This includes an initial 9*4882a593Smuzhiyunpackage header, one or more firmware records, and one or more components 10*4882a593Smuzhiyundescribing the actual flash contents to program. 11*4882a593Smuzhiyun 12*4882a593SmuzhiyunThis diagram provides an overview of the file format:: 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun overall file layout 15*4882a593Smuzhiyun +----------------------+ 16*4882a593Smuzhiyun | | 17*4882a593Smuzhiyun | Package Header | 18*4882a593Smuzhiyun | | 19*4882a593Smuzhiyun +----------------------+ 20*4882a593Smuzhiyun | | 21*4882a593Smuzhiyun | Device Records | 22*4882a593Smuzhiyun | | 23*4882a593Smuzhiyun +----------------------+ 24*4882a593Smuzhiyun | | 25*4882a593Smuzhiyun | Component Info | 26*4882a593Smuzhiyun | | 27*4882a593Smuzhiyun +----------------------+ 28*4882a593Smuzhiyun | | 29*4882a593Smuzhiyun | Package Header CRC | 30*4882a593Smuzhiyun | | 31*4882a593Smuzhiyun +----------------------+ 32*4882a593Smuzhiyun | | 33*4882a593Smuzhiyun | Component Image 1 | 34*4882a593Smuzhiyun | | 35*4882a593Smuzhiyun +----------------------+ 36*4882a593Smuzhiyun | | 37*4882a593Smuzhiyun | Component Image 2 | 38*4882a593Smuzhiyun | | 39*4882a593Smuzhiyun +----------------------+ 40*4882a593Smuzhiyun | | 41*4882a593Smuzhiyun | ... | 42*4882a593Smuzhiyun | | 43*4882a593Smuzhiyun +----------------------+ 44*4882a593Smuzhiyun | | 45*4882a593Smuzhiyun | Component Image N | 46*4882a593Smuzhiyun | | 47*4882a593Smuzhiyun +----------------------+ 48*4882a593Smuzhiyun 49*4882a593SmuzhiyunPackage Header 50*4882a593Smuzhiyun============== 51*4882a593Smuzhiyun 52*4882a593SmuzhiyunThe package header begins with the UUID of the PLDM file format, and 53*4882a593Smuzhiyuncontains information about the version of the format that the file uses. It 54*4882a593Smuzhiyunalso includes the total header size, a release date, the size of the 55*4882a593Smuzhiyuncomponent bitmap, and an overall package version. 56*4882a593Smuzhiyun 57*4882a593SmuzhiyunThe following diagram provides an overview of the package header:: 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun header layout 60*4882a593Smuzhiyun +-------------------------+ 61*4882a593Smuzhiyun | PLDM UUID | 62*4882a593Smuzhiyun +-------------------------+ 63*4882a593Smuzhiyun | Format Revision | 64*4882a593Smuzhiyun +-------------------------+ 65*4882a593Smuzhiyun | Header Size | 66*4882a593Smuzhiyun +-------------------------+ 67*4882a593Smuzhiyun | Release Date | 68*4882a593Smuzhiyun +-------------------------+ 69*4882a593Smuzhiyun | Component Bitmap Length | 70*4882a593Smuzhiyun +-------------------------+ 71*4882a593Smuzhiyun | Package Version Info | 72*4882a593Smuzhiyun +-------------------------+ 73*4882a593Smuzhiyun 74*4882a593SmuzhiyunDevice Records 75*4882a593Smuzhiyun============== 76*4882a593Smuzhiyun 77*4882a593SmuzhiyunThe device firmware records area starts with a count indicating the total 78*4882a593Smuzhiyunnumber of records in the file, followed by each record. A single device 79*4882a593Smuzhiyunrecord describes what device matches this record. All valid PLDM firmware 80*4882a593Smuzhiyunfiles must contain at least one record, but optionally may contain more than 81*4882a593Smuzhiyunone record if they support multiple devices. 82*4882a593Smuzhiyun 83*4882a593SmuzhiyunEach record will identify the device it supports via TLVs that describe the 84*4882a593Smuzhiyundevice, such as the PCI device and vendor information. It will also indicate 85*4882a593Smuzhiyunwhich set of components that are used by this device. It is possible that 86*4882a593Smuzhiyunonly subset of provided components will be used by a given record. A record 87*4882a593Smuzhiyunmay also optionally contain device-specific package data that will be used 88*4882a593Smuzhiyunby the device firmware during the update process. 89*4882a593Smuzhiyun 90*4882a593SmuzhiyunThe following diagram provides an overview of the device record area:: 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun area layout 93*4882a593Smuzhiyun +---------------+ 94*4882a593Smuzhiyun | | 95*4882a593Smuzhiyun | Record Count | 96*4882a593Smuzhiyun | | 97*4882a593Smuzhiyun +---------------+ 98*4882a593Smuzhiyun | | 99*4882a593Smuzhiyun | Record 1 | 100*4882a593Smuzhiyun | | 101*4882a593Smuzhiyun +---------------+ 102*4882a593Smuzhiyun | | 103*4882a593Smuzhiyun | Record 2 | 104*4882a593Smuzhiyun | | 105*4882a593Smuzhiyun +---------------+ 106*4882a593Smuzhiyun | | 107*4882a593Smuzhiyun | ... | 108*4882a593Smuzhiyun | | 109*4882a593Smuzhiyun +---------------+ 110*4882a593Smuzhiyun | | 111*4882a593Smuzhiyun | Record N | 112*4882a593Smuzhiyun | | 113*4882a593Smuzhiyun +---------------+ 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun record layout 116*4882a593Smuzhiyun +-----------------------+ 117*4882a593Smuzhiyun | Record Length | 118*4882a593Smuzhiyun +-----------------------+ 119*4882a593Smuzhiyun | Descriptor Count | 120*4882a593Smuzhiyun +-----------------------+ 121*4882a593Smuzhiyun | Option Flags | 122*4882a593Smuzhiyun +-----------------------+ 123*4882a593Smuzhiyun | Version Settings | 124*4882a593Smuzhiyun +-----------------------+ 125*4882a593Smuzhiyun | Package Data Length | 126*4882a593Smuzhiyun +-----------------------+ 127*4882a593Smuzhiyun | Applicable Components | 128*4882a593Smuzhiyun +-----------------------+ 129*4882a593Smuzhiyun | Version String | 130*4882a593Smuzhiyun +-----------------------+ 131*4882a593Smuzhiyun | Descriptor TLVs | 132*4882a593Smuzhiyun +-----------------------+ 133*4882a593Smuzhiyun | Package Data | 134*4882a593Smuzhiyun +-----------------------+ 135*4882a593Smuzhiyun 136*4882a593SmuzhiyunComponent Info 137*4882a593Smuzhiyun============== 138*4882a593Smuzhiyun 139*4882a593SmuzhiyunThe component information area begins with a count of the number of 140*4882a593Smuzhiyuncomponents. Following this count is a description for each component. The 141*4882a593Smuzhiyuncomponent information points to the location in the file where the component 142*4882a593Smuzhiyundata is stored, and includes version data used to identify the version of 143*4882a593Smuzhiyunthe component. 144*4882a593Smuzhiyun 145*4882a593SmuzhiyunThe following diagram provides an overview of the component area:: 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun area layout 148*4882a593Smuzhiyun +-----------------+ 149*4882a593Smuzhiyun | | 150*4882a593Smuzhiyun | Component Count | 151*4882a593Smuzhiyun | | 152*4882a593Smuzhiyun +-----------------+ 153*4882a593Smuzhiyun | | 154*4882a593Smuzhiyun | Component 1 | 155*4882a593Smuzhiyun | | 156*4882a593Smuzhiyun +-----------------+ 157*4882a593Smuzhiyun | | 158*4882a593Smuzhiyun | Component 2 | 159*4882a593Smuzhiyun | | 160*4882a593Smuzhiyun +-----------------+ 161*4882a593Smuzhiyun | | 162*4882a593Smuzhiyun | ... | 163*4882a593Smuzhiyun | | 164*4882a593Smuzhiyun +-----------------+ 165*4882a593Smuzhiyun | | 166*4882a593Smuzhiyun | Component N | 167*4882a593Smuzhiyun | | 168*4882a593Smuzhiyun +-----------------+ 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun component layout 171*4882a593Smuzhiyun +------------------------+ 172*4882a593Smuzhiyun | Classification | 173*4882a593Smuzhiyun +------------------------+ 174*4882a593Smuzhiyun | Component Identifier | 175*4882a593Smuzhiyun +------------------------+ 176*4882a593Smuzhiyun | Comparison Stamp | 177*4882a593Smuzhiyun +------------------------+ 178*4882a593Smuzhiyun | Component Options | 179*4882a593Smuzhiyun +------------------------+ 180*4882a593Smuzhiyun | Activation Method | 181*4882a593Smuzhiyun +------------------------+ 182*4882a593Smuzhiyun | Location Offset | 183*4882a593Smuzhiyun +------------------------+ 184*4882a593Smuzhiyun | Component Size | 185*4882a593Smuzhiyun +------------------------+ 186*4882a593Smuzhiyun | Component Version Info | 187*4882a593Smuzhiyun +------------------------+ 188*4882a593Smuzhiyun | Package Data | 189*4882a593Smuzhiyun +------------------------+ 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun 192*4882a593SmuzhiyunPackage Header CRC 193*4882a593Smuzhiyun================== 194*4882a593Smuzhiyun 195*4882a593SmuzhiyunFollowing the component information is a short 4-byte CRC calculated over 196*4882a593Smuzhiyunthe contents of all of the header information. 197*4882a593Smuzhiyun 198*4882a593SmuzhiyunComponent Images 199*4882a593Smuzhiyun================ 200*4882a593Smuzhiyun 201*4882a593SmuzhiyunThe component images follow the package header information in the PLDM 202*4882a593Smuzhiyunfirmware file. Each of these is simply a binary chunk with its start and 203*4882a593Smuzhiyunsize defined by the matching component structure in the component info area. 204