132e84e98SVishwanatha Subbanna #include "occ_device.hpp"
294df8c90SGunnar Mills
3cbad219eSEddie James #include "occ_manager.hpp"
4482e31ffSEddie James #include "occ_status.hpp"
532e84e98SVishwanatha Subbanna
6e2d0a43cSChris Cain #include <phosphor-logging/log.hpp>
7e2d0a43cSChris Cain
8e2d0a43cSChris Cain #include <filesystem>
994df8c90SGunnar Mills #include <iostream>
1094df8c90SGunnar Mills
1132e84e98SVishwanatha Subbanna namespace open_power
1232e84e98SVishwanatha Subbanna {
1332e84e98SVishwanatha Subbanna namespace occ
1432e84e98SVishwanatha Subbanna {
1532e84e98SVishwanatha Subbanna
16e2d0a43cSChris Cain using namespace phosphor::logging;
17e2d0a43cSChris Cain
setActive(bool active)18aced3098SEddie James void Device::setActive(bool active)
19aced3098SEddie James {
20aced3098SEddie James std::string data = active ? "1" : "0";
21aced3098SEddie James auto activeFile = devPath / "occ_active";
22aced3098SEddie James try
23aced3098SEddie James {
24aced3098SEddie James write(activeFile, data);
25aced3098SEddie James }
26aced3098SEddie James catch (const std::exception& e)
27aced3098SEddie James {
28*48002498SPatrick Williams log<level::ERR>(std::format("Failed to set {} active: {}",
29aced3098SEddie James devPath.c_str(), e.what())
30aced3098SEddie James .c_str());
31aced3098SEddie James }
32aced3098SEddie James }
3332e84e98SVishwanatha Subbanna
getPathBack(const fs::path & path)34774f9af9SEddie James std::string Device::getPathBack(const fs::path& path)
35774f9af9SEddie James {
36774f9af9SEddie James if (path.empty())
37bcef3b48SGeorge Liu {
38774f9af9SEddie James return std::string();
39bcef3b48SGeorge Liu }
40774f9af9SEddie James
41774f9af9SEddie James // Points to the last element in the path
42774f9af9SEddie James auto conf = --path.end();
43774f9af9SEddie James
44bcef3b48SGeorge Liu if (conf->empty() && conf != path.begin())
45774f9af9SEddie James {
46774f9af9SEddie James return *(--conf);
47774f9af9SEddie James }
48774f9af9SEddie James else
49774f9af9SEddie James {
50774f9af9SEddie James return *conf;
51774f9af9SEddie James }
52774f9af9SEddie James }
53774f9af9SEddie James
active() const54aced3098SEddie James bool Device::active() const
55aced3098SEddie James {
56aced3098SEddie James return readBinary("occ_active");
57aced3098SEddie James }
58aced3098SEddie James
master() const59636577f4SEdward A. James bool Device::master() const
60636577f4SEdward A. James {
61aced3098SEddie James return readBinary("occ_master");
62aced3098SEddie James }
63aced3098SEddie James
readBinary(const std::string & fileName) const64aced3098SEddie James bool Device::readBinary(const std::string& fileName) const
65aced3098SEddie James {
66bd551de3SChris Cain int v = 0;
67bd551de3SChris Cain if (statusObject.occActive())
68bd551de3SChris Cain {
69aced3098SEddie James auto filePath = devPath / fileName;
70aced3098SEddie James std::ifstream file(filePath, std::ios::in);
71636577f4SEdward A. James if (!file)
72636577f4SEdward A. James {
73636577f4SEdward A. James return false;
74636577f4SEdward A. James }
75636577f4SEdward A. James
76aced3098SEddie James file >> v;
77636577f4SEdward A. James file.close();
78bd551de3SChris Cain }
79aced3098SEddie James return v == 1;
80636577f4SEdward A. James }
81636577f4SEdward A. James
errorCallback(int error)829789e71fSEddie James void Device::errorCallback(int error)
83cbad219eSEddie James {
84cbad219eSEddie James if (error)
85cbad219eSEddie James {
869789e71fSEddie James if (error != -EHOSTDOWN)
879789e71fSEddie James {
889789e71fSEddie James fs::path p = devPath;
899789e71fSEddie James if (fs::is_symlink(p))
909789e71fSEddie James {
919789e71fSEddie James p = fs::read_symlink(p);
929789e71fSEddie James }
93fec4b0b1SMatt Spinler statusObject.deviceError(
94fec4b0b1SMatt Spinler Error::Descriptor("org.open_power.OCC.Device.Error.ReadFailure",
95fec4b0b1SMatt Spinler error, p.c_str()));
969789e71fSEddie James }
979789e71fSEddie James else
989789e71fSEddie James {
999789e71fSEddie James statusObject.deviceError(Error::Descriptor(SAFE_ERROR_PATH));
1009789e71fSEddie James }
101cbad219eSEddie James }
102cbad219eSEddie James }
103cbad219eSEddie James
presenceCallback(int)1049789e71fSEddie James void Device::presenceCallback(int)
1059789e71fSEddie James {
1069789e71fSEddie James statusObject.deviceError(Error::Descriptor(PRESENCE_ERROR_PATH));
1079789e71fSEddie James }
1089789e71fSEddie James
109cbad219eSEddie James #ifdef PLDM
timeoutCallback(int error)1109789e71fSEddie James void Device::timeoutCallback(int error)
111cbad219eSEddie James {
112cbad219eSEddie James if (error)
113cbad219eSEddie James {
114cbad219eSEddie James managerObject.sbeTimeout(instance);
115cbad219eSEddie James }
116cbad219eSEddie James }
117cbad219eSEddie James #endif
118cbad219eSEddie James
throttleProcTempCallback(int error)1199789e71fSEddie James void Device::throttleProcTempCallback(int error)
120482e31ffSEddie James {
121482e31ffSEddie James statusObject.throttleProcTemp(error);
122c86d80faSChris Cain // Update the processor throttle on dbus
123c86d80faSChris Cain statusObject.updateThrottle(error, THROTTLED_THERMAL);
124482e31ffSEddie James }
125482e31ffSEddie James
throttleProcPowerCallback(int error)1269789e71fSEddie James void Device::throttleProcPowerCallback(int error)
127482e31ffSEddie James {
128482e31ffSEddie James statusObject.throttleProcPower(error);
129c86d80faSChris Cain // Update the processor throttle on dbus
130c86d80faSChris Cain statusObject.updateThrottle(error, THROTTLED_POWER);
131482e31ffSEddie James }
132482e31ffSEddie James
throttleMemTempCallback(int error)1339789e71fSEddie James void Device::throttleMemTempCallback(int error)
134482e31ffSEddie James {
135482e31ffSEddie James statusObject.throttleMemTemp(error);
136482e31ffSEddie James }
137482e31ffSEddie James
getFilenameByRegex(fs::path basePath,const std::regex & expr) const138e2d0a43cSChris Cain fs::path Device::getFilenameByRegex(fs::path basePath,
139e2d0a43cSChris Cain const std::regex& expr) const
140e2d0a43cSChris Cain {
141e2d0a43cSChris Cain try
142e2d0a43cSChris Cain {
143e2d0a43cSChris Cain for (auto& file : fs::directory_iterator(basePath))
144e2d0a43cSChris Cain {
145e2d0a43cSChris Cain if (std::regex_search(file.path().string(), expr))
146e2d0a43cSChris Cain {
147e2d0a43cSChris Cain // Found match
148e2d0a43cSChris Cain return file;
149e2d0a43cSChris Cain }
150e2d0a43cSChris Cain }
151e2d0a43cSChris Cain }
152e2d0a43cSChris Cain catch (const fs::filesystem_error& e)
153e2d0a43cSChris Cain {
154e2d0a43cSChris Cain log<level::ERR>(
155*48002498SPatrick Williams std::format("getFilenameByRegex: Failed to get filename: {}",
156e2d0a43cSChris Cain e.what())
157e2d0a43cSChris Cain .c_str());
158e2d0a43cSChris Cain }
159e2d0a43cSChris Cain
160e2d0a43cSChris Cain // Return empty path
161e2d0a43cSChris Cain return fs::path{};
162e2d0a43cSChris Cain }
163e2d0a43cSChris Cain
16432e84e98SVishwanatha Subbanna } // namespace occ
16532e84e98SVishwanatha Subbanna } // namespace open_power
166