1 #pragma once
2 
3 #include <analyzer/service_data.hpp>
4 
5 namespace analyzer
6 {
7 
8 /** @brief An abstract class for service event resolutions. */
9 class Resolution
10 {
11   public:
12     /** @brief Pure virtual destructor. */
13     virtual ~Resolution() = 0;
14 
15   public:
16     /**
17      * @brief Resolves the service actions required by this resolution.
18      * @param io_sd An object containing the service data collected during
19      *              hardware error analysis.
20      */
21     virtual void resolve(ServiceData& io_sd) const = 0;
22 };
23 
24 // Pure virtual destructor must be defined.
25 inline Resolution::~Resolution() {}
26 
27 /** @brief Resolves a hardware callout service event. */
28 class HardwareCalloutResolution : public Resolution
29 {
30   public:
31     /**
32      * @brief Constructor from components.
33      * @param i_unitPath The devtree path of a guardable unit relative to a
34      *                   chip. An empty string refers to the chip itself.
35      * @param i_priority The callout priority.
36      * @param i_guard    True, if guard is required. False, otherwise.
37      */
38     HardwareCalloutResolution(const std::string& i_unitPath,
39                               const callout::Priority& i_priority,
40                               bool i_guard) :
41         iv_unitPath(i_unitPath),
42         iv_priority(i_priority), iv_guard(i_guard)
43     {}
44 
45   private:
46     /** The devtree path of a guardable unit relative to a chip. An empty string
47      *  refers to the chip itself. */
48     const std::string iv_unitPath;
49 
50     /** The callout priority. */
51     const callout::Priority iv_priority;
52 
53     /** True, if guard is required. False, otherwise. */
54     const bool iv_guard;
55 
56   public:
57     void resolve(ServiceData& io_sd) const override;
58 };
59 
60 /** @brief Resolution to callout a connected chip/target. */
61 class ConnectedCalloutResolution : public Resolution
62 {
63   public:
64     /**
65      * @brief Constructor from components.
66      * @param i_busType  The bus type.
67      * @param i_unitPath The path of the chip unit that is connected to the
68      *                   other chip. An empty string refers to the chip itself,
69      *                   which generally means this chip is a child of another.
70      * @param i_priority The callout priority.
71      * @param i_guard    The guard type for this callout.
72      */
73     ConnectedCalloutResolution(const callout::BusType& i_busType,
74                                const std::string& i_unitPath,
75                                const callout::Priority& i_priority,
76                                bool i_guard) :
77         iv_busType(i_busType),
78         iv_unitPath(i_unitPath), iv_priority(i_priority), iv_guard(i_guard)
79     {}
80 
81   private:
82     /** The bus type. */
83     const callout::BusType iv_busType;
84 
85     /** The devtree path the chip unit that is connected to the other chip. An
86      *  empty string refers to the chip itself, which generally means this chip
87      *  is a child of the other chip. */
88     const std::string iv_unitPath;
89 
90     /** The callout priority. */
91     const callout::Priority iv_priority;
92 
93     /** True, if guard is required. False, otherwise. */
94     const bool iv_guard;
95 
96   public:
97     void resolve(ServiceData& io_sd) const override;
98 };
99 
100 /**
101  * @brief Resolution to callout all parts on a bus (RX/TX endpoints and
102  *         everything else in between).
103  */
104 class BusCalloutResolution : public Resolution
105 {
106   public:
107     /**
108      * @brief Constructor from components.
109      * @param i_busType  The bus type.
110      * @param i_unitPath The path of the chip unit that is connected to the
111      *                   other chip. An empty string refers to the chip itself,
112      *                   which generally means this chip is a child of another.
113      * @param i_priority The callout priority.
114      * @param i_guard    The guard type for this callout.
115      */
116     BusCalloutResolution(const callout::BusType& i_busType,
117                          const std::string& i_unitPath,
118                          const callout::Priority& i_priority, bool i_guard) :
119         iv_busType(i_busType),
120         iv_unitPath(i_unitPath), iv_priority(i_priority), iv_guard(i_guard)
121     {}
122 
123   private:
124     /** The bus type. */
125     const callout::BusType iv_busType;
126 
127     /** The devtree path the chip unit that is connected to the other chip. An
128      *  empty string refers to the chip itself, which generally means this chip
129      *  is a child of the other chip. */
130     const std::string iv_unitPath;
131 
132     /** The callout priority. */
133     const callout::Priority iv_priority;
134 
135     /** True, if guard is required. False, otherwise. */
136     const bool iv_guard;
137 
138   public:
139     void resolve(ServiceData& io_sd) const override;
140 };
141 
142 /** @brief Resolves a clock callout service event. */
143 class ClockCalloutResolution : public Resolution
144 {
145   public:
146     /**
147      * @brief Constructor from components.
148      * @param i_clockType The clock type.
149      * @param i_priority  The callout priority.
150      * @param i_guard     The guard type for this callout.
151      */
152     ClockCalloutResolution(const callout::ClockType& i_clockType,
153                            const callout::Priority& i_priority, bool i_guard) :
154         iv_clockType(i_clockType),
155         iv_priority(i_priority), iv_guard(i_guard)
156     {}
157 
158   private:
159     /** The clock type. */
160     const callout::ClockType iv_clockType;
161 
162     /** The callout priority. */
163     const callout::Priority iv_priority;
164 
165     /** True, if guard is required. False, otherwise. */
166     const bool iv_guard;
167 
168   public:
169     void resolve(ServiceData& io_sd) const override;
170 };
171 
172 /** @brief Resolves a procedure callout service event. */
173 class ProcedureCalloutResolution : public Resolution
174 {
175   public:
176     /**
177      * @brief Constructor from components.
178      * @param i_procedure The procedure callout type.
179      * @param i_priority  The callout priority.
180      */
181     ProcedureCalloutResolution(const callout::Procedure& i_procedure,
182                                const callout::Priority& i_priority) :
183         iv_procedure(i_procedure),
184         iv_priority(i_priority)
185     {}
186 
187   private:
188     /** The procedure callout type. */
189     const callout::Procedure iv_procedure;
190 
191     /** The callout priority. */
192     const callout::Priority iv_priority;
193 
194   public:
195     void resolve(ServiceData& io_sd) const override;
196 };
197 
198 /**
199  * @brief Some service actions cannot be contained within the RAS data files.
200  *        This resolution class allows a predefined plugin function to be
201  *        called to do additional service action work.
202  */
203 class PluginResolution : public Resolution
204 {
205   public:
206     /**
207      * @brief Constructor from components.
208      * @param i_name     The name of the plugin.
209      * @param i_instance A plugin could be defined for multiple chip
210      *                   units/registers.
211      */
212     PluginResolution(const std::string& i_name, unsigned int i_instance) :
213         iv_name(i_name), iv_instance(i_instance)
214     {}
215 
216   private:
217     /** The name of the plugin. */
218     const std::string iv_name;
219 
220     /** Some plugins will define the same action for multiple instances of a
221      *  register (i.e. for each core on a processor). */
222     const unsigned int iv_instance;
223 
224   public:
225     void resolve(ServiceData& io_sd) const override;
226 };
227 
228 /**
229  * @brief Contains a list of resolutions. This resolutions will be resolved the
230  *        list in the order in which they were inputted into the constructor.
231  */
232 class ResolutionList : public Resolution
233 {
234   public:
235     /** @brief Default constructor. */
236     ResolutionList() = default;
237 
238   private:
239     /** The resolution list. */
240     std::vector<std::shared_ptr<Resolution>> iv_list;
241 
242   public:
243     /**
244      * @brief Adds a new resolution to the end of the list.
245      * @param i_resolution The new resolution
246      */
247     void push(const std::shared_ptr<Resolution>& i_resolution)
248     {
249         iv_list.push_back(i_resolution);
250     }
251 
252     // Overloaded from parent.
253     void resolve(ServiceData& io_sd) const override
254     {
255         for (const auto& e : iv_list)
256         {
257             e->resolve(io_sd);
258         }
259     }
260 };
261 
262 } // namespace analyzer
263