xref: /openbmc/openpower-vpd-parser/vpd-manager/include/gpio_monitor.hpp (revision fa5e4d325ef9cea3c841fe89d202c340f92bd8c6)
1*fa5e4d32SSunny Srivastava #pragma once
2*fa5e4d32SSunny Srivastava 
3*fa5e4d32SSunny Srivastava #include "worker.hpp"
4*fa5e4d32SSunny Srivastava 
5*fa5e4d32SSunny Srivastava #include <boost/asio/steady_timer.hpp>
6*fa5e4d32SSunny Srivastava #include <nlohmann/json.hpp>
7*fa5e4d32SSunny Srivastava #include <sdbusplus/asio/connection.hpp>
8*fa5e4d32SSunny Srivastava 
9*fa5e4d32SSunny Srivastava #include <vector>
10*fa5e4d32SSunny Srivastava 
11*fa5e4d32SSunny Srivastava namespace vpd
12*fa5e4d32SSunny Srivastava {
13*fa5e4d32SSunny Srivastava /**
14*fa5e4d32SSunny Srivastava  * @brief class for GPIO event handling.
15*fa5e4d32SSunny Srivastava  *
16*fa5e4d32SSunny Srivastava  * Responsible for detecting events and handling them. It continuously
17*fa5e4d32SSunny Srivastava  * monitors the presence of the FRU. If it detects any change, performs
18*fa5e4d32SSunny Srivastava  * deletion of FRU VPD if FRU is not present, otherwise performs VPD
19*fa5e4d32SSunny Srivastava  * collection if FRU gets added.
20*fa5e4d32SSunny Srivastava  */
21*fa5e4d32SSunny Srivastava class GpioEventHandler
22*fa5e4d32SSunny Srivastava {
23*fa5e4d32SSunny Srivastava   public:
24*fa5e4d32SSunny Srivastava     GpioEventHandler() = delete;
25*fa5e4d32SSunny Srivastava     ~GpioEventHandler() = default;
26*fa5e4d32SSunny Srivastava     GpioEventHandler(const GpioEventHandler&) = delete;
27*fa5e4d32SSunny Srivastava     GpioEventHandler& operator=(const GpioEventHandler&) = delete;
28*fa5e4d32SSunny Srivastava     GpioEventHandler(GpioEventHandler&&) = delete;
29*fa5e4d32SSunny Srivastava     GpioEventHandler& operator=(GpioEventHandler&&) = delete;
30*fa5e4d32SSunny Srivastava 
31*fa5e4d32SSunny Srivastava     /**
32*fa5e4d32SSunny Srivastava      * @brief Constructor
33*fa5e4d32SSunny Srivastava      *
34*fa5e4d32SSunny Srivastava      * @param[in] i_fruPath - EEPROM path of the FRU.
35*fa5e4d32SSunny Srivastava      * @param[in] i_worker - pointer to the worker object.
36*fa5e4d32SSunny Srivastava      * @param[in] i_ioContext - pointer to the io context object
37*fa5e4d32SSunny Srivastava      */
GpioEventHandler(const std::string i_fruPath,const std::shared_ptr<Worker> & i_worker,const std::shared_ptr<boost::asio::io_context> & i_ioContext)38*fa5e4d32SSunny Srivastava     GpioEventHandler(
39*fa5e4d32SSunny Srivastava         const std::string i_fruPath, const std::shared_ptr<Worker>& i_worker,
40*fa5e4d32SSunny Srivastava         const std::shared_ptr<boost::asio::io_context>& i_ioContext) :
41*fa5e4d32SSunny Srivastava         m_fruPath(i_fruPath), m_worker(i_worker)
42*fa5e4d32SSunny Srivastava     {
43*fa5e4d32SSunny Srivastava         setEventHandlerForGpioPresence(i_ioContext);
44*fa5e4d32SSunny Srivastava     }
45*fa5e4d32SSunny Srivastava 
46*fa5e4d32SSunny Srivastava   private:
47*fa5e4d32SSunny Srivastava     /**
48*fa5e4d32SSunny Srivastava      * @brief API to take action based on GPIO presence pin value.
49*fa5e4d32SSunny Srivastava      *
50*fa5e4d32SSunny Srivastava      * This API takes action based on the change in the presence pin value.
51*fa5e4d32SSunny Srivastava      * It performs deletion of FRU VPD if FRU is not present, otherwise performs
52*fa5e4d32SSunny Srivastava      * VPD collection if FRU gets added.
53*fa5e4d32SSunny Srivastava      *
54*fa5e4d32SSunny Srivastava      * @param[in] i_isFruPresent - Holds the present status of the FRU.
55*fa5e4d32SSunny Srivastava      */
56*fa5e4d32SSunny Srivastava     void handleChangeInGpioPin(const bool& i_isFruPresent);
57*fa5e4d32SSunny Srivastava 
58*fa5e4d32SSunny Srivastava     /**
59*fa5e4d32SSunny Srivastava      * @brief An API to set event handler for FRUs GPIO presence.
60*fa5e4d32SSunny Srivastava      *
61*fa5e4d32SSunny Srivastava      * An API to set timer to call event handler to detect GPIO presence
62*fa5e4d32SSunny Srivastava      * of the FRU.
63*fa5e4d32SSunny Srivastava      *
64*fa5e4d32SSunny Srivastava      * @param[in] i_ioContext - pointer to io context object
65*fa5e4d32SSunny Srivastava      */
66*fa5e4d32SSunny Srivastava     void setEventHandlerForGpioPresence(
67*fa5e4d32SSunny Srivastava         const std::shared_ptr<boost::asio::io_context>& i_ioContext);
68*fa5e4d32SSunny Srivastava 
69*fa5e4d32SSunny Srivastava     /**
70*fa5e4d32SSunny Srivastava      * @brief API to handle timer expiry.
71*fa5e4d32SSunny Srivastava      *
72*fa5e4d32SSunny Srivastava      * This API handles timer expiry and checks on the GPIO presence state,
73*fa5e4d32SSunny Srivastava      * takes action if there is any change in the GPIO presence value.
74*fa5e4d32SSunny Srivastava      *
75*fa5e4d32SSunny Srivastava      * @param[in] i_errorCode - Error Code
76*fa5e4d32SSunny Srivastava      * @param[in] i_timerObj - Pointer to timer Object.
77*fa5e4d32SSunny Srivastava      */
78*fa5e4d32SSunny Srivastava     void handleTimerExpiry(
79*fa5e4d32SSunny Srivastava         const boost::system::error_code& i_errorCode,
80*fa5e4d32SSunny Srivastava         const std::shared_ptr<boost::asio::steady_timer>& i_timerObj);
81*fa5e4d32SSunny Srivastava 
82*fa5e4d32SSunny Srivastava     const std::string m_fruPath;
83*fa5e4d32SSunny Srivastava 
84*fa5e4d32SSunny Srivastava     const std::shared_ptr<Worker>& m_worker;
85*fa5e4d32SSunny Srivastava 
86*fa5e4d32SSunny Srivastava     // Preserves the GPIO pin value to compare. Default value is false.
87*fa5e4d32SSunny Srivastava     bool m_prevPresencePinValue = false;
88*fa5e4d32SSunny Srivastava };
89*fa5e4d32SSunny Srivastava 
90*fa5e4d32SSunny Srivastava class GpioMonitor
91*fa5e4d32SSunny Srivastava {
92*fa5e4d32SSunny Srivastava   public:
93*fa5e4d32SSunny Srivastava     GpioMonitor() = delete;
94*fa5e4d32SSunny Srivastava     ~GpioMonitor() = default;
95*fa5e4d32SSunny Srivastava     GpioMonitor(const GpioMonitor&) = delete;
96*fa5e4d32SSunny Srivastava     GpioMonitor& operator=(const GpioMonitor&) = delete;
97*fa5e4d32SSunny Srivastava     GpioMonitor(GpioMonitor&&) = delete;
98*fa5e4d32SSunny Srivastava     GpioMonitor& operator=(GpioMonitor&&) = delete;
99*fa5e4d32SSunny Srivastava 
100*fa5e4d32SSunny Srivastava     /**
101*fa5e4d32SSunny Srivastava      * @brief constructor
102*fa5e4d32SSunny Srivastava      *
103*fa5e4d32SSunny Srivastava      * @param[in] i_sysCfgJsonObj - System config JSON Object.
104*fa5e4d32SSunny Srivastava      * @param[in] i_worker - pointer to the worker object.
105*fa5e4d32SSunny Srivastava      * @param[in] i_ioContext - pointer to IO context object.
106*fa5e4d32SSunny Srivastava      */
GpioMonitor(const nlohmann::json i_sysCfgJsonObj,const std::shared_ptr<Worker> & i_worker,const std::shared_ptr<boost::asio::io_context> & i_ioContext)107*fa5e4d32SSunny Srivastava     GpioMonitor(const nlohmann::json i_sysCfgJsonObj,
108*fa5e4d32SSunny Srivastava                 const std::shared_ptr<Worker>& i_worker,
109*fa5e4d32SSunny Srivastava                 const std::shared_ptr<boost::asio::io_context>& i_ioContext) :
110*fa5e4d32SSunny Srivastava         m_sysCfgJsonObj(i_sysCfgJsonObj)
111*fa5e4d32SSunny Srivastava     {
112*fa5e4d32SSunny Srivastava         if (!m_sysCfgJsonObj.empty())
113*fa5e4d32SSunny Srivastava         {
114*fa5e4d32SSunny Srivastava             initHandlerForGpio(i_ioContext, i_worker);
115*fa5e4d32SSunny Srivastava         }
116*fa5e4d32SSunny Srivastava         else
117*fa5e4d32SSunny Srivastava         {
118*fa5e4d32SSunny Srivastava             throw std::runtime_error(
119*fa5e4d32SSunny Srivastava                 "Gpio Monitoring can't be instantiated with empty config JSON");
120*fa5e4d32SSunny Srivastava         }
121*fa5e4d32SSunny Srivastava     }
122*fa5e4d32SSunny Srivastava 
123*fa5e4d32SSunny Srivastava   private:
124*fa5e4d32SSunny Srivastava     /**
125*fa5e4d32SSunny Srivastava      * @brief API to instantiate GpioEventHandler for GPIO pins.
126*fa5e4d32SSunny Srivastava      *
127*fa5e4d32SSunny Srivastava      * This API will extract the GPIO information from system config JSON
128*fa5e4d32SSunny Srivastava      * and instantiate event handler for GPIO pins.
129*fa5e4d32SSunny Srivastava      *
130*fa5e4d32SSunny Srivastava      * @param[in] i_ioContext - Pointer to IO context object.
131*fa5e4d32SSunny Srivastava      * @param[in] i_worker - Pointer to worker class.
132*fa5e4d32SSunny Srivastava      */
133*fa5e4d32SSunny Srivastava     void initHandlerForGpio(
134*fa5e4d32SSunny Srivastava         const std::shared_ptr<boost::asio::io_context>& i_ioContext,
135*fa5e4d32SSunny Srivastava         const std::shared_ptr<Worker>& i_worker);
136*fa5e4d32SSunny Srivastava 
137*fa5e4d32SSunny Srivastava     // Array of event handlers for all the attachable FRUs.
138*fa5e4d32SSunny Srivastava     std::vector<std::shared_ptr<GpioEventHandler>> m_gpioEventHandlerObjects;
139*fa5e4d32SSunny Srivastava 
140*fa5e4d32SSunny Srivastava     const nlohmann::json& m_sysCfgJsonObj;
141*fa5e4d32SSunny Srivastava };
142*fa5e4d32SSunny Srivastava } // namespace vpd
143