1 #pragma once 2 3 #include <analyzer/resolution.hpp> 4 #include <hei_main.hpp> 5 #include <nlohmann/json.hpp> 6 7 #include <map> 8 9 namespace analyzer 10 { 11 /** 12 * @brief Manages the RAS data files and resolves service actions required for 13 * error signatures. 14 */ 15 class RasDataParser 16 { 17 public: 18 /** @brief Default constructor. */ 19 RasDataParser() 20 { 21 initDataFiles(); 22 } 23 24 /** Define all RAS data flags that may be associated with a signature */ 25 enum RasDataFlags 26 { 27 SUE_SOURCE, 28 SUE_SEEN, 29 CS_POSSIBLE, 30 RECOVERED_ERROR, 31 INFORMATIONAL_ONLY, 32 MNFG_INFORMATIONAL_ONLY, 33 MASK_BUT_DONT_CLEAR, 34 CRC_RELATED_ERR, 35 CRC_ROOT_CAUSE, 36 ODP_DATA_CORRUPT_SIDE_EFFECT, 37 ODP_DATA_CORRUPT_ROOT_CAUSE, 38 }; 39 40 private: 41 /** @brief The RAS data files. */ 42 std::map<libhei::ChipType_t, nlohmann::json> iv_dataFiles; 43 44 public: 45 /** 46 * @brief Returns a resolution for all the RAS actions needed for the given 47 * signature. 48 * @param i_signature The target error signature. 49 */ 50 std::shared_ptr<Resolution> 51 getResolution(const libhei::Signature& i_signature); 52 53 /** 54 * @brief Initializes the signature list within the input isolation data 55 * with their appropriate flags based on the RAS data files. 56 * @param i_signature The target error signature. 57 * @param i_flag The flag to check for 58 * @return True if the flag is set for the given signature, else false. 59 */ 60 bool isFlagSet(const libhei::Signature& i_signature, 61 const RasDataFlags i_flag) const; 62 63 /** 64 * @brief Returns of the version of the relevant RAS data file for the 65 * input signature. 66 * @param i_signature The target error signature. 67 * @return The version of the RAS data file. 68 */ 69 unsigned int getVersion(const libhei::Signature& i_signature) const; 70 71 private: 72 /** 73 * @brief Parses all of the RAS data JSON files and validates them against 74 * the associated schema. 75 */ 76 void initDataFiles(); 77 78 /** 79 * @brief Parses a signature in the given data file and returns a string 80 * representing the target action for the signature. 81 * @param i_data The parsed RAS data file associated with the 82 * signature's chip type. 83 * @param i_signature The target signature. 84 * @return A string representing the target action for the signature. 85 */ 86 std::string parseSignature(const nlohmann::json& i_data, 87 const libhei::Signature& i_signature) const; 88 89 /** 90 * @brief Parses a bus object in the given data file and returns the bus 91 * type and unit path. 92 * @param i_data The parsed RAS data file associated with the signature's 93 * chip type. 94 * @param i_name The name of the target bus. 95 * @return A tuple containing the bus type and unit path. 96 */ 97 std::tuple<callout::BusType, std::string> 98 parseBus(const nlohmann::json& i_data, const std::string& i_name); 99 100 /** 101 * @brief Parses an action in the given data file and returns the 102 * corresponding resolution. 103 * @param i_data The parsed RAS data file associated with the signature's 104 * chip type. 105 * @param i_action The target action to parse from the given RAS data. 106 * @return A resolution (or nested resolutions) representing the given 107 * action. 108 * @note This function is called recursively because an action could 109 * reference another action. This function will maintain a stack of 110 * parsed actions and will assert that the same action cannot be 111 * parsed more than once in the recursion stack. 112 */ 113 std::shared_ptr<Resolution> parseAction(const nlohmann::json& i_data, 114 const std::string& i_action); 115 116 /** 117 * @brief Returns a callout priority enum value for the given string. 118 * @param i_priority The priority string. 119 * @return A callout priority enum value. 120 */ 121 callout::Priority getPriority(const std::string& i_priority); 122 }; 123 124 } // namespace analyzer 125