xref: /openbmc/openpower-hw-diags/analyzer/ras-data/ras-data-parser.hpp (revision 51f8202c2c93436c3a1eef951596ebc843651ede)
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. */
RasDataParser()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          ATTN_FROM_OCMB,
39      };
40  
41    private:
42      /** @brief The RAS data files. */
43      std::map<libhei::ChipType_t, nlohmann::json> iv_dataFiles;
44  
45    public:
46      /**
47       * @brief Returns a resolution for all the RAS actions needed for the given
48       *        signature.
49       * @param i_signature The target error signature.
50       */
51      std::shared_ptr<Resolution>
52          getResolution(const libhei::Signature& i_signature);
53  
54      /**
55       * @brief Initializes the signature list within the input isolation data
56       *        with their appropriate flags based on the RAS data files.
57       * @param i_signature The target error signature.
58       * @param i_flag      The flag to check for
59       * @return True if the flag is set for the given signature, else false.
60       */
61      bool isFlagSet(const libhei::Signature& i_signature,
62                     const RasDataFlags i_flag) const;
63  
64      /**
65       * @brief Returns of the version of the relevant RAS data file for the
66       *        input signature.
67       * @param i_signature The target error signature.
68       * @return The version of the RAS data file.
69       */
70      unsigned int getVersion(const libhei::Signature& i_signature) const;
71  
72    private:
73      /**
74       * @brief Parses all of the RAS data JSON files and validates them against
75       *        the associated schema.
76       */
77      void initDataFiles();
78  
79      /**
80       * @brief  Parses a signature in the given data file and returns a string
81       *         representing the target action for the signature.
82       * @param  i_data      The parsed RAS data file associated with the
83       *                     signature's chip type.
84       * @param  i_signature The target signature.
85       * @return A string representing the target action for the signature.
86       */
87      std::string parseSignature(const nlohmann::json& i_data,
88                                 const libhei::Signature& i_signature) const;
89  
90      /**
91       * @brief  Parses a bus object in the given data file and returns the bus
92       *         type and unit path.
93       * @param  i_data The parsed RAS data file associated with the signature's
94       *                chip type.
95       * @param  i_name The name of the target bus.
96       * @return A tuple containing the bus type and unit path.
97       */
98      std::tuple<callout::BusType, std::string>
99          parseBus(const nlohmann::json& i_data, const std::string& i_name);
100  
101      /**
102       * @brief  Parses an action in the given data file and returns the
103       *         corresponding resolution.
104       * @param  i_data   The parsed RAS data file associated with the signature's
105       *                  chip type.
106       * @param  i_action The target action to parse from the given RAS data.
107       * @return A resolution (or nested resolutions) representing the given
108       *         action.
109       * @note   This function is called recursively because an action could
110       *         reference another action. This function will maintain a stack of
111       *         parsed actions and will assert that the same action cannot be
112       *         parsed more than once in the recursion stack.
113       */
114      std::shared_ptr<Resolution> parseAction(const nlohmann::json& i_data,
115                                              const std::string& i_action);
116  
117      /**
118       * @brief  Returns a callout priority enum value for the given string.
119       * @param  i_priority The priority string.
120       * @return A callout priority enum value.
121       */
122      callout::Priority getPriority(const std::string& i_priority);
123  };
124  
125  } // namespace analyzer
126