xref: /openbmc/openpower-hw-diags/attn/attention.hpp (revision 27dd6368d4e6b1fd03610503356f24eb08a16c02)
1b481d905SBen Tyner #pragma once
2b481d905SBen Tyner 
3b481d905SBen Tyner #include <libpdbg.h>
4b481d905SBen Tyner 
53fb52e53SBen Tyner #include <attn/attn_config.hpp>
63fb52e53SBen Tyner 
73fb52e53SBen Tyner #include <bitset>
83fb52e53SBen Tyner 
9b481d905SBen Tyner namespace attn
10b481d905SBen Tyner {
11b481d905SBen Tyner 
12b481d905SBen Tyner /** @brief attention handler configuration flags */
13b481d905SBen Tyner inline constexpr uint32_t enableBreakpoints = 1;
14b481d905SBen Tyner 
15b481d905SBen Tyner /**
16b481d905SBen Tyner  * @brief These objects contain information about an active attention.
17b481d905SBen Tyner  *
18b481d905SBen Tyner  * An Attention object is created for each active attention. These objects
19b481d905SBen Tyner  * carry with them various configuration and status information as well
20b481d905SBen Tyner  * the attention handler function to call for handling the attention. Each
21b481d905SBen Tyner  * Attention object also carries a priority value. This priority is used
22b481d905SBen Tyner  * to determine which attention event(s) to handle when there are more than
23b481d905SBen Tyner  * one active event.
24b481d905SBen Tyner  */
25b481d905SBen Tyner class Attention
26b481d905SBen Tyner {
27b481d905SBen Tyner   public:
28b481d905SBen Tyner     /** @brief types of attentions to be handled (by priority low to high) */
29b481d905SBen Tyner     enum AttentionType
30b481d905SBen Tyner     {
31b481d905SBen Tyner         Special = 0,
32b481d905SBen Tyner         Checkstop = 1,
33b481d905SBen Tyner         Vital = 2
34b481d905SBen Tyner     };
35b481d905SBen Tyner 
36b481d905SBen Tyner     /** @brief Default constructor. */
37b481d905SBen Tyner     Attention() = delete;
38b481d905SBen Tyner 
39b481d905SBen Tyner     /** @brief Main constructors */
40b481d905SBen Tyner     Attention(AttentionType i_type, int (*i_handler)(Attention*),
413fb52e53SBen Tyner               pdbg_target* i_target, Config* i_config);
42b481d905SBen Tyner 
43b481d905SBen Tyner     /** @brief Destructor */
44b481d905SBen Tyner     ~Attention() = default;
45b481d905SBen Tyner 
46b481d905SBen Tyner     /** @brief Get attention priority */
47b481d905SBen Tyner     int getPriority() const;
48b481d905SBen Tyner 
493fb52e53SBen Tyner     /* @brief Get config object */
503fb52e53SBen Tyner     Config* getConfig() const;
51b481d905SBen Tyner 
52b481d905SBen Tyner     /* @brief Call attention handler function */
53b481d905SBen Tyner     int handle();
54b481d905SBen Tyner 
55*792f32f7SBen Tyner     /* @brief Get attention handler target */
56*792f32f7SBen Tyner     pdbg_target* getTarget() const;
57*792f32f7SBen Tyner 
58b481d905SBen Tyner     /** @brief Copy constructor. */
59b481d905SBen Tyner     Attention(const Attention&) = default;
60b481d905SBen Tyner 
61b481d905SBen Tyner     /** @brief Assignment operator. */
62b481d905SBen Tyner     Attention& operator=(const Attention&) = default;
63b481d905SBen Tyner 
64b481d905SBen Tyner     /** @brief less than operator */
65b481d905SBen Tyner     bool operator<(const Attention& right) const;
66b481d905SBen Tyner 
67b481d905SBen Tyner   private:
68b481d905SBen Tyner     AttentionType iv_type;         // attention type
69b481d905SBen Tyner     int (*iv_handler)(Attention*); // handler function
70b481d905SBen Tyner     pdbg_target* iv_target;        // handler function target
713fb52e53SBen Tyner     Config* iv_config;             // configuration flags
72b481d905SBen Tyner };
73b481d905SBen Tyner 
74b481d905SBen Tyner } // namespace attn
75