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 } 93*fec4b0b1SMatt Spinler statusObject.deviceError( 94*fec4b0b1SMatt Spinler Error::Descriptor("org.open_power.OCC.Device.Error.ReadFailure", 95*fec4b0b1SMatt 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 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 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 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 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 1339789e71fSEddie James void Device::throttleMemTempCallback(int error) 134482e31ffSEddie James { 135482e31ffSEddie James statusObject.throttleMemTemp(error); 136482e31ffSEddie James } 137482e31ffSEddie James 138e2d0a43cSChris 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>( 155e2d0a43cSChris Cain fmt::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