1# phosphor-psu-code-mgmt 2 3phosphor-psu-code-mgmt is a service to provide management for PSU code, 4including: 5 6- PSU code version 7- PSU code update 8 9## Building 10 11```text 12meson build/ && ninja -C build 13``` 14 15## Unit test 16 17- Run it in OpenBMC CI, refer to [local-ci-build.md][1] 18- Run it in [OE SDK][2], run below commands in a x86-64 SDK env: 19 20 ```text 21 meson -Doe-sdk=enabled -Dtests=enabled build/ 22 ninja -C build/ test # Meson skips running the case due to it thinks it's cross compiling 23 # Manually run the tests 24 for t in `find build/test/ -maxdepth 1 -name "test_*"`; do ./$t || break ; done 25 ``` 26 27## Vendor-specific tools 28 29This repo contains generic code to handle the PSU versions and updates. It 30depends on vendor-specific tools to provide the below functions on the real PSU 31hardware: 32 33- Get PSU firmware version 34- Get PSU model 35- Compare the firmware version 36- Update the PSU firmware 37 38It provides configure options for vendor-specific tools for the above functions: 39 40- `PSU_VERSION_UTIL`: It shall be defined as a command-line tool that accepts 41 the PSU inventory path as input, and outputs the PSU version string to stdout. 42- `PSU_MODEL_UTIL`: It shall be defined as a command-line tool that accepts the 43 PSU inventory path as input, and outputs the PSU model string to stdout. 44- `PSU_VERSION_COMPARE_UTIL`: It shall be defined as a command-line tool that 45 accepts one or more PSU version strings, and outputs the latest version string 46 to stdout. 47- `PSU_UPDATE_SERVICE`: It shall be defined as a systemd service that accepts 48 two arguments: 49 - The PSU inventory DBus object; 50 - The path of the PSU image(s). 51 52For example: 53 54```text 55meson -Dtests=disabled \ 56 '-DPSU_VERSION_UTIL=/usr/bin/psutils --raw --get-version' \ 57 '-DPSU_MODEL_UTIL=/usr/bin/psutils --raw --get-model' \ 58 '-DPSU_VERSION_COMPARE_UTIL=/usr/bin/psutils --raw --compare' \ 59 '-DPSU_UPDATE_SERVICE=psu-update@.service' \ 60 build 61``` 62 63The above configures the vendor-specific tools to use `psutils` from 64[phosphor-power][3] to get the PSU version and model, compare PSU versions, and 65use `psu-update@.service` to perform the PSU firmware update, where internally 66it invokes `psutils` as well. 67 68## Usage 69 70### PSU version 71 72When the service starts, it queries the inventory to get all the PSU inventory 73paths, invokes the vendor-specific tool to get the versions, and creates version 74objects under `/xyz/openbmc_project/software` that are associated with the PSU 75inventory path. If multiple PSUs are using the same version, multiple PSU 76inventory paths are associated. 77 78E.g. 79 80- Example of system with two PSUs that have different versions: 81 82 ```text 83 "/xyz/openbmc_project/software/02572429": { 84 "Activation": "xyz.openbmc_project.Software.Activation.Activations.Active", 85 "Associations": [ 86 [ 87 "inventory", 88 "activation", 89 "/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1" 90 ] 91 ], 92 "ExtendedVersion": "", 93 "Path": "", 94 "Purpose": "xyz.openbmc_project.Software.Version.VersionPurpose.PSU", 95 "RequestedActivation": "xyz.openbmc_project.Software.Activation.RequestedActivations.None", 96 "Version": "01120114" 97 }, 98 "/xyz/openbmc_project/software/7094f612": { 99 "Activation": "xyz.openbmc_project.Software.Activation.Activations.Active", 100 "Associations": [ 101 [ 102 "inventory", 103 "activation", 104 "/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0" 105 ] 106 ], 107 "ExtendedVersion": "", 108 "Path": "", 109 "Purpose": "xyz.openbmc_project.Software.Version.VersionPurpose.PSU", 110 "RequestedActivation": "xyz.openbmc_project.Software.Activation.RequestedActivations.None", 111 "Version": "00000110" 112 }, 113 ``` 114 115- Example of system with two PSUs that have the same version: 116 117 ```text 118 "/xyz/openbmc_project/software/9463c2ad": { 119 "Activation": "xyz.openbmc_project.Software.Activation.Activations.Active", 120 "Associations": [ 121 [ 122 "inventory", 123 "activation", 124 "/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0" 125 ], 126 [ 127 "inventory", 128 "activation", 129 "/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1" 130 ] 131 ], 132 "ExtendedVersion": "", 133 "Path": "", 134 "Purpose": "xyz.openbmc_project.Software.Version.VersionPurpose.PSU", 135 "RequestedActivation": "xyz.openbmc_project.Software.Activation.RequestedActivations.None", 136 "Version": "01100110" 137 }, 138 ``` 139 140### PSU update 141 1421. Generate a tarball of PSU firmware image by [generate-psu-tar tool][4]. 143 144 ```text 145 ./generate-psu-tar --image <psu-image> --version <version> --model <model> --manufacturer \ 146 <manufacturer> --machineName <machineName> --outfile <psu.tar> --sign 147 ``` 148 1492. To update the PSU firmware, follow the same steps as described in 150 [code-update.md][5]: 151 - Upload a PSU image tarball and get the version ID; 152 - Set the RequestedActivation state of the uploaded image's version ID. 153 - Check the state and wait for the activation to be completed. 1543. After a successful update, the PSU image and the manifest is stored in BMC's 155 persistent storage defined by `IMG_DIR_PERSIST`. When a PSU is replaced, the 156 PSU's firmware version will be checked and updated if it's older than the one 157 stored in BMC. 1584. It is possible to put a PSU image and MANIFEST in the built-in OpenBMC image 159 in BMC's read-only filesystem defined by `IMG_DIR_BUILTIN`. When the service 160 starts, it will compare the versions of the built-in image and the existing 161 PSUs. If there is any PSU that has older firmware, it will be updated to the 162 new firmware. 163 164[1]: https://github.com/openbmc/docs/blob/master/testing/local-ci-build.md 165[2]: 166 https://github.com/openbmc/docs/blob/master/cheatsheet.md#building-the-openbmc-sdk 167[3]: https://github.com/openbmc/phosphor-power/tree/master/tools/power-utils 168[4]: 169 https://github.com/openbmc/phosphor-psu-code-mgmt/blob/master/tools/generate-psu-tar 170[5]: 171 https://github.com/openbmc/docs/blob/master/architecture/code-update/code-update.md 172