blob: 36c8f6433474835476b963013b5f0d4a478ba704 [file] [log] [blame]
#pragma once
#include <fmt/format.h>
#include <analyzer/analyzer_main.hpp>
#include <analyzer/callout.hpp>
#include <hei_main.hpp>
#include <nlohmann/json.hpp>
#include <util/pdbg.hpp>
namespace analyzer
{
/**
* @brief Data regarding required service actions based on the hardware error
* analysis.
*/
class ServiceData
{
public:
/**
* @brief Constructor from components.
* @param i_rootCause The signature of the root cause attention.
* @param i_analysisType The type of analysis to perform.
* @param i_isoData The data found during isolation.
*/
ServiceData(const libhei::Signature& i_rootCause,
AnalysisType i_analysisType,
const libhei::IsolationData& i_isoData) :
iv_rootCause(i_rootCause),
iv_analysisType(i_analysisType), iv_isoData(i_isoData)
{}
/** @brief Destructor. */
~ServiceData() = default;
/** @brief Copy constructor. */
ServiceData(const ServiceData&) = default;
/** @brief Assignment operator. */
ServiceData& operator=(const ServiceData&) = default;
private:
/** The signature of the root cause attention. */
const libhei::Signature iv_rootCause;
/** The type of analysis to perform. */
const AnalysisType iv_analysisType;
/** The data found during isolation. */
const libhei::IsolationData iv_isoData;
/** The list of callouts that will be added to a PEL. */
nlohmann::json iv_calloutList = nlohmann::json::array();
/** FFDC for callouts that would otherwise not be available in the
* callout list (unit paths, bus types, etc.). */
nlohmann::json iv_calloutFFDC = nlohmann::json::array();
public:
/** @return The signature of the root cause attention. */
const libhei::Signature& getRootCause() const
{
return iv_rootCause;
}
/** @return The type of analysis to perform. */
AnalysisType getAnalysisType() const
{
return iv_analysisType;
}
/** @return The data found during isolation. */
const libhei::IsolationData& getIsolationData() const
{
return iv_isoData;
}
/** @return Returns the guard type based on current analysis policies. */
callout::GuardType queryGuardPolicy() const
{
if (AnalysisType::SYSTEM_CHECKSTOP == iv_analysisType)
{
return callout::GuardType::UNRECOVERABLE;
}
else if (AnalysisType::TERMINATE_IMMEDIATE == iv_analysisType)
{
return callout::GuardType::PREDICTIVE;
}
return callout::GuardType::NONE;
}
/**
* @brief Add callout for a pdbg_target.
* @param i_target The chip or unit target to add to the callout list.
* @param i_priority The callout priority.
* @param i_guard True if guard is required. False, otherwise.
*/
void calloutTarget(pdbg_target* i_target, callout::Priority i_priority,
bool i_guard);
/**
* @brief Add callout for a connected target on the other side of a bus.
* @param i_rxTarget The target on the receiving side (RX) of the bus.
* @param i_busType The bus type.
* @param i_priority The callout priority.
* @param i_guard True if guard is required. False, otherwise.
*/
void calloutConnected(pdbg_target* i_rxTarget,
const callout::BusType& i_busType,
callout::Priority i_priority, bool i_guard);
/**
* @brief Add callout for an entire bus.
* @param i_rxTarget The target on the receiving side (RX) of the bus.
* @param i_busType The bus type.
* @param i_priority The callout priority.
* @param i_guard True if guard is required. False, otherwise.
*/
void calloutBus(pdbg_target* i_rxTarget, const callout::BusType& i_busType,
callout::Priority i_priority, bool i_guard);
/**
* @brief Add callout for a clock.
* @param i_clockType The clock type.
* @param i_priority The callout priority.
* @param i_guard True if guard is required. False, otherwise.
*/
void calloutClock(const callout::ClockType& i_clockType,
callout::Priority i_priority, bool i_guard);
/**
* @brief Add callout for a service procedure.
* @param i_procedure The procedure type.
* @param i_priority The callout priority.
*/
void calloutProcedure(const callout::Procedure& i_procedure,
callout::Priority i_priority);
/**
* @brief Add callout for part type.
* @param i_part The part type.
* @param i_priority The callout priority.
*/
void calloutPart(const callout::PartType& i_part,
callout::Priority i_priority);
/** @brief Accessor to iv_calloutList. */
const nlohmann::json& getCalloutList() const
{
return iv_calloutList;
}
/** @brief Accessor to iv_calloutFFDC. */
const nlohmann::json& getCalloutFFDC() const
{
return iv_calloutFFDC;
}
/**
* @brief Adds the SRC subsystem to the given additional PEL data.
* @param io_additionalData The additional PEL data.
*/
void addSrcSubsystem(
std::map<std::string, std::string>& io_additionalData) const
{
io_additionalData["PEL_SUBSYSTEM"] = fmt::format(
"0x{:02x}", static_cast<uint8_t>(iv_srcSubsystem.first));
}
/** @brief Accessor to iv_srcSubsystem. */
const std::pair<callout::SrcSubsystem, callout::Priority> getSubsys() const
{
return iv_srcSubsystem;
}
private:
/**
* @brief Add callout information to the callout list.
* @param The JSON object for this callout.
*/
void addCallout(const nlohmann::json& i_callout);
/**
* @brief Add FFDC for a callout that would otherwise not be available in
* the callout list (unit paths, bus types, etc.).
* @param The JSON object for this callout.
*/
void addCalloutFFDC(const nlohmann::json& i_ffdc)
{
iv_calloutFFDC.push_back(i_ffdc);
}
/**
* @brief A simple helper function for all the callout functions that need
* to callout a target (callout only, no FFDC).
* @param i_target The chip or unit target to add to the callout list.
* @param i_priority The callout priority.
* @param i_guard True if guard is required. False, otherwise.
*/
void addTargetCallout(pdbg_target* i_target, callout::Priority i_priority,
bool i_guard);
/**
* @brief A simple helper function for all the callout functions that need
* to callout a the backplane (callout only, no FFDC).
* @param i_priority The callout priority.
*/
void addBackplaneCallout(callout::Priority i_priority);
private:
/**
* @brief Compares the current SRC subsystem type with the given SRC
* subsystem type and stores the highest priority callout subsystem.
* If the two subsystems are of equal priority. The stored subsystem
* is used.
* @param i_subsystem The given subsystem type.
* @param i_priority The callout priority associated with the given
* subsystem.
*/
void setSrcSubsystem(callout::SrcSubsystem i_subsystem,
callout::Priority i_priority);
/**
* @brief Returns the appropriate SRC subsystem based on the input target.
* @param i_trgt The given pdbg target.
*/
callout::SrcSubsystem getTargetSubsystem(pdbg_target* i_target);
/** The SRC subsystem field (2nd byte of the primary SRC) is based on the
* callouts the PEL. As callouts are to the service data, we'll need to
* keep track of the highest priority callout subsystem. */
std::pair<callout::SrcSubsystem, callout::Priority> iv_srcSubsystem = {
callout::SrcSubsystem::CEC_HARDWARE, callout::Priority::LOW};
};
} // namespace analyzer