code-update: Update design to handle PLDM package w/o Targets
Updated the design document to handle code update using multi-part
image format like PLDM when no Targets are specified.
Change-Id: I541f679d9d765ade308cfc2e6e1cfe959ec82c8a
Signed-off-by: Tom Joseph <rushtotom@gmail.com>
diff --git a/designs/code-update.md b/designs/code-update.md
index 15b6494..51ee3ff 100644
--- a/designs/code-update.md
+++ b/designs/code-update.md
@@ -2,14 +2,19 @@
Author: Jagpal Singh Gill <paligill@gmail.com>
+Other contributors:
+
+- Deepak Kodihalli <deepak.kodihalli.83@gmail.com> @dkodihal
+- Tom Joseph <rushtotom@gmail.com> @tomjose
+
Created: 4th August 2023
-Last Updated: Jun 09, 2025
+Last Updated: Aug 29, 2025
## Problem Description
-This section covers the limitations discoverd with
-[phosphor-bmc-code-mgmt](https://github.com/openbmc/phosphor-bmc-code-mgmt)
+This section covers the limitations discovered with
+[phosphor-bmc-code-mgmt](https://github.com/openbmc/phosphor-bmc-code-mgmt).
1. Current code update flow is complex as it involves 3 different daemons -
Image Manager, Image Updater and Update Service.
@@ -25,6 +30,8 @@
- [phosphor-bmc-code-mgmt](https://github.com/openbmc/phosphor-bmc-code-mgmt)
- [Software DBus Interface](https://github.com/openbmc/phosphor-dbus-interfaces/tree/master/yaml/xyz/openbmc_project/Software)
- [Code Update Design](https://github.com/openbmc/docs/tree/master/architecture/code-update)
+- [PLDM for Firmware Update Specification](https://www.dmtf.org/sites/default/files/standards/documents/DSP0267_1.3.0.pdf)
+- [Redfish Firmware Update White Paper](https://www.dmtf.org/sites/default/files/standards/documents/DSP2062_1.0.2.pdf)
## Requirements
@@ -50,6 +57,10 @@
10. Able to update multiple components in parallel.
11. Able to restrict critical system actions, such as reboot for entity under
update while the code update is in flight.
+12. Able to update the components with a multi part image when no Targets are
+ specified.
+13. Able to order component updates to a device as defined in the multi part
+ image format.
## Proposed Design
@@ -139,15 +150,16 @@
The DBus Interface for code update will consist of following -
-| Interface Name | Existing/New | Purpose |
-| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------: | :-----------------------------------------------------------------: |
-| [xyz.openbmc_project.Software.Update](https://gerrit.openbmc.org/c/openbmc/phosphor-dbus-interfaces/+/65738) | New | Provides update method |
-| [xyz.openbmc_project.Software.Version](https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Software/Version.interface.yaml) | Existing | Provides version info |
-| [xyz.openbmc_project.Software.Activation](https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Software/Activation.interface.yaml) | Existing | Provides activation status |
-| [xyz.openbmc_project.Software.ActivationProgress](https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Software/ActivationProgress.interface.yaml) | Existing | Provides activation progress percentage |
-| [xyz.openbmc_project.Software.ActivationBlocksTransition](https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Software/ActivationBlocksTransition.interface.yaml) | Existing | Signifies barrier for state transitions while update is in progress |
-| [xyz.openbmc_project.Software.RedundancyPriority](https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Software/RedundancyPriority.interface.yaml) | Existing | Provides the redundancy priority for the version interface |
-| [xyz.openbmc_project.Software.Asset](https://github.com/openbmc/phosphor-dbus-interfaces/tree/master/yaml/xyz/openbmc_project/Software/Asset.interface.yaml) | New | Provides Manufacturer and Release Date information |
+| Interface Name | Existing/New | Purpose |
+| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------: | :---------------------------------------------------------------------------------------------------------: |
+| [xyz.openbmc_project.Software.Update](https://gerrit.openbmc.org/c/openbmc/phosphor-dbus-interfaces/+/65738) | New | Provides update method |
+| [xyz.openbmc_project.Software.MultipartUpdate](https://gerrit.openbmc.org/c/openbmc/phosphor-dbus-interfaces/+/78905) | New | Interface to identify the multi part updater which can do code update based on the multi-part image format. |
+| [xyz.openbmc_project.Software.Version](https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Software/Version.interface.yaml) | Existing | Provides version info |
+| [xyz.openbmc_project.Software.Activation](https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Software/Activation.interface.yaml) | Existing | Provides activation status |
+| [xyz.openbmc_project.Software.ActivationProgress](https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Software/ActivationProgress.interface.yaml) | Existing | Provides activation progress percentage |
+| [xyz.openbmc_project.Software.ActivationBlocksTransition](https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Software/ActivationBlocksTransition.interface.yaml) | Existing | Signifies barrier for state transitions while update is in progress |
+| [xyz.openbmc_project.Software.RedundancyPriority](https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Software/RedundancyPriority.interface.yaml) | Existing | Provides the redundancy priority for the version interface |
+| [xyz.openbmc_project.Software.Asset](https://github.com/openbmc/phosphor-dbus-interfaces/tree/master/yaml/xyz/openbmc_project/Software/Asset.interface.yaml) | New | Provides Manufacturer and Release Date information |
Introduction of xyz.openbmc_project.Software.Update interface streamlines the
update invocation flow and hence addresses the [Issue# 2](#problem-description)
@@ -360,6 +372,58 @@
required logic to verify if the supplied image is targeted for itself (and child
components) or not.
+### Multi part image handling w/o Targets
+
+A service intended to process firmware updates via a multi-part image, without
+explicit update targets, is required to implement the
+xyz.openbmc_project.Software.MultipartUpdate interface. The system permits only
+a single instance of this interface. If no targets are provided, bmcweb searches
+for the service exposing this interface and invokes the StartUpdate method at
+the associated object path.
+
+The PLDM package is an example of multi-part image format. At the application
+layer, the pldmd daemon implements both
+xyz.openbmc_project.Software.MultipartUpdate and
+xyz.openbmc_project.Software.Update D-Bus interfaces. Upon receiving a PLDM
+package, pldmd parses the content, applies the component-matching algorithm as
+defined by the PLDM Type 5 specification, and initiates firmware updates for
+relevant PLDM devices, also ensuring component updates are ordered per firmware
+device. This implementation does not cover scenario where PLDM package can be
+used to update PLDM and Non-PLDM devices.
+
+pldmd implements standard interfaces:
+
+- `xyz.openbmc_project.Software.MultipartUpdate`
+- `xyz.openbmc_project.Software.Update`
+- `xyz.openbmc_project.Software.Activation`
+- `xyz.openbmc_project.Software.ActivationProgress`
+
+```mermaid
+ graph TD
+ subgraph bmcweb["bmcweb"]
+ end
+
+ subgraph PLDM["pldmd"]
+ direction TB
+ P1["libpldm"]
+ end
+
+ bmcweb <--> |MultipartUpdate D-Bus Intf<br>StartUpdate D-Bus Intf| PLDM
+ PLDM <--> |MCTP| F[PLDM endpoints]
+
+
+ classDef bmcweb fill:#f8f0ff,stroke:#333,stroke-width:1px;
+ classDef manager fill:#fff3e0,stroke:#333,stroke-width:1px;
+ classDef pldm fill:#e3f2fd,stroke:#333,stroke-width:1px;
+ classDef endpoints fill:#ffffff,stroke:#333,stroke-width:1px;
+ classDef libpldm fill:#ffcdd2,stroke:#333,stroke-width:1px;
+
+ class bmcweb bmcweb;
+ class PLDM pldm;
+ class F endpoints;
+ class P1 libpldm;
+```
+
### Update multiple devices of same type
- For same type devices, extend the Dbus path to specify device instance, for