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