1 #include <assert.h>
2 
3 #include <util/pdbg.hpp>
4 
5 #include <map>
6 
7 namespace sim
8 {
9 
10 class ScomAccess
11 {
12   private:
13     /** @brief Default constructor. */
14     ScomAccess() = default;
15 
16     /** @brief Destructor. */
17     ~ScomAccess() = default;
18 
19     /** @brief Copy constructor. */
20     ScomAccess(const ScomAccess&) = delete;
21 
22     /** @brief Assignment operator. */
23     ScomAccess& operator=(const ScomAccess&) = delete;
24 
25   public:
26     /** @brief Provides access to a singleton instance of this object. */
getSingleton()27     static ScomAccess& getSingleton()
28     {
29         static ScomAccess theScomAccess;
30         return theScomAccess;
31     }
32 
33   private:
34     /** The SCOM values for each chip and address. */
35     std::map<pdbg_target*, std::map<uint64_t, uint64_t>> iv_values;
36 
37     /** All addresses that will return a SCOM error. */
38     std::map<pdbg_target*, std::map<uint64_t, bool>> iv_errors;
39 
40   public:
41     /**
42      * @brief Stores a SCOM register value, which can be accessed later in test.
43      * @param i_target The target chip.
44      * @param i_addr   A SCOM address on the given chip.
45      * @param i_val    The value of the given address.
46      */
add(pdbg_target * i_target,uint64_t i_addr,uint64_t i_val)47     void add(pdbg_target* i_target, uint64_t i_addr, uint64_t i_val)
48     {
49         assert(nullptr != i_target);
50 
51         iv_values[i_target][i_addr] = i_val;
52     }
53 
54     /**
55      * @brief This can be used to specify if a specific SCOM address will return
56      *        an error when accessed. This is useful for error path testing.
57      * @param i_target The target chip.
58      * @param i_addr   A SCOM address on the given chip.
59      */
error(pdbg_target * i_target,uint64_t i_addr)60     void error(pdbg_target* i_target, uint64_t i_addr)
61     {
62         assert(nullptr != i_target);
63 
64         iv_errors[i_target][i_addr] = true;
65     }
66 
67     /**
68      * @brief Clears all SCOM value/error data.
69      */
flush()70     void flush()
71     {
72         iv_values.clear();
73         iv_errors.clear();
74     }
75 
76     /**
77      * @brief  Returns the stored SCOM register value.
78      * @param  i_target The target chip.
79      * @param  i_addr   A SCOM address on the given chip.
80      * @param  o_val    The value of the given address. If the target address
81      *                  does not exist in iv_values, a value of 0 is returned.
82      * @return Will return 1 if the target address exists in iv_errors.
83      *         Otherwise, will return 0 for a successful SCOM access.
84      */
get(pdbg_target * i_target,uint64_t i_addr,uint64_t & o_val)85     int get(pdbg_target* i_target, uint64_t i_addr, uint64_t& o_val)
86     {
87         assert(nullptr != i_target);
88 
89         if (iv_errors[i_target][i_addr])
90         {
91             return 1;
92         }
93 
94         o_val = iv_values[i_target][i_addr];
95 
96         return 0;
97     }
98 };
99 
100 class CfamAccess
101 {
102   private:
103     /** @brief Default constructor. */
104     CfamAccess() = default;
105 
106     /** @brief Destructor. */
107     ~CfamAccess() = default;
108 
109     /** @brief Copy constructor. */
110     CfamAccess(const CfamAccess&) = delete;
111 
112     /** @brief Assignment operator. */
113     CfamAccess& operator=(const CfamAccess&) = delete;
114 
115   public:
116     /** @brief Provides access to a singleton instance of this object. */
getSingleton()117     static CfamAccess& getSingleton()
118     {
119         static CfamAccess theCfamAccess;
120         return theCfamAccess;
121     }
122 
123   private:
124     /** The CFAM values for each chip and address. */
125     std::map<pdbg_target*, std::map<uint32_t, uint32_t>> iv_values;
126 
127     /** All addresses that will return a CFAM error. */
128     std::map<pdbg_target*, std::map<uint32_t, bool>> iv_errors;
129 
130   public:
131     /**
132      * @brief Stores a CFAM register value, which can be accessed later in test.
133      * @param i_target The target chip.
134      * @param i_addr   A CFAM address on the given chip.
135      * @param i_val    The value of the given address.
136      */
add(pdbg_target * i_target,uint32_t i_addr,uint32_t i_val)137     void add(pdbg_target* i_target, uint32_t i_addr, uint32_t i_val)
138     {
139         assert(nullptr != i_target);
140 
141         iv_values[i_target][i_addr] = i_val;
142     }
143 
144     /**
145      * @brief This can be used to specify if a specific CFAM address will return
146      *        an error when accessed. This is useful for error path testing.
147      * @param i_target The target chip.
148      * @param i_addr   A CFAM address on the given chip.
149      */
error(pdbg_target * i_target,uint32_t i_addr)150     void error(pdbg_target* i_target, uint32_t i_addr)
151     {
152         assert(nullptr != i_target);
153 
154         iv_errors[i_target][i_addr] = true;
155     }
156 
157     /**
158      * @brief Clears all CFAM value/error data.
159      */
flush()160     void flush()
161     {
162         iv_values.clear();
163         iv_errors.clear();
164     }
165 
166     /**
167      * @brief  Returns the stored CFAM register value.
168      * @param  i_target The target chip.
169      * @param  i_addr   A CFAM address on the given chip.
170      * @param  o_val    The value of the given address. If the target address
171      *                  does not exist in iv_values, a value of 0 is returned.
172      * @return Will return 1 if the target address exists in iv_errors.
173      *         Otherwise, will return 0 for a successful CFAM access.
174      */
get(pdbg_target * i_target,uint32_t i_addr,uint32_t & o_val)175     int get(pdbg_target* i_target, uint32_t i_addr, uint32_t& o_val)
176     {
177         assert(nullptr != i_target);
178 
179         if (iv_errors[i_target][i_addr])
180         {
181             return 1;
182         }
183 
184         o_val = iv_values[i_target][i_addr];
185 
186         return 0;
187     }
188 };
189 
190 } // namespace sim
191