blob: 76c1dcfb01c1d28902ffa886aa03e7cf639bc502 [file] [log] [blame]
#pragma once
#include <map>
#include <string>
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<Priority, std::string> 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<Priority, std::string> 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