xref: /openbmc/pldm/tools/fw-update/README.md (revision a743e384)
1# Overview
2
3pldm_fwup_pkg_creator.py is a python script that can package one or more
4firmware image blobs into a PLDM firmware update package, as per the DSP0267
5specification v1.1.0 - Section 7.
6
7## Requirements
8
9- Python 3.6+
10- Python bitarray module
11  - For example on Ubuntu: sudo pip3 install bitarray
12
13## Usage
14
15    pldm_fwup_pkg_creator.py [-h]
16                                pldmfwuppkgname metadatafile images
17                                [images ...]
18
19    positional arguments:
20        pldmfwuppkgname  Name of the PLDM FW update package
21        metadatafile     Path of metadata JSON file
22        images           One or more firmware image paths, in the same order as
23                         ComponentImageInformationArea entries
24
25- Provide name for the PLDM FW update package, output will be written to a file
26  with this name
27- Providing the metadata JSON file is a must
28- The file path of at least one image file must be provided
29- In case there are more than one images, they should be specified in the _same
30  order_ as the entries in the "ComponentImageInformationArea" list in the
31  metadata json
32
33## Metadata JSON file
34
35Some fields corresponding to the PLDM firmware update package must be specified
36in an input metadata file (see the section 'Mapping fields to DSP0267') that's
37in JSON format. Typically it is not necessary to write this file each time the
38PLDM firmware update package has to be generated - one or more platform specific
39metadata JSON files can be reused. The key names used in the metadata JSON
40_match with the proprerty names_ used in DSP0267. There is an example metadata
41json file included - metadata-example.json, which has example entries for
42preparing a PLDM firmware update package that targets three devices, and there
43are a total of three component images.
44
45## Mapping fields to DSP0267
46
47This section describes the following:
48
49- which fields of the PLDM firmware update package are supported by the script
50- whether those fields need to be specified in the JSON, or are generated by the
51  script
52
53## Package Header Information
54
55Metadata JSON must have a key called "PackageHeaderInformation", which is of
56type Object. See below for details on properties:
57
58- PackageHeaderIdentifier: Supported, must be specified in metadata file
59- PackageHeaderFormatRevision: Supported, must be specified in metadata file
60- PackageHeaderSize: Supported, generated by the script
61- PackageReleaseDateTime: Supported, this is an optional field in the metadata
62  file and the format is YYYY-MM-DD HH:mm:ss (or with the space replaced with a
63  'T' for full ISO-8601 compliance). If not specified in the metadata file,
64  current time is taken.
65- ComponentBitmapBitLength: Supported, generated by the script
66  - Only 32 components supported at the moment
67- PackageVersionStringType: Supported - only ASCII at the moment. Generated by
68  the script
69- PackageVersionStringLength: Supported, generated by the script
70- PackageVersionString: Supported, must be specified in metadata file
71
72## Firmware Device Identification Area
73
74Metadata JSON must have a key called "FirmwareDeviceIdentificationArea", which
75is of type List. Each List entry corresponds to an firmware device ID record.
76See below for details on properties:
77
78- DeviceIDRecordCount: Supported, generated by the script
79- FirmwareDeviceIDRecords: which is a list of Individual Firmware Device ID
80  Records. Each such record can have the following properties:
81  - RecordLength: Supported, generated by the script
82  - DescriptorCount: Supported, generated by the script
83  - DeviceUpdateOptionFlags: Supported, must be specified in metadata file
84    - add each bit that is to be set to 1 to the list "DeviceUpdateOptionFlags"
85  - ComponentImageSetVersionStringType: Supported - only ASCII at the moment.
86    Generated by the script
87  - ComponentImageSetVersionStringLength: Supported, generated by the script
88  - FirmwareDevicePackageDataLength: Not supported. Set to 0 by the script
89  - ApplicableComponents: Supported, must be specified in metadata file
90    - specify indexes of "ComponentImageInformationArea" values that apply in
91      the "ApplicableComponents" list
92  - ComponentImageSetVersionString: Supported, must be specified in metadata
93    file
94  - RecordDescriptors: Metadata JSON must have a key called "Descriptors", which
95    is of type List. Each List entry corresponds to a descriptor. The first
96    entry is considered as the initial descriptor and the type shall be one of
97    the following 0x0000(PCI Vendor ID), 0x0001(IANA Enterprise ID),
98    0x0002(UUID), 0x0003(PnP Vendor ID), 0x0004(ACPI Vendor ID). The additional
99    descriptors support initial descriptor types and additionally 0x0100(PCI
100    Device ID), 0x0101(PCI Subsystem Vendor ID), 0x0102(PCI Subsystem ID),
101    0x0103(PCI Revision ID), 0x0104(PnP Product Identifier), 0x0105(ACPI Product
102    Identifier), 0xFFFF(Vendor defined). For descriptor types other than vendor
103    defined the properties expected are DescriptorType and DescriptorData. If
104    the descriptor type is vendor defined, the properties expected are
105    DescriptorType, VendorDefinedDescriptorTitleString and
106    VendorDefinedDescriptorData. See below for details on properties:
107    - DescriptorType: Supported, must be specified in metadata file
108    - DescriptorLength: Supported, generated by the script
109    - DescriptorData: Supported, must be specified in metadata file as a hex
110      string
111    - VendorDefinedDescriptorTitleStringType: Supported - only ASCII at the
112      moment.
113    - VendorDefinedDescriptorTitleStringLength: Supported, generated by the
114      script
115    - VendorDefinedDescriptorTitleString: Supported, must be specified in
116      metadata file
117    - VendorDefinedDescriptorData: Supported, must be specified in metadata file
118      as a hex string
119  - FirmwareDevicePackageData: Not supported at the moment
120
121## Downstream Device Identification Area
122
123Not supported at the moment
124
125## Component Image Information Area
126
127Metadata JSON must have a key called "ComponentImageInformationArea", which is
128of type List. Each List entry corresponds to an Individual Component Image
129Information. See below for details on properties:
130
131- ComponentImageCount: Supported, generated by the script
132- ComponentImageInformation: which is a list of Individual Component Image
133  Information records. Each such record can have the following properties:
134  - ComponentClassification: Supported, must be specified in metadata file
135  - ComponentIdentifier: Supported, must be specified in metadata file
136  - ComponentComparisonStamp: Supported. Must be specified as hexadecimal string
137    value in metadata file if ComponentOptions bit 1 is selected. If the
138    ComponentOptions bit 1 is not set, the ComponentComparisonStamp will be set
139    to the default value of 0xFFFFFFFF.
140  - ComponentOptions: Supported, must be specified in metadata file
141    - add each bit that is to be set to 1 to the list "ComponentOptions"
142    - supported options are Force Update and Use Component Comparison Stamp.
143  - RequestedComponentActivationMethod: Supported, must be specified in metadata
144    file
145    - add each bit that is to be set to 1 to the list
146      "RequestedComponentActivationMethod"
147  - ComponentLocationOffset: Supported, generated by the script
148  - ComponentSize: Supported, generated by the script
149  - ComponentVersionStringType: Supported - only ASCII at the moment. Generated
150    by the script
151  - ComponentVersionStringLength: Supported, generated by the script
152  - ComponentVersionString: Supported, must be specified in metadata file
153
154## Package Header Checksum
155
156Supported, generated by the script
157