blob: 85c20bf1d203d22187c5fad06c5893392ffe8fdf [file] [log] [blame]
Matt Spinlerf02daec2017-08-14 14:00:46 -05001#pragma once
2
Matt Spinlerf0f02b92018-10-25 16:12:43 -05003#include "device.hpp"
4#include "device_monitor.hpp"
5
Matt Spinlerf02daec2017-08-14 14:00:46 -05006#include <sdbusplus/bus.hpp>
7#include <sdbusplus/server.hpp>
William A. Kennington IIIe5a8b472018-10-18 00:40:04 -07008#include <sdeventplus/event.hpp>
Matt Spinlerf02daec2017-08-14 14:00:46 -05009
Lei YUab093322019-10-09 16:43:22 +080010namespace phosphor
Matt Spinlerf02daec2017-08-14 14:00:46 -050011{
12namespace power
13{
14
15/**
16 * @class PGOODMonitor
17 *
Matt Spinlerb2d72512017-08-22 09:07:01 -050018 * Monitors PGOOD and checks for errors on the power sequencer
19 * if it doesn't come on in time.
Matt Spinlerf02daec2017-08-14 14:00:46 -050020 *
21 * The run() function is designed to be called right after the
22 * power sequencer device is told to kick off a power on.
23 *
24 * Future commits will analyze the power sequencer chip for errors
25 * on a PGOOD fail.
26 */
Matt Spinlerb2d72512017-08-22 09:07:01 -050027class PGOODMonitor : public DeviceMonitor
Matt Spinlerf02daec2017-08-14 14:00:46 -050028{
Matt Spinlerf0f02b92018-10-25 16:12:43 -050029 public:
30 PGOODMonitor() = delete;
31 ~PGOODMonitor() = default;
32 PGOODMonitor(const PGOODMonitor&) = delete;
33 PGOODMonitor& operator=(const PGOODMonitor&) = delete;
34 PGOODMonitor(PGOODMonitor&&) = delete;
35 PGOODMonitor& operator=(PGOODMonitor&&) = delete;
Matt Spinlerf02daec2017-08-14 14:00:46 -050036
Matt Spinlerf0f02b92018-10-25 16:12:43 -050037 /**
38 * Constructor
39 *
40 * @param[in] d - the device to monitor
41 * @param[in] b - D-Bus bus object
42 * @param[in] e - event object
43 * @param[in] t - time to allow PGOOD to come up
44 */
Lei YUab093322019-10-09 16:43:22 +080045 PGOODMonitor(std::unique_ptr<phosphor::power::Device>&& d,
Patrick Williams7354ce62022-07-22 19:26:56 -050046 sdbusplus::bus_t& b, const sdeventplus::Event& e,
Matt Spinlerf0f02b92018-10-25 16:12:43 -050047 std::chrono::milliseconds& t) :
48 DeviceMonitor(std::move(d), e, t),
49 bus(b)
Adriana Kobylak0c9a33d2021-09-13 18:05:09 +000050 {}
Matt Spinlerf02daec2017-08-14 14:00:46 -050051
Matt Spinlerf0f02b92018-10-25 16:12:43 -050052 /**
53 * Analyzes the power sequencer for fails and then
54 * notifies the event loop that it can exit.
55 *
56 * The timer callback.
57 */
58 void analyze() override;
Matt Spinlerf02daec2017-08-14 14:00:46 -050059
Matt Spinlerf0f02b92018-10-25 16:12:43 -050060 /**
61 * Waits a specified amount of time for PGOOD to
62 * come on, and if it fails to come on in that time
63 * it will analyze the power sequencer for faults.
64 *
65 * It will exit after either PGOOD is asserted or
66 * the device is analyzed for faults.
67 *
68 * @return - the return value from sd_event_loop()
69 */
70 int run() override;
Matt Spinlerf02daec2017-08-14 14:00:46 -050071
Matt Spinlerf0f02b92018-10-25 16:12:43 -050072 private:
73 /**
74 * Enables the properties changed signal callback
75 * on the power object so we can tell when PGOOD
76 * comes on.
77 */
78 void startListening();
Matt Spinlerf02daec2017-08-14 14:00:46 -050079
Matt Spinlerf0f02b92018-10-25 16:12:43 -050080 /**
81 * The callback function for the properties changed
82 * signal.
83 */
84 void propertyChanged();
Matt Spinlerf02daec2017-08-14 14:00:46 -050085
Matt Spinlerf0f02b92018-10-25 16:12:43 -050086 /**
87 * Returns true if the system has been turned on
88 * but PGOOD isn't up yet.
89 */
90 bool pgoodPending();
Matt Spinlerf02daec2017-08-14 14:00:46 -050091
Matt Spinlerf0f02b92018-10-25 16:12:43 -050092 /**
93 * Used to break out of the event loop in run()
94 */
95 void exitEventLoop();
Matt Spinlerf02daec2017-08-14 14:00:46 -050096
Matt Spinlerf0f02b92018-10-25 16:12:43 -050097 /**
98 * The D-Bus object
99 */
Patrick Williams7354ce62022-07-22 19:26:56 -0500100 sdbusplus::bus_t& bus;
Matt Spinlerf02daec2017-08-14 14:00:46 -0500101
Matt Spinlerf0f02b92018-10-25 16:12:43 -0500102 /**
103 * The match object for the properties changed signal
104 */
105 std::unique_ptr<sdbusplus::bus::match_t> match;
Matt Spinlerf02daec2017-08-14 14:00:46 -0500106};
107
Matt Spinlerf0f02b92018-10-25 16:12:43 -0500108} // namespace power
Lei YUab093322019-10-09 16:43:22 +0800109} // namespace phosphor