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