blob: c83b1ff120a9846a3b68f1cddf2ae576b402c7f4 [file] [log] [blame]
Vishwanatha Subbanna32e84e92017-06-28 19:17:28 +05301#include "occ_device.hpp"
Gunnar Mills94df8c92018-09-14 14:50:03 -05002
Eddie Jamescbad2192021-10-07 09:39:39 -05003#include "occ_manager.hpp"
Eddie James482e31f2017-09-14 13:17:17 -05004#include "occ_status.hpp"
Vishwanatha Subbanna32e84e92017-06-28 19:17:28 +05305
Chris Caine2d0a432022-03-28 11:08:49 -05006#include <phosphor-logging/log.hpp>
7
8#include <filesystem>
Gunnar Mills94df8c92018-09-14 14:50:03 -05009#include <iostream>
10
Vishwanatha Subbanna32e84e92017-06-28 19:17:28 +053011namespace open_power
12{
13namespace occ
14{
15
Chris Caine2d0a432022-03-28 11:08:49 -050016using namespace phosphor::logging;
17
Eddie Jamesaced3092022-04-22 16:19:30 -050018void Device::setActive(bool active)
19{
20 std::string data = active ? "1" : "0";
21 auto activeFile = devPath / "occ_active";
22 try
23 {
24 write(activeFile, data);
25 }
26 catch (const std::exception& e)
27 {
28 log<level::ERR>(fmt::format("Failed to set {} active: {}",
29 devPath.c_str(), e.what())
30 .c_str());
31 }
32}
Vishwanatha Subbanna32e84e92017-06-28 19:17:28 +053033
Eddie James774f9af2019-03-19 20:58:53 +000034std::string Device::getPathBack(const fs::path& path)
35{
36 if (path.empty())
George Liubcef3b42021-09-10 12:39:02 +080037 {
Eddie James774f9af2019-03-19 20:58:53 +000038 return std::string();
George Liubcef3b42021-09-10 12:39:02 +080039 }
Eddie James774f9af2019-03-19 20:58:53 +000040
41 // Points to the last element in the path
42 auto conf = --path.end();
43
George Liubcef3b42021-09-10 12:39:02 +080044 if (conf->empty() && conf != path.begin())
Eddie James774f9af2019-03-19 20:58:53 +000045 {
46 return *(--conf);
47 }
48 else
49 {
50 return *conf;
51 }
52}
53
Eddie Jamesaced3092022-04-22 16:19:30 -050054bool Device::active() const
55{
56 return readBinary("occ_active");
57}
58
Edward A. James636577f2017-10-06 10:53:55 -050059bool Device::master() const
60{
Eddie Jamesaced3092022-04-22 16:19:30 -050061 return readBinary("occ_master");
62}
63
64bool Device::readBinary(const std::string& fileName) const
65{
Chris Cainbd551de2022-04-26 13:41:16 -050066 int v = 0;
67 if (statusObject.occActive())
Edward A. James636577f2017-10-06 10:53:55 -050068 {
Chris Cainbd551de2022-04-26 13:41:16 -050069 auto filePath = devPath / fileName;
70 std::ifstream file(filePath, std::ios::in);
71 if (!file)
72 {
73 return false;
74 }
Edward A. James636577f2017-10-06 10:53:55 -050075
Chris Cainbd551de2022-04-26 13:41:16 -050076 file >> v;
77 file.close();
78 }
Eddie Jamesaced3092022-04-22 16:19:30 -050079 return v == 1;
Edward A. James636577f2017-10-06 10:53:55 -050080}
81
Eddie James9789e712022-05-25 15:43:40 -050082void Device::errorCallback(int error)
Eddie Jamescbad2192021-10-07 09:39:39 -050083{
84 if (error)
85 {
Eddie James9789e712022-05-25 15:43:40 -050086 if (error != -EHOSTDOWN)
87 {
88 fs::path p = devPath;
89 if (fs::is_symlink(p))
90 {
91 p = fs::read_symlink(p);
92 }
Matt Spinlerfec4b0b2024-01-04 15:10:37 -060093 statusObject.deviceError(
94 Error::Descriptor("org.open_power.OCC.Device.Error.ReadFailure",
95 error, p.c_str()));
Eddie James9789e712022-05-25 15:43:40 -050096 }
97 else
98 {
99 statusObject.deviceError(Error::Descriptor(SAFE_ERROR_PATH));
100 }
Eddie Jamescbad2192021-10-07 09:39:39 -0500101 }
102}
103
Eddie James9789e712022-05-25 15:43:40 -0500104void Device::presenceCallback(int)
105{
106 statusObject.deviceError(Error::Descriptor(PRESENCE_ERROR_PATH));
107}
108
Eddie Jamescbad2192021-10-07 09:39:39 -0500109#ifdef PLDM
Eddie James9789e712022-05-25 15:43:40 -0500110void Device::timeoutCallback(int error)
Eddie Jamescbad2192021-10-07 09:39:39 -0500111{
112 if (error)
113 {
114 managerObject.sbeTimeout(instance);
115 }
116}
117#endif
118
Eddie James9789e712022-05-25 15:43:40 -0500119void Device::throttleProcTempCallback(int error)
Eddie James482e31f2017-09-14 13:17:17 -0500120{
Gunnar Mills94df8c92018-09-14 14:50:03 -0500121 statusObject.throttleProcTemp(error);
Chris Cainc86d80f2023-05-04 15:49:18 -0500122 // Update the processor throttle on dbus
123 statusObject.updateThrottle(error, THROTTLED_THERMAL);
Eddie James482e31f2017-09-14 13:17:17 -0500124}
125
Eddie James9789e712022-05-25 15:43:40 -0500126void Device::throttleProcPowerCallback(int error)
Eddie James482e31f2017-09-14 13:17:17 -0500127{
Gunnar Mills94df8c92018-09-14 14:50:03 -0500128 statusObject.throttleProcPower(error);
Chris Cainc86d80f2023-05-04 15:49:18 -0500129 // Update the processor throttle on dbus
130 statusObject.updateThrottle(error, THROTTLED_POWER);
Eddie James482e31f2017-09-14 13:17:17 -0500131}
132
Eddie James9789e712022-05-25 15:43:40 -0500133void Device::throttleMemTempCallback(int error)
Eddie James482e31f2017-09-14 13:17:17 -0500134{
Gunnar Mills94df8c92018-09-14 14:50:03 -0500135 statusObject.throttleMemTemp(error);
Eddie James482e31f2017-09-14 13:17:17 -0500136}
137
Chris Caine2d0a432022-03-28 11:08:49 -0500138fs::path Device::getFilenameByRegex(fs::path basePath,
139 const std::regex& expr) const
140{
141 try
142 {
143 for (auto& file : fs::directory_iterator(basePath))
144 {
145 if (std::regex_search(file.path().string(), expr))
146 {
147 // Found match
148 return file;
149 }
150 }
151 }
152 catch (const fs::filesystem_error& e)
153 {
154 log<level::ERR>(
155 fmt::format("getFilenameByRegex: Failed to get filename: {}",
156 e.what())
157 .c_str());
158 }
159
160 // Return empty path
161 return fs::path{};
162}
163
Vishwanatha Subbanna32e84e92017-06-28 19:17:28 +0530164} // namespace occ
165} // namespace open_power