#pragma once #include "fru_identity.hpp" #include "mru.hpp" #include "pce_identity.hpp" #include "pel_types.hpp" #include "stream.hpp" namespace openpower { namespace pels { namespace src { /** * @class Callout * * Represents a single FRU callout in the SRC's FRU callout * subsection. * * The 'Callouts' class holds a list of these objects. * * The callout priority and location code are in this structure. * * There can also be up to one each of three types of substructures * in a single callout: * * FRU Identity (must be first if present) * * Power Controlling Enclosure (PCE) * * Manufacturing Replaceable Unit (MRU) * * These substructures have their own objects managed by unique_ptrs * which will only be allocated if those substructures exist. */ class Callout { public: /** * @brief Which callout substructures are included. */ enum calloutFlags { calloutType = 0b0010'0000, fruIdentIncluded = 0b0000'1000, mruIncluded = 0b0000'0100 // Leaving out the various PCE identity ones since // we don't use them. }; Callout() = delete; ~Callout() = default; Callout(const Callout&) = delete; Callout& operator=(const Callout&) = delete; Callout(Callout&&) = delete; Callout& operator=(Callout&&) = delete; /** * @brief Constructor * * Fills in this class's data fields from the stream. * * @param[in] pel - the PEL data stream */ explicit Callout(Stream& pel); /** * @brief Constructor * * Creates the objects with a FRUIdentity substructure that calls * out a normal hardware FRU. * * @param[in] priority - The priority of the callout * @param[in] locationCode - The location code of the callout * @param[in] partNumber - The part number of the callout * @param[in] ccin - The CCIN of the callout * @param[in] serialNumber - The serial number of the callout */ Callout(CalloutPriority priority, const std::string& locationCode, const std::string& partNumber, const std::string& ccin, const std::string& serialNumber); /** * @brief Constructor * * Creates the objects with a FRUIdentity substructure that calls * out a normal hardware FRU, and takes a list of MRUs that will * be added to the callout. * * @param[in] priority - The priority of the callout * @param[in] locationCode - The location code of the callout * @param[in] partNumber - The part number of the callout * @param[in] ccin - The CCIN of the callout * @param[in] serialNumber - The serial number of the callout * @param[in] mrus - The MRUs, if any, to add to the callout */ Callout(CalloutPriority priority, const std::string& locationCode, const std::string& partNumber, const std::string& ccin, const std::string& serialNumber, const std::vector& mrus); /** * @brief Constructor * * Creates the objects with a FRUIdentity substructure that calls * out a maintenance procedure. * * @param[in] priority - The priority of the callout * @param[in] procedure - The maintenance procedure name * @param[in] type - If the procedure is the raw name or the registry name */ Callout(CalloutPriority priority, const std::string& procedure, CalloutValueType type); /** * @brief Constructor * * Creates the objects with a FRUIdentity substructure that calls * out a maintenance procedure. * * @param[in] priority - The priority of the callout * @param[in] procedureFromRegistry - The maintenance procedure name * as defined in the message registry. */ Callout(CalloutPriority priority, const std::string& procedureFromRegistry) : Callout(priority, procedureFromRegistry, CalloutValueType::registryName) { } /** * @brief Constructor * * Creates the objects with a FRUIdentity substructure that calls * out a symbolic FRU. * * @param[in] priority - The priority of the callout * @param[in] symbolicFRU - The symbolic FRU name * @param[in] type - If the FRU is the raw name or the registry name * @param[in] locationCode - The location code of the callout * @param[in] trustedLocationCode - If the location is trusted */ Callout(CalloutPriority priority, const std::string& symbolicFRU, CalloutValueType type, const std::string& locationCode, bool trustedLocationCode); /** * @brief Constructor * * Creates the objects with a FRUIdentity substructure that calls * out a symbolic FRU. * * @param[in] priority - The priority of the callout * @param[in] symbolicFRUFromRegistry - The symbolic FRU name as * defined in the message registry. * @param[in] locationCode - The location code of the callout * @param[in] trustedLocationCode - If the location is trusted */ Callout(CalloutPriority priority, const std::string& symbolicFRUFromRegistry, const std::string& locationCode, bool trustedLocationCode) : Callout(priority, symbolicFRUFromRegistry, CalloutValueType::registryName, locationCode, trustedLocationCode) { } /** * @brief Returns the size of this object when flattened into a PEL * * @return size_t - The size of the section */ size_t flattenedSize() const; /** * @brief Flatten the object into the stream * * @param[in] stream - The stream to write to */ void flatten(Stream& pel) const; /** * @brief Returns the flags field of a callout * * @return uint8_t - The flags */ uint8_t flags() const { return _flags; } /** * @brief Returns the priority field of a callout * * @return uint8_t - The priority */ uint8_t priority() const { return _priority; } /** * @brief Returns the location code of the callout * * @return std::string - The location code */ std::string locationCode() const { std::string lc; if (!_locationCode.empty()) { // NULL terminated lc = static_cast(_locationCode.data()); } return lc; } /** * @brief Returns the location code size * * @return size_t - The size, including the terminating null. */ size_t locationCodeSize() const { return _locationCodeSize; } /** * @brief Returns the FRU identity substructure * * @return const std::unique_ptr& */ const std::unique_ptr& fruIdentity() const { return _fruIdentity; } /** * @brief Returns the PCE identity substructure * * @return const std::unique_ptr& */ const std::unique_ptr& pceIdentity() const { return _pceIdentity; } /** * @brief Returns the MRU identity substructure * * @return const std::unique_ptr& */ const std::unique_ptr& mru() const { return _mru; } private: /** * @brief Sets the location code field * * @param[in] locationCode - The location code string */ void setLocationCode(const std::string& locationCode); /** * @brief The size of this structure in the PEL */ uint8_t _size; /** * @brief The flags byte of this structure */ uint8_t _flags; /** * @brief The replacement priority */ uint8_t _priority; /** * @brief The length of the location code field. * * Includes the NULL termination, and must be a * multiple of 4 (padded with zeros) */ uint8_t _locationCodeSize = 0; /** * @brief NULL terminated location code * * Includes the NULL termination, and must be a * multiple of 4 (padded with zeros) */ std::vector _locationCode; /** * @brief FRU (Field Replaceable Unit) Identity substructure */ std::unique_ptr _fruIdentity; /** * @brief PCE (Power Controlling Enclosure) Identity substructure */ std::unique_ptr _pceIdentity; /** * @brief MRU (Manufacturing Replaceable Unit) substructure */ std::unique_ptr _mru; }; } // namespace src } // namespace pels } // namespace openpower