1 /** 2 * @file These are the implementations of the user interfaces declared 3 * in hei_user_interface.hpp 4 */ 5 6 #include <assert.h> 7 #include <inttypes.h> 8 #include <libpdbg.h> 9 #include <stdarg.h> 10 #include <stdio.h> 11 12 #include <hei_user_interface.hpp> 13 #include <util/pdbg.hpp> 14 #include <util/trace.hpp> 15 16 namespace libhei 17 { 18 19 const char* __regType(RegisterType_t i_regType) 20 { 21 const char* str = ""; 22 switch (i_regType) 23 { 24 case REG_TYPE_SCOM: 25 str = "SCOM"; 26 break; 27 case REG_TYPE_ID_SCOM: 28 str = "ID_SCOM"; 29 break; 30 default: 31 trace::err("Unsupported register type: i_regType=0x%02x", 32 i_regType); 33 assert(0); 34 } 35 return str; 36 } 37 38 //------------------------------------------------------------------------------ 39 40 bool __readProc(pdbg_target* i_procTrgt, RegisterType_t i_regType, 41 uint64_t i_address, uint64_t& o_value) 42 { 43 bool accessFailure = false; 44 45 // The processor PIB target is required for SCOM access. 46 pdbg_target* scomTrgt = util::pdbg::getPibTrgt(i_procTrgt); 47 48 switch (i_regType) 49 { 50 case REG_TYPE_SCOM: 51 case REG_TYPE_ID_SCOM: 52 // Read the 64-bit SCOM register. 53 accessFailure = (0 != pib_read(scomTrgt, i_address, &o_value)); 54 break; 55 56 default: 57 trace::err("Unsupported register type: trgt=%s regType=0x%02x " 58 "addr=0x%0" PRIx64, 59 util::pdbg::getPath(i_procTrgt), i_regType, i_address); 60 assert(0); // an unsupported register type 61 } 62 63 return accessFailure; 64 } 65 66 //------------------------------------------------------------------------------ 67 68 bool __readOcmb(pdbg_target* i_obmcTrgt, RegisterType_t i_regType, 69 uint64_t i_address, uint64_t& o_value) 70 { 71 bool accessFailure = false; 72 73 // The OCMB target is used for SCOM access. 74 pdbg_target* scomTrgt = i_obmcTrgt; 75 76 switch (i_regType) 77 { 78 case REG_TYPE_SCOM: 79 case REG_TYPE_ID_SCOM: 80 // Read the 64-bit SCOM register. 81 accessFailure = (0 != ocmb_getscom(scomTrgt, i_address, &o_value)); 82 break; 83 84 default: 85 trace::err("Unsupported register type: trgt=%s regType=0x%02x " 86 "addr=0x%0" PRIx64, 87 util::pdbg::getPath(i_obmcTrgt), i_regType, i_address); 88 assert(0); 89 } 90 91 return accessFailure; 92 } 93 94 //------------------------------------------------------------------------------ 95 96 bool registerRead(const Chip& i_chip, RegisterType_t i_regType, 97 uint64_t i_address, uint64_t& o_value) 98 { 99 bool accessFailure = false; 100 101 auto trgt = util::pdbg::getTrgt(i_chip); 102 103 uint8_t trgtType = util::pdbg::getTrgtType(trgt); 104 105 switch (trgtType) 106 { 107 case 0x05: // PROC 108 accessFailure = __readProc(trgt, i_regType, i_address, o_value); 109 break; 110 111 case 0x4b: // OCMB_CHIP 112 accessFailure = __readOcmb(trgt, i_regType, i_address, o_value); 113 break; 114 115 default: 116 trace::err("Unsupported target type: trgt=%s trgtType=0x%02x", 117 util::pdbg::getPath(trgt), trgtType); 118 assert(0); 119 } 120 121 if (accessFailure) 122 { 123 trace::err("%s failure: trgt=%s addr=0x%0" PRIx64, __regType(i_regType), 124 util::pdbg::getPath(trgt), i_address); 125 o_value = 0; // just in case 126 } 127 128 return accessFailure; 129 } 130 131 //------------------------------------------------------------------------------ 132 133 // prints a single line to stdout 134 void hei_inf(char* format, ...) 135 { 136 va_list args; 137 va_start(args, format); 138 trace::inf(format, args); 139 va_end(args); 140 } 141 142 //------------------------------------------------------------------------------ 143 144 // prints a single line to stderr 145 void hei_err(char* format, ...) 146 { 147 va_list args; 148 va_start(args, format); 149 trace::err(format, args); 150 va_end(args); 151 } 152 153 } // namespace libhei 154