xref: /openbmc/phosphor-logging/extensions/openpower-pels/host_notifier.hpp (revision f60ac27e3ee4aa7166065db93a3fc0ae2d9481ac)
1*f60ac27eSMatt Spinler #pragma once
2*f60ac27eSMatt Spinler 
3*f60ac27eSMatt Spinler #include "host_interface.hpp"
4*f60ac27eSMatt Spinler #include "pel.hpp"
5*f60ac27eSMatt Spinler #include "repository.hpp"
6*f60ac27eSMatt Spinler 
7*f60ac27eSMatt Spinler #include <deque>
8*f60ac27eSMatt Spinler 
9*f60ac27eSMatt Spinler namespace openpower::pels
10*f60ac27eSMatt Spinler {
11*f60ac27eSMatt Spinler 
12*f60ac27eSMatt Spinler /**
13*f60ac27eSMatt Spinler  * @class HostNotifier
14*f60ac27eSMatt Spinler  *
15*f60ac27eSMatt Spinler  * This class handles notifying the host firmware of new PELs.
16*f60ac27eSMatt Spinler  */
17*f60ac27eSMatt Spinler class HostNotifier
18*f60ac27eSMatt Spinler {
19*f60ac27eSMatt Spinler   public:
20*f60ac27eSMatt Spinler     HostNotifier() = delete;
21*f60ac27eSMatt Spinler     HostNotifier(const HostNotifier&) = delete;
22*f60ac27eSMatt Spinler     HostNotifier& operator=(const HostNotifier&) = delete;
23*f60ac27eSMatt Spinler     HostNotifier(HostNotifier&&) = delete;
24*f60ac27eSMatt Spinler     HostNotifier& operator=(HostNotifier&&) = delete;
25*f60ac27eSMatt Spinler 
26*f60ac27eSMatt Spinler     /**
27*f60ac27eSMatt Spinler      * @brief Constructor
28*f60ac27eSMatt Spinler      *
29*f60ac27eSMatt Spinler      * @param[in] repo - The PEL repository object
30*f60ac27eSMatt Spinler      * @param[in] dataIface - The data interface object
31*f60ac27eSMatt Spinler      * @param[in] hostIface - The host interface object
32*f60ac27eSMatt Spinler      */
33*f60ac27eSMatt Spinler     HostNotifier(Repository& repo, DataInterfaceBase& dataIface,
34*f60ac27eSMatt Spinler                  std::unique_ptr<HostInterface> hostIface);
35*f60ac27eSMatt Spinler 
36*f60ac27eSMatt Spinler     /**
37*f60ac27eSMatt Spinler      * @brief Destructor
38*f60ac27eSMatt Spinler      */
39*f60ac27eSMatt Spinler     ~HostNotifier();
40*f60ac27eSMatt Spinler 
41*f60ac27eSMatt Spinler     /**
42*f60ac27eSMatt Spinler      * @brief Returns the PEL queue size.
43*f60ac27eSMatt Spinler      *
44*f60ac27eSMatt Spinler      * For testing.
45*f60ac27eSMatt Spinler      *
46*f60ac27eSMatt Spinler      * @return size_t - The queue size
47*f60ac27eSMatt Spinler      */
48*f60ac27eSMatt Spinler     size_t queueSize() const
49*f60ac27eSMatt Spinler     {
50*f60ac27eSMatt Spinler         return _pelQueue.size();
51*f60ac27eSMatt Spinler     }
52*f60ac27eSMatt Spinler 
53*f60ac27eSMatt Spinler     /**
54*f60ac27eSMatt Spinler      * @brief Specifies if the PEL needs to go onto the queue to be
55*f60ac27eSMatt Spinler      *        set to the host.
56*f60ac27eSMatt Spinler      *
57*f60ac27eSMatt Spinler      * @param[in] id - The PEL ID
58*f60ac27eSMatt Spinler      *
59*f60ac27eSMatt Spinler      * @return bool - If enqueue is required
60*f60ac27eSMatt Spinler      */
61*f60ac27eSMatt Spinler     bool enqueueRequired(uint32_t id) const;
62*f60ac27eSMatt Spinler 
63*f60ac27eSMatt Spinler   private:
64*f60ac27eSMatt Spinler     /**
65*f60ac27eSMatt Spinler      * @brief This function gets called by the Repository class
66*f60ac27eSMatt Spinler      *        when a new PEL is added to it.
67*f60ac27eSMatt Spinler      *
68*f60ac27eSMatt Spinler      * @param[in] pel - The new PEL
69*f60ac27eSMatt Spinler      */
70*f60ac27eSMatt Spinler     void newLogCallback(const PEL& pel);
71*f60ac27eSMatt Spinler 
72*f60ac27eSMatt Spinler     /**
73*f60ac27eSMatt Spinler      * @brief This function runs on every existing PEL at startup
74*f60ac27eSMatt Spinler      *        and puts the PEL on the queue to send if necessary.
75*f60ac27eSMatt Spinler      *
76*f60ac27eSMatt Spinler      * @param[in] pel - The PEL
77*f60ac27eSMatt Spinler      *
78*f60ac27eSMatt Spinler      * @return bool - This is an indicator to the Repository::for_each
79*f60ac27eSMatt Spinler      *                function to traverse every PEL.  Always false.
80*f60ac27eSMatt Spinler      */
81*f60ac27eSMatt Spinler     bool addPELToQueue(const PEL& pel);
82*f60ac27eSMatt Spinler 
83*f60ac27eSMatt Spinler     /**
84*f60ac27eSMatt Spinler      * @brief Takes the PEL off the front of the queue and issues
85*f60ac27eSMatt Spinler      *        the PLDM send.
86*f60ac27eSMatt Spinler      */
87*f60ac27eSMatt Spinler     void doNewLogNotify();
88*f60ac27eSMatt Spinler 
89*f60ac27eSMatt Spinler     /**
90*f60ac27eSMatt Spinler      * @brief Called when the host changes state.
91*f60ac27eSMatt Spinler      *
92*f60ac27eSMatt Spinler      * @param[in] hostUp - The new host state
93*f60ac27eSMatt Spinler      */
94*f60ac27eSMatt Spinler     void hostStateChange(bool hostUp);
95*f60ac27eSMatt Spinler 
96*f60ac27eSMatt Spinler     /**
97*f60ac27eSMatt Spinler      * @brief The callback function invoked after the asynchronous
98*f60ac27eSMatt Spinler      *        PLDM receive function is complete.
99*f60ac27eSMatt Spinler      *
100*f60ac27eSMatt Spinler      * @param[in] status - The response status
101*f60ac27eSMatt Spinler      */
102*f60ac27eSMatt Spinler     void commandResponse(ResponseStatus status);
103*f60ac27eSMatt Spinler 
104*f60ac27eSMatt Spinler     /**
105*f60ac27eSMatt Spinler      * @brief The PEL repository object
106*f60ac27eSMatt Spinler      */
107*f60ac27eSMatt Spinler     Repository& _repo;
108*f60ac27eSMatt Spinler 
109*f60ac27eSMatt Spinler     /**
110*f60ac27eSMatt Spinler      * @brief The data interface object
111*f60ac27eSMatt Spinler      */
112*f60ac27eSMatt Spinler     DataInterfaceBase& _dataIface;
113*f60ac27eSMatt Spinler 
114*f60ac27eSMatt Spinler     /**
115*f60ac27eSMatt Spinler      * @brief Base class pointer for the host command interface
116*f60ac27eSMatt Spinler      */
117*f60ac27eSMatt Spinler     std::unique_ptr<HostInterface> _hostIface;
118*f60ac27eSMatt Spinler 
119*f60ac27eSMatt Spinler     /**
120*f60ac27eSMatt Spinler      * @brief The list of PEL IDs that need to be sent.
121*f60ac27eSMatt Spinler      */
122*f60ac27eSMatt Spinler     std::deque<uint32_t> _pelQueue;
123*f60ac27eSMatt Spinler };
124*f60ac27eSMatt Spinler 
125*f60ac27eSMatt Spinler } // namespace openpower::pels
126