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 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 { 28aced3098SEddie James log<level::ERR>(fmt::format("Failed to set {} active: {}", 29aced3098SEddie James devPath.c_str(), e.what()) 30aced3098SEddie James .c_str()); 31aced3098SEddie James } 32aced3098SEddie James } 3332e84e98SVishwanatha Subbanna 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 54aced3098SEddie James bool Device::active() const 55aced3098SEddie James { 56aced3098SEddie James return readBinary("occ_active"); 57aced3098SEddie James } 58aced3098SEddie James 59636577f4SEdward A. James bool Device::master() const 60636577f4SEdward A. James { 61aced3098SEddie James return readBinary("occ_master"); 62aced3098SEddie James } 63aced3098SEddie James 64aced3098SEddie 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 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 } 939789e71fSEddie James statusObject.deviceError(Error::Descriptor( 949789e71fSEddie James "org.open_power.OCC.Device.ReadFailure", error, p.c_str())); 959789e71fSEddie James } 969789e71fSEddie James else 979789e71fSEddie James { 989789e71fSEddie James statusObject.deviceError(Error::Descriptor(SAFE_ERROR_PATH)); 999789e71fSEddie James } 100cbad219eSEddie James } 101cbad219eSEddie James } 102cbad219eSEddie James 1039789e71fSEddie James void Device::presenceCallback(int) 1049789e71fSEddie James { 1059789e71fSEddie James statusObject.deviceError(Error::Descriptor(PRESENCE_ERROR_PATH)); 1069789e71fSEddie James } 1079789e71fSEddie James 108cbad219eSEddie James #ifdef PLDM 1099789e71fSEddie James void Device::timeoutCallback(int error) 110cbad219eSEddie James { 111cbad219eSEddie James if (error) 112cbad219eSEddie James { 113cbad219eSEddie James managerObject.sbeTimeout(instance); 114cbad219eSEddie James } 115cbad219eSEddie James } 116cbad219eSEddie James #endif 117cbad219eSEddie James 1189789e71fSEddie James void Device::throttleProcTempCallback(int error) 119482e31ffSEddie James { 120482e31ffSEddie James statusObject.throttleProcTemp(error); 121*c86d80faSChris Cain // Update the processor throttle on dbus 122*c86d80faSChris Cain statusObject.updateThrottle(error, THROTTLED_THERMAL); 123482e31ffSEddie James } 124482e31ffSEddie James 1259789e71fSEddie James void Device::throttleProcPowerCallback(int error) 126482e31ffSEddie James { 127482e31ffSEddie James statusObject.throttleProcPower(error); 128*c86d80faSChris Cain // Update the processor throttle on dbus 129*c86d80faSChris Cain statusObject.updateThrottle(error, THROTTLED_POWER); 130482e31ffSEddie James } 131482e31ffSEddie James 1329789e71fSEddie James void Device::throttleMemTempCallback(int error) 133482e31ffSEddie James { 134482e31ffSEddie James statusObject.throttleMemTemp(error); 135482e31ffSEddie James } 136482e31ffSEddie James 137e2d0a43cSChris Cain fs::path Device::getFilenameByRegex(fs::path basePath, 138e2d0a43cSChris Cain const std::regex& expr) const 139e2d0a43cSChris Cain { 140e2d0a43cSChris Cain try 141e2d0a43cSChris Cain { 142e2d0a43cSChris Cain for (auto& file : fs::directory_iterator(basePath)) 143e2d0a43cSChris Cain { 144e2d0a43cSChris Cain if (std::regex_search(file.path().string(), expr)) 145e2d0a43cSChris Cain { 146e2d0a43cSChris Cain // Found match 147e2d0a43cSChris Cain return file; 148e2d0a43cSChris Cain } 149e2d0a43cSChris Cain } 150e2d0a43cSChris Cain } 151e2d0a43cSChris Cain catch (const fs::filesystem_error& e) 152e2d0a43cSChris Cain { 153e2d0a43cSChris Cain log<level::ERR>( 154e2d0a43cSChris Cain fmt::format("getFilenameByRegex: Failed to get filename: {}", 155e2d0a43cSChris Cain e.what()) 156e2d0a43cSChris Cain .c_str()); 157e2d0a43cSChris Cain } 158e2d0a43cSChris Cain 159e2d0a43cSChris Cain // Return empty path 160e2d0a43cSChris Cain return fs::path{}; 161e2d0a43cSChris Cain } 162e2d0a43cSChris Cain 16332e84e98SVishwanatha Subbanna } // namespace occ 16432e84e98SVishwanatha Subbanna } // namespace open_power 165