#pragma once #include #include namespace analyzer { namespace callout { /** @brief All callouts will have a priority indicating when to issue the * required service action. */ enum class Priority { /** Serivce is mandatory. */ HIGH, /** Serivce medium priority callouts one at a time, in order, until the * issue is resolved. */ MED, /** Same as MED, except replace all A's as a group. */ MED_A, /** Same as MED, except replace all B's as a group. */ MED_B, /** Same as MED, except replace all C's as a group. */ MED_C, /** If servicing all high and medium priority callouts did not resolve * the issue, service low priority callouts one at a time, in order, * until the issue is resolved. */ LOW, }; /** @return The string representation of the priority used in callouts. */ inline std::string getString(Priority i_priority) { // clang-format off static const std::map m = { {Priority::HIGH, "H"}, {Priority::MED, "M"}, {Priority::MED_A, "A"}, {Priority::MED_B, "B"}, {Priority::MED_C, "C"}, {Priority::LOW, "L"}, }; // clang-format on return m.at(i_priority); } /** @return The string representation of the priority used in The callout FFDC. */ inline std::string getStringFFDC(Priority i_priority) { // clang-format off static const std::map m = { {Priority::HIGH, "high"}, {Priority::MED, "medium"}, {Priority::MED_A, "medium_group_A"}, {Priority::MED_B, "medium_group_B"}, {Priority::MED_C, "medium_group_C"}, {Priority::LOW, "low"}, }; // clang-format on return m.at(i_priority); } /** These SRC subsystem values are defined by the PEL spec. */ enum class SrcSubsystem { // Can also reference `extensions/openpower-pels/pel_values.cpp` from // `openbmc/phosphor-logging` for the full list of these values. PROCESSOR = 0x10, PROCESSOR_FRU = 0x11, PROCESSOR_UNIT = 0x13, PROCESSOR_BUS = 0x14, MEMORY_CTLR = 0x21, MEMORY_BUS = 0x22, MEMORY_DIMM = 0x23, MEMORY_FRU = 0x24, PHB = 0x38, CEC_HARDWARE = 0x50, CEC_CLOCKS = 0x58, CEC_TOD = 0x5A, OTHERS = 0x70, }; /** @brief Container class for procedure callout service actions. */ class Procedure { public: /** Contact next level support. */ static const Procedure NEXTLVL; /** An unrecoverable event occurred, look for previous errors for the * cause. */ static const Procedure SUE_SEEN; private: /** * @brief Constructor from components. * @param i_string The string representation of the procedure used for * callouts. */ Procedure(const std::string& i_string, const SrcSubsystem i_subsystem) : iv_string(i_string), iv_subsystem(i_subsystem) {} private: /** The string representation of the procedure used for callouts. */ const std::string iv_string; /** The associated SRC subsystem of the procedure. */ const SrcSubsystem iv_subsystem; public: /** iv_string accessor */ std::string getString() const { return iv_string; } /** iv_subsystem accessor */ SrcSubsystem getSrcSubsystem() const { return iv_subsystem; } }; inline const Procedure Procedure::NEXTLVL{"next_level_support", SrcSubsystem::OTHERS}; inline const Procedure Procedure::SUE_SEEN{"find_sue_root_cause", SrcSubsystem::OTHERS}; /** @brief Container class for bus callout service actions. */ class BusType { public: /** SMP bus (fabric A or X bus). */ static const BusType SMP_BUS; /** OMI bus (memory bus). */ static const BusType OMI_BUS; private: /** * @brief Constructor from components. * @param i_string The string representation of the procedure used for * callouts. */ BusType(const std::string& i_string, const SrcSubsystem i_subsystem) : iv_string(i_string), iv_subsystem(i_subsystem) {} private: /** The string representation of the procedure used for callouts. */ const std::string iv_string; /** The associated SRC subsystem of the bus. */ const SrcSubsystem iv_subsystem; public: bool operator==(const BusType& r) const { return ((this->iv_string == r.iv_string) && (this->iv_subsystem == r.iv_subsystem)); } /** iv_string accessor */ std::string getString() const { return iv_string; } /** iv_subsystem accessor */ SrcSubsystem getSrcSubsystem() const { return iv_subsystem; } }; inline const BusType BusType::SMP_BUS{"SMP_BUS", SrcSubsystem::PROCESSOR_BUS}; inline const BusType BusType::OMI_BUS{"OMI_BUS", SrcSubsystem::MEMORY_BUS}; /** @brief Container class for clock callout service actions. */ class ClockType { public: /** Oscillator reference clock 0. */ static const ClockType OSC_REF_CLOCK_0; /** Oscillator reference clock 1. */ static const ClockType OSC_REF_CLOCK_1; /** Time of Day (TOD) clock. */ static const ClockType TOD_CLOCK; private: /** * @brief Constructor from components. * @param i_string The string representation of the procedure used for * callouts. */ ClockType(const std::string& i_string, const SrcSubsystem i_subsystem) : iv_string(i_string), iv_subsystem(i_subsystem) {} private: /** The string representation of the procedure used for callouts. */ const std::string iv_string; /** The associated SRC subsystem of the clock. */ const SrcSubsystem iv_subsystem; public: /** iv_string accessor */ std::string getString() const { return iv_string; } /** iv_subsystem accessor */ SrcSubsystem getSrcSubsystem() const { return iv_subsystem; } }; inline const ClockType ClockType::OSC_REF_CLOCK_0{"OSC_REF_CLOCK_0", SrcSubsystem::CEC_CLOCKS}; inline const ClockType ClockType::OSC_REF_CLOCK_1{"OSC_REF_CLOCK_1", SrcSubsystem::CEC_CLOCKS}; inline const ClockType ClockType::TOD_CLOCK{"TOD_CLOCK", SrcSubsystem::CEC_TOD}; /** @brief Container class for part callout service actions. */ class PartType { public: /** The part containing the PNOR. */ static const PartType PNOR; private: /** * @brief Constructor from components. * @param i_string The string representation of the part callout. */ PartType(const std::string& i_string, const SrcSubsystem i_subsystem) : iv_string(i_string), iv_subsystem(i_subsystem) {} private: /** The string representation of the part callout. */ const std::string iv_string; /** The associated SRC subsystem of the part. */ const SrcSubsystem iv_subsystem; public: bool operator==(const PartType& r) const { return ((this->iv_string == r.iv_string) && (this->iv_subsystem == r.iv_subsystem)); } /** iv_string accessor */ std::string getString() const { return iv_string; } /** iv_subsystem accessor */ SrcSubsystem getSrcSubsystem() const { return iv_subsystem; } }; inline const PartType PartType::PNOR{"PNOR", SrcSubsystem::CEC_HARDWARE}; /** @brief Container class for guard service actions. */ class GuardType { public: /** Do not guard. */ static const GuardType NONE; /** Guard on fatal error (cannot recover resource). */ static const GuardType UNRECOVERABLE; /** Guard on non-fatal error (can recover resource). */ static const GuardType PREDICTIVE; private: /** * @brief Constructor from components. * @param i_string The string representation of the procedure used for * callouts. */ explicit GuardType(const std::string& i_string) : iv_string(i_string) {} private: /** The string representation of the procedure used for callouts. */ const std::string iv_string; public: bool operator==(const GuardType& r) const { return this->iv_string == r.iv_string; } /** iv_string accessor */ std::string getString() const { return iv_string; } }; inline const GuardType GuardType::NONE{"GARD_NULL"}; inline const GuardType GuardType::UNRECOVERABLE{"GARD_Unrecoverable"}; inline const GuardType GuardType::PREDICTIVE{"GARD_Predictive"}; } // namespace callout } // namespace analyzer