commit | 783406e649e90e13540f192f4111270a02d83168 | [log] [tgz] |
---|---|---|
author | Shawn McCarney <shawnmm@us.ibm.com> | Sun Nov 17 21:49:37 2024 -0600 |
committer | Shawn McCarney <shawnmm@us.ibm.com> | Wed Nov 20 14:07:13 2024 -0600 |
tree | 2020e1b302ee98961c6cae21fbfc5f67e81115e9 | |
parent | 73a6f0d869c67223c0461d1b00af3f38c0928baf [diff] |
Get model using command line tool Get the PSU model using a command line tool specified in the meson options. The default tool is 'psutils --get-model'. The tool should get the model data directly from the PSU. This is more accurate than getting the Model property of the Asset interface on D-Bus. Inventory Manager saves its state to files. When the BMC is booted, Inventory Manager initializes itself using the saved state. This is necessary to handle the scenario where the BMC is rebooted while the rest of the system is powered on (such as a concurrent BMC code update). However, if all power was removed from the system, a PSU may have been added/removed/replaced while the BMC was offline. When the BMC boots, the Inventory Manager saved state is not correct. Eventually the PSU monitoring application will update the model on D-Bus, but this can take a non-trivial amount of time. This is especially true if EntityManager is used to provide the PSU bus and address information to the PSU monitoring application. Tested: * Verified all automated tests build and run successfully * Verified application uses command line tool to obtain model * Verified command line tool was returning the correct model * Test where command line tool fails with non-zero exit code * Tested where all PSU information available when application starts * Tested where PSU information is obtained after application starts using the InterfacesAdded handler * Tested where PSU presence changes and is obtained by the PropertiesChanged handler * Full test plan is available at https://gist.github.com/smccarney/87bd821a6d317ec0915d1f162028ff01 Change-Id: Ia9d35850aa6ac27dd006679991272232d67390ff Signed-off-by: Shawn McCarney <shawnmm@us.ibm.com>
phosphor-psu-code-mgmt is a service to provide management for PSU code, including:
meson build/ && ninja -C build
Run it in OpenBMC CI, refer to local-ci-build.md
Run it in OE SDK, run below commands in a x86-64 SDK env:
meson -Doe-sdk=enabled -Dtests=enabled build/ ninja -C build/ test # Meson skips running the case due to it thinks it's cross compiling # Manually run the tests for t in `find build/test/ -maxdepth 1 -name "test_*"`; do ./$t || break ; done
This repo contains generic code to handle the PSU versions and updates. It depends on vendor-specific tools to provide the below functions on the real PSU hardware:
It provides configure options for vendor-specific tools for the above functions:
PSU_VERSION_UTIL
: It shall be defined as a command-line tool that accepts the PSU inventory path as input, and outputs the PSU version string to stdout.PSU_MODEL_UTIL
: It shall be defined as a command-line tool that accepts the PSU inventory path as input, and outputs the PSU model string to stdout.PSU_VERSION_COMPARE_UTIL
: It shall be defined as a command-line tool that accepts one or more PSU version strings, and outputs the latest version string to stdout.PSU_UPDATE_SERVICE
: It shall be defined as a systemd service that accepts two arguments:For example:
meson -Dtests=disabled \ '-DPSU_VERSION_UTIL=/usr/bin/psutils --raw --get-version' \ '-DPSU_MODEL_UTIL=/usr/bin/psutils --raw --get-model' \ '-DPSU_VERSION_COMPARE_UTIL=/usr/bin/psutils --raw --compare' \ '-DPSU_UPDATE_SERVICE=psu-update@.service' \ build
The above configures the vendor-specific tools to use psutils
from phosphor-power to get the PSU version and model, compare PSU versions, and use psu-update@.service
to perform the PSU firmware update, where internally it invokes psutils
as well.
When the service starts, it queries the inventory to get all the PSU inventory paths, invokes the vendor-specific tool to get the versions, and creates version objects under /xyz/openbmc_project/software
that are associated with the PSU inventory path. If multiple PSUs are using the same version, multiple PSU inventory paths are associated.
E.g.
Example of system with two PSUs that have different versions:
"/xyz/openbmc_project/software/02572429": { "Activation": "xyz.openbmc_project.Software.Activation.Activations.Active", "Associations": [ [ "inventory", "activation", "/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1" ] ], "ExtendedVersion": "", "Path": "", "Purpose": "xyz.openbmc_project.Software.Version.VersionPurpose.PSU", "RequestedActivation": "xyz.openbmc_project.Software.Activation.RequestedActivations.None", "Version": "01120114" }, "/xyz/openbmc_project/software/7094f612": { "Activation": "xyz.openbmc_project.Software.Activation.Activations.Active", "Associations": [ [ "inventory", "activation", "/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0" ] ], "ExtendedVersion": "", "Path": "", "Purpose": "xyz.openbmc_project.Software.Version.VersionPurpose.PSU", "RequestedActivation": "xyz.openbmc_project.Software.Activation.RequestedActivations.None", "Version": "00000110" },
Example of system with two PSUs that have the same version:
"/xyz/openbmc_project/software/9463c2ad": { "Activation": "xyz.openbmc_project.Software.Activation.Activations.Active", "Associations": [ [ "inventory", "activation", "/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0" ], [ "inventory", "activation", "/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1" ] ], "ExtendedVersion": "", "Path": "", "Purpose": "xyz.openbmc_project.Software.Version.VersionPurpose.PSU", "RequestedActivation": "xyz.openbmc_project.Software.Activation.RequestedActivations.None", "Version": "01100110" },
Generate a tarball of PSU firmware image by generate-psu-tar tool.
./generate-psu-tar --image <psu-image> --version <version> --model <model> --manufacturer \ <manufacturer> --machineName <machineName> --outfile <psu.tar> --sign
To update the PSU firmware, follow the same steps as described in code-update.md:
After a successful update, the PSU image and the manifest is stored in BMC's persistent storage defined by IMG_DIR_PERSIST
. When a PSU is replaced, the PSU's firmware version will be checked and updated if it's older than the one stored in BMC.
It is possible to put a PSU image and MANIFEST in the built-in OpenBMC image in BMC's read-only filesystem defined by IMG_DIR_BUILTIN
. When the service starts, it will compare the versions of the built-in image and the existing PSUs. If there is any PSU that has older firmware, it will be updated to the new firmware.