blob: 7dfc5cbf1b39b9f449bca48be99f5f4bc6a469d9 [file] [log] [blame]
Jayanth Othayothc3d6b872021-07-28 05:07:25 -05001extern "C"
2{
3#include <libpdbg.h>
4}
5
Adriana Kobylakbbb53392022-02-14 21:15:48 +00006#include "config.h"
7
Jayanth Othayothc3d6b872021-07-28 05:07:25 -05008#include "extensions/phal/pdbg_utils.hpp"
9#include "extensions/phal/phal_error.hpp"
10
11#include <fmt/format.h>
12
13#include <phosphor-logging/log.hpp>
14
15namespace openpower
16{
17namespace phal
18{
19
20using namespace phosphor::logging;
21
22pdbg_target* getFsiTarget(struct pdbg_target* procTarget)
23{
24
25 struct pdbg_target* fsiTarget = nullptr;
26 pdbg_for_each_target("fsi", procTarget, fsiTarget)
27 {
28 // grab first one we find
29 break;
30 }
31 if (!fsiTarget)
32 {
33 log<level::ERR>(
34 "fsi path of target not found",
35 entry("PROC_TARGET_PATH=%s", pdbg_target_path(procTarget)));
36 return nullptr;
37 }
38
39 return fsiTarget;
40}
41
42uint32_t probeTarget(struct pdbg_target* procTarget)
43{
44 struct pdbg_target* pibTarget = nullptr;
45 pdbg_for_each_target("pib", procTarget, pibTarget)
46 {
47 // grab first one we find
48 break;
49 }
50 if (!pibTarget)
51 {
52 log<level::ERR>(
53 "pib path of target not found",
54 entry("PROC_TARGET_PATH=%s", pdbg_target_path(procTarget)));
55 return -1;
56 }
57 // probe PIB and ensure it's enabled
58 if (PDBG_TARGET_ENABLED != pdbg_target_probe(pibTarget))
59 {
60 log<level::ERR>(
61 "probe on pib target failed",
62 entry("PIB_TARGET_PATH=%s", pdbg_target_path(pibTarget)));
63 return -1;
64 }
65 return 0;
66}
67
68uint32_t getCFAM(struct pdbg_target* procTarget, const uint32_t reg,
69 uint32_t& val)
70{
71
72 pdbg_target* fsiTarget = getFsiTarget(procTarget);
73 if (nullptr == fsiTarget)
74 {
75 log<level::ERR>("getCFAM: fsi path or target not found");
76 return -1;
77 }
78
79 auto rc = probeTarget(procTarget);
80 if (rc)
81 {
82 // probe function logged details to journal
83 return rc;
84 }
85
86 rc = fsi_read(fsiTarget, reg, &val);
87 if (rc)
88 {
89 log<level::ERR>(
90 "failed to read input cfam", entry("RC=%u", rc),
91 entry("CFAM=0x%X", reg),
92 entry("FSI_TARGET_PATH=%s", pdbg_target_path(fsiTarget)));
93 return rc;
94 }
95 return 0;
96}
97
98uint32_t putCFAM(struct pdbg_target* procTarget, const uint32_t reg,
99 const uint32_t val)
100{
101 pdbg_target* fsiTarget = getFsiTarget(procTarget);
102 if (nullptr == fsiTarget)
103 {
104 log<level::ERR>("putCFAM: fsi path or target not found");
105 return -1;
106 }
107
108 auto rc = probeTarget(procTarget);
109 if (rc)
110 {
111 // probe function logged details to journal
112 return rc;
113 }
114
115 rc = fsi_write(fsiTarget, reg, val);
116 if (rc)
117 {
118 log<level::ERR>(
119 "failed to write input cfam", entry("RC=%u", rc),
120 entry("CFAM=0x%X", reg),
121 entry("FSI_TARGET_PATH=%s", pdbg_target_path(fsiTarget)));
122 return rc;
123 }
124 return 0;
125}
126
127void setDevtreeEnv()
128{
129 // PDBG_DTB environment variable set to CEC device tree path
Adriana Kobylakbbb53392022-02-14 21:15:48 +0000130 if (setenv("PDBG_DTB", CEC_DEVTREE_RW_PATH, 1))
Jayanth Othayothc3d6b872021-07-28 05:07:25 -0500131 {
132 log<level::ERR>(
133 fmt::format("Failed to set PDBG_DTB: ({})", strerror(errno))
134 .c_str());
135 throw std::runtime_error("Failed to set PDBG_DTB");
136 }
137}
138
Jayanth Othayotha2029872021-09-10 09:17:50 -0500139void setPdataInfoDBEnv()
140{
141 // PDATA_INFODB environment variable set to attributes tool infodb path
142 static constexpr auto PDATA_INFODB_PATH =
143 "/usr/share/pdata/attributes_info.db";
144
145 if (setenv("PDATA_INFODB", PDATA_INFODB_PATH, 1))
146 {
147 log<level::ERR>(
148 fmt::format("Failed to set PDATA_INFODB: ({})", strerror(errno))
149 .c_str());
150 throw std::runtime_error("Failed to set PDATA_INFODB");
151 }
152}
153
Jayanth Othayothc3d6b872021-07-28 05:07:25 -0500154} // namespace phal
155} // namespace openpower