xref: /openbmc/openpower-hw-diags/analyzer/hei_user_interface.cpp (revision 1d29e5c7da9aad5c3a2ea63a9fa4b5da7c6bd75e)
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  
__regType(RegisterType_t i_regType)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  
__readProc(pdbg_target * i_procTrgt,RegisterType_t i_regType,uint64_t i_address,uint64_t & o_value)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  
__readOcmb(pdbg_target * i_obmcTrgt,RegisterType_t i_regType,uint64_t i_address,uint64_t & o_value)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  
registerRead(const Chip & i_chip,RegisterType_t i_regType,uint64_t i_address,uint64_t & o_value)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
hei_inf(char * format,...)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
hei_err(char * format,...)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