blob: 9cbda60f64da839ed29612551d5727f47f108722 [file] [log] [blame]
Matt Spinlerf02daec2017-08-14 14:00:46 -05001#pragma once
2
3#include <sdbusplus/bus.hpp>
4#include <sdbusplus/server.hpp>
Matt Spinlerb2d72512017-08-22 09:07:01 -05005#include "device.hpp"
Matt Spinlerf02daec2017-08-14 14:00:46 -05006#include "event.hpp"
Matt Spinlerb2d72512017-08-22 09:07:01 -05007#include "device_monitor.hpp"
Matt Spinlerf02daec2017-08-14 14:00:46 -05008#include "timer.hpp"
9
10namespace witherspoon
11{
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{
29 public:
30
31 PGOODMonitor() = delete;
32 ~PGOODMonitor() = default;
33 PGOODMonitor(const PGOODMonitor&) = delete;
34 PGOODMonitor& operator=(const PGOODMonitor&) = delete;
35 PGOODMonitor(PGOODMonitor&&) = delete;
36 PGOODMonitor& operator=(PGOODMonitor&&) = delete;
37
38 /**
39 * Constructor
40 *
Matt Spinlerb2d72512017-08-22 09:07:01 -050041 * @param[in] d - the device to monitor
Matt Spinlerf02daec2017-08-14 14:00:46 -050042 * @param[in] b - D-Bus bus object
43 * @param[in] e - event object
44 * @param[in] t - time to allow PGOOD to come up
45 */
Matt Spinlerb2d72512017-08-22 09:07:01 -050046 PGOODMonitor(std::unique_ptr<witherspoon::power::Device>&& d,
47 sdbusplus::bus::bus& b,
48 witherspoon::power::event::Event& e,
Matt Spinler78c5c2b2017-12-14 10:42:07 -060049 std::chrono::milliseconds& t) :
Matt Spinlerb2d72512017-08-22 09:07:01 -050050 DeviceMonitor(std::move(d), e, t),
51 bus(b)
52 {
53 }
Matt Spinlerf02daec2017-08-14 14:00:46 -050054
55 /**
Matt Spinlerb2d72512017-08-22 09:07:01 -050056 * Analyzes the power sequencer for fails and then
57 * notifies the event loop that it can exit.
Matt Spinlerf02daec2017-08-14 14:00:46 -050058 *
Matt Spinlerb2d72512017-08-22 09:07:01 -050059 * The timer callback.
Matt Spinlerf02daec2017-08-14 14:00:46 -050060 */
Matt Spinlerb2d72512017-08-22 09:07:01 -050061 void analyze() override;
Matt Spinlerf02daec2017-08-14 14:00:46 -050062
63 /**
64 * Waits a specified amount of time for PGOOD to
65 * come on, and if it fails to come on in that time
Matt Spinlerb2d72512017-08-22 09:07:01 -050066 * it will analyze the power sequencer for faults.
67 *
68 * It will exit after either PGOOD is asserted or
69 * the device is analyzed for faults.
Matt Spinlerf02daec2017-08-14 14:00:46 -050070 *
71 * @return - the return value from sd_event_loop()
72 */
Matt Spinlerb2d72512017-08-22 09:07:01 -050073 int run() override;
Matt Spinlerf02daec2017-08-14 14:00:46 -050074
75 private:
76
77 /**
78 * Enables the properties changed signal callback
79 * on the power object so we can tell when PGOOD
80 * comes on.
81 */
82 void startListening();
83
84 /**
85 * The callback function for the properties changed
86 * signal.
87 */
88 void propertyChanged();
89
90 /**
91 * Returns true if the system has been turned on
92 * but PGOOD isn't up yet.
93 */
94 bool pgoodPending();
95
96 /**
97 * Used to break out of the event loop in run()
98 */
99 void exitEventLoop();
100
101 /**
102 * The D-Bus object
103 */
104 sdbusplus::bus::bus& bus;
105
106 /**
107 * The match object for the properties changed signal
108 */
109 std::unique_ptr<sdbusplus::bus::match_t> match;
Matt Spinlerf02daec2017-08-14 14:00:46 -0500110};
111
112}
113}