blob: 3f6c6b3c8761f63fafb8e04704cfcd138c98663a [file] [log] [blame]
Zane Shelleya9b44342021-08-08 17:15:52 -05001#pragma once
2
3#include <analyzer/resolution.hpp>
4#include <hei_main.hpp>
5#include <nlohmann/json.hpp>
6
7#include <map>
8
9namespace analyzer
10{
Zane Shelleya9b44342021-08-08 17:15:52 -050011/**
12 * @brief Manages the RAS data files and resolves service actions required for
13 * error signatures.
14 */
15class RasDataParser
16{
17 public:
18 /** @brief Default constructor. */
19 RasDataParser()
20 {
21 initDataFiles();
22 }
23
Caleb Palmerf1184392022-10-07 15:17:22 -050024 /** 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
Zane Shelleya9b44342021-08-08 17:15:52 -050040 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
Caleb Palmerf1184392022-10-07 15:17:22 -050053 /**
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,
Caleb Palmer1a4f0e72022-11-07 15:08:01 -060061 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;
Caleb Palmerf1184392022-10-07 15:17:22 -050070
Zane Shelleya9b44342021-08-08 17:15:52 -050071 private:
72 /**
73 * @brief Parses all of the RAS data JSON files and validates them against
74 * the associated schema.
75 */
76 void initDataFiles();
Zane Shelley7698b302021-08-09 16:00:03 -050077
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,
Caleb Palmer1a4f0e72022-11-07 15:08:01 -060087 const libhei::Signature& i_signature) const;
Zane Shelley7698b302021-08-09 16:00:03 -050088
89 /**
Zane Shelley5d63cef2021-09-17 18:10:17 -050090 * @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 /**
Zane Shelley7698b302021-08-09 16:00:03 -0500101 * @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 */
Zane Shelleyc85716c2021-08-17 10:54:06 -0500121 callout::Priority getPriority(const std::string& i_priority);
Zane Shelleya9b44342021-08-08 17:15:52 -0500122};
123
124} // namespace analyzer