#pragma once #include #include #include #include namespace analyzer { /** * @brief Manages the RAS data files and resolves service actions required for * error signatures. */ class RasDataParser { public: /** @brief Default constructor. */ RasDataParser() { initDataFiles(); } /** Define all RAS data flags that may be associated with a signature */ enum RasDataFlags { SUE_SOURCE, SUE_SEEN, CS_POSSIBLE, RECOVERED_ERROR, INFORMATIONAL_ONLY, MNFG_INFORMATIONAL_ONLY, MASK_BUT_DONT_CLEAR, CRC_RELATED_ERR, CRC_ROOT_CAUSE, ODP_DATA_CORRUPT_SIDE_EFFECT, ODP_DATA_CORRUPT_ROOT_CAUSE, ATTN_FROM_OCMB, }; private: /** @brief The RAS data files. */ std::map iv_dataFiles; public: /** * @brief Returns a resolution for all the RAS actions needed for the given * signature. * @param i_signature The target error signature. */ std::shared_ptr getResolution(const libhei::Signature& i_signature); /** * @brief Initializes the signature list within the input isolation data * with their appropriate flags based on the RAS data files. * @param i_signature The target error signature. * @param i_flag The flag to check for * @return True if the flag is set for the given signature, else false. */ bool isFlagSet(const libhei::Signature& i_signature, const RasDataFlags i_flag) const; /** * @brief Returns of the version of the relevant RAS data file for the * input signature. * @param i_signature The target error signature. * @return The version of the RAS data file. */ unsigned int getVersion(const libhei::Signature& i_signature) const; private: /** * @brief Parses all of the RAS data JSON files and validates them against * the associated schema. */ void initDataFiles(); /** * @brief Parses a signature in the given data file and returns a string * representing the target action for the signature. * @param i_data The parsed RAS data file associated with the * signature's chip type. * @param i_signature The target signature. * @return A string representing the target action for the signature. */ std::string parseSignature(const nlohmann::json& i_data, const libhei::Signature& i_signature) const; /** * @brief Parses a bus object in the given data file and returns the bus * type and unit path. * @param i_data The parsed RAS data file associated with the signature's * chip type. * @param i_name The name of the target bus. * @return A tuple containing the bus type and unit path. */ std::tuple parseBus(const nlohmann::json& i_data, const std::string& i_name); /** * @brief Parses an action in the given data file and returns the * corresponding resolution. * @param i_data The parsed RAS data file associated with the signature's * chip type. * @param i_action The target action to parse from the given RAS data. * @return A resolution (or nested resolutions) representing the given * action. * @note This function is called recursively because an action could * reference another action. This function will maintain a stack of * parsed actions and will assert that the same action cannot be * parsed more than once in the recursion stack. */ std::shared_ptr parseAction(const nlohmann::json& i_data, const std::string& i_action); /** * @brief Returns a callout priority enum value for the given string. * @param i_priority The priority string. * @return A callout priority enum value. */ callout::Priority getPriority(const std::string& i_priority); }; } // namespace analyzer