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