psu-ng: Move psu validation to event timer

During a BMC reset at power on, the validation would be performed while
the entity manager interfaces are still being added to D-Bus, therefore
causing an error log created because the information to determine which
power supplies may be present is missing from the configuration
information that entity manager publishes on D-Bus.

Move the validation to be called on a timer, so that every time an EM
interface is added, the timer resets, and the validation is called once
no more interfaces are detected.

Also call the validation through the timer during a power on in case EM
has not started yet (this is less common but still possible). The side
effect is that the validation occurs 2s after it's called during a power
on, but it doesn't delay the power on as it's scheduled through the
timer event.

Tested with debug traces:
- Reboot at power on performs validation after the EM interfaces are
  added and does not log an error.
Oct 05 14:33:52 p10bmc phosphor-psu-monitor[3472]: EM interface added
Oct 05 14:33:52 p10bmc phosphor-psu-monitor[3472]: EM interface added
Oct 05 14:33:53 p10bmc phosphor-psu-monitor[3472]: EM interface added: Start timer
Oct 05 14:33:53 p10bmc phosphor-psu-monitor[3472]: EM interface added
Oct 05 14:33:54 p10bmc phosphor-psu-monitor[3472]: EM interface added
Oct 05 14:33:54 p10bmc phosphor-psu-monitor[3472]: EM interface added: Start timer
Oct 05 14:33:54 p10bmc phosphor-psu-monitor[3472]: EM interface added
Oct 05 14:33:54 p10bmc phosphor-psu-monitor[3472]: EM interface added: Start timer
Oct 05 14:33:56 p10bmc phosphor-psu-monitor[3472]: validateConfig()
Oct 05 14:33:56 p10bmc phosphor-psu-monitor[3472]: validateConfig() validated

- Validation runs when power on is requested.
Oct 05 14:43:31 p10bmc phosphor-host-state-manager[714]: Change to Host State: xyz.openbmc_project.State.Host.HostState.TransitioningToRunning
Oct 05 14:43:31 p10bmc phosphor-psu-monitor[622]: powerOn: Start timer
Oct 05 14:43:33 p10bmc phosphor-psu-monitor[622]: validateConfig
Oct 05 14:43:33 p10bmc phosphor-psu-monitor[622]: validateConfig validated

- Validation runs when the phosphor-psu-monitor service is restarted at
  power on:
Oct 07 15:15:02 p10bmc phosphor-psu-monitor[19762]: initialize(): Start timer
Oct 07 15:15:04 p10bmc phosphor-psu-monitor[19762]: validateConfig
Oct 07 15:15:04 p10bmc phosphor-psu-monitor[19762]: validateConfig validated

Change-Id: I9f788622754604e5feb10cfec1ddc341c04c52a0
Signed-off-by: Adriana Kobylak <anoo@us.ibm.com>
2 files changed
tree: 13b89e2e92f2953c00a64e920142849e13231d4a
  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. test/
  11. tools/
  12. .clang-format
  13. .gitignore
  14. .shellcheck
  15. argument.hpp
  16. device.hpp
  17. device_monitor.hpp
  18. elog-errors.hpp
  19. file_descriptor.hpp
  20. gpio.cpp
  21. gpio.hpp
  22. LICENSE
  23. MAINTAINERS
  24. meson.build
  25. meson_options.txt
  26. names_values.hpp
  27. pmbus.cpp
  28. pmbus.hpp
  29. README.md
  30. types.hpp
  31. utility.cpp
  32. utility.hpp
README.md

Overview

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

  • cold-redundancy: Application that makes power supplies work in Cold Redundancy mode and rotates them at intervals.
  • phosphor-power-sequencer: Applications for configuring and monitoring power sequencer and related devices that support JSON-driven configuration.
  • phosphor-power-supply: Next generation power supply monitoring application.
  • phosphor-regulators: JSON-driven application that configures and monitors voltage regulators.
  • power-sequencer: A power sequencer monitoring application.
  • power-supply: Original power supply monitoring application.
  • tools/power-utils: Power supply utilities.

Build

To build all applications in this repository:

  meson 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/./`
    • 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",
      }