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