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