Utility functions for download firmware

Added set of utility functions to be used within the classes for
managing the PSU firmware updates. Here is a breakdown of the key
functions:

- getDevicePath():
  Construct the PSU device path using I2C bus and address.

- getClassInstance():
  Determines the appropriate updater class to use based on PSU model
  number.

- getFWFilenamePath():
  Searches a directory for a firmware file matching a specified prefix
  and file extension (.bin or .hex).

- calculateCRC8():
  Computes the CRC-8 checksum for transferred data.

- delay():
  Pauses execution for a specified number of milliseconds.

- bigEndianToLittleEndian():
  Converts a 32-bit value from big-endian to little-endian.

- validateFWFile():
  Checks if a firmware file exists and is non-empty.

- openFirmwareFile():
  Opens a firmware file in binary mode, returning a file stream if
  successful.

- readFirmwareBytes():
  Reads specified number of data bytes from a firmware file into a
  buffer. Return data read or null to the caller.

- usePsuJsonFile():
  Wrapper to check the existence of the PSU JSON file.

- Class accessors to private data:
  getPsuInventoryPath(): Accessor for PSU inventory path.
  getDevPath(): Accessor for device path.
  getDevName(): Accessor for device name.
  getImageDir(): Accessor for image directory.
  getI2C(): I2C interface accessor.

Tested every function manually:

- getDevicePath() (using busctl):
  - Validate I2C bus and address values through psuInventoryPath
    validate expected result
  - Modified psuInventoryPath to invalid path
    validate returned invalid path.

- getClassInstance():
  - Validate with matching model number the function instantiate
    appropriate class.
  - Validate the default class instantiated.

- getFWFilenamePath():
  - Validate return of the correct file name in the PSU FW directory
  - Validate null returns when FW files don't exist

- calculaterCRC8():
  - Validate single byte 0x0 result 0x0, single byte 0x01 result 0x07

- delay():
  - Verified the task suspend execution.

- bigEndianToLittleEndian():
  - Verified input 0x12345678 resulted in 0x78563412

- validateFWFile():
  - Validate the existence of the file otherwise an error is logged
  - Validate the file size is greater than 0 otherwise an error is
    logged.

- openFirmwareFile():
  - Validate ifstream object is returned and was able to read from.
  - Validate error logged if the file name is null
  - validate error logged when unable to open the file

- readFirmwareBytes():
  - Validate data read from FW file
  - Validate number of bytes read.

- usePsuJsonFile():
  - Added JSON file to simulator and validated true return.

Change-Id: I0b8b24ae7d37724dab608d2c4977c1b42d4e1632
Signed-off-by: Faisal Awada <faisal@us.ibm.com>
5 files changed
tree: f7075cd349275e4e343077f9554e552e43649043
  1. cold-redundancy/
  2. example/
  3. org/
  4. phosphor-power-sequencer/
  5. phosphor-power-supply/
  6. phosphor-regulators/
  7. power-sequencer/
  8. power-supply/
  9. services/
  10. subprojects/
  11. test/
  12. tools/
  13. .clang-format
  14. .gitignore
  15. .shellcheck
  16. compatible_system_types_finder.cpp
  17. compatible_system_types_finder.hpp
  18. dbus_interfaces_finder.cpp
  19. dbus_interfaces_finder.hpp
  20. device.hpp
  21. device_monitor.hpp
  22. elog-errors.hpp
  23. file_descriptor.hpp
  24. format_utils.hpp
  25. gpio.cpp
  26. gpio.hpp
  27. LICENSE
  28. meson.build
  29. meson.options
  30. names_values.hpp
  31. OWNERS
  32. pmbus.cpp
  33. pmbus.hpp
  34. README.md
  35. temporary_file.cpp
  36. temporary_file.hpp
  37. temporary_subdirectory.cpp
  38. temporary_subdirectory.hpp
  39. types.hpp
  40. utility.cpp
  41. utility.hpp
README.md

phosphor-power

Overview

This repository contains applications for configuring and monitoring devices that deliver power to the system.

Actively-maintained applications:

  • cold-redundancy: Application that makes power supplies work in Cold Redundancy mode and rotates them at intervals.
  • phosphor-power-sequencer: JSON-driven application that powers the chassis on/off and monitors the power sequencer device.
  • phosphor-power-supply: Next generation power supply monitoring application.
  • phosphor-regulators: JSON-driven application that configures and monitors voltage regulators.
  • tools/power-utils: Power supply utilities.

Legacy applications:

  • power-sequencer: Original power sequencer monitoring application.
  • power-supply: Original power supply monitoring application.

Build

To build all applications in this repository:

  meson setup build
  ninja -C build

To clean the repository and remove all build output:

  rm -rf build

You can specify meson options to customize the build process. For example, you can specify:

  • Which applications to build and install.
  • Application-specific configuration data, such as power sequencer type.
  • Whether to build tests.

Power Supply Monitor and Util JSON config

Several applications in this repository require a PSU JSON config to run. The JSON config file provides information for:

  • Where to access the pmbus attributes
  • Which attribute file in pmbus maps to which property and interface in D-Bus
  • Which kernel device directory is used on which PSU

There is an example psu.json to describe the necessary configurations.

  • inventoryPMBusAccessType defines the pmbus access type, which tells the service which sysfs type to use to read the attributes. The possible values are:

    • Base: The base dir, e.g. /sys/bus/i2c/devices/3-0069/
    • Hwmon: The hwmon dir, e.g. /sys/bus/i2c/devices/3-0069/hwmon/hwmonX/
    • Debug: The pmbus debug dir, e.g. /sys/kernel/debug/pmbus/hwmonX/
    • DeviceDebug: The device debug dir, e.g. /sys/kernel/debug/<driver>.<instance>/
    • HwmonDeviceDebug: The hwmon device debug dir, e.g. /sys/kernel/debug/pmbus/hwmonX/cffps1/
  • fruConfigs defines the mapping between the attribute file and the FRU inventory interface and property. The configuration example below indicates that the service will read part_number attribute file from a directory specified by the above pmbus access type, and assign to PartNumber property in xyz.openbmc_project.Inventory.Decorator.Asset interface.

      "fruConfigs": [
        {
          "propertyName": "PartNumber",
          "fileName": "part_number",
          "interface": "xyz.openbmc_project.Inventory.Decorator.Asset"
        }
      ]
    
  • psuDevices defines the kernel device dir for each PSU in inventory. The configuration example below indicates that powersupply0's device is located in /sys/bus/i2c/devices/3-0069.

      "psuDevices": {
        "/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0" : "/sys/bus/i2c/devices/3-0069",
      }