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 { 66*bd551de3SChris Cain int v = 0; 67*bd551de3SChris Cain if (statusObject.occActive()) 68*bd551de3SChris 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(); 78*bd551de3SChris Cain } 79aced3098SEddie James return v == 1; 80636577f4SEdward A. James } 81636577f4SEdward A. James 82cbad219eSEddie James void Device::errorCallback(bool error) 83cbad219eSEddie James { 84cbad219eSEddie James if (error) 85cbad219eSEddie James { 86cbad219eSEddie James statusObject.deviceError(); 87cbad219eSEddie James } 88cbad219eSEddie James } 89cbad219eSEddie James 90cbad219eSEddie James #ifdef PLDM 91cbad219eSEddie James void Device::timeoutCallback(bool error) 92cbad219eSEddie James { 93cbad219eSEddie James if (error) 94cbad219eSEddie James { 95cbad219eSEddie James managerObject.sbeTimeout(instance); 96cbad219eSEddie James } 97cbad219eSEddie James } 98cbad219eSEddie James #endif 99cbad219eSEddie James 100482e31ffSEddie James void Device::throttleProcTempCallback(bool error) 101482e31ffSEddie James { 102482e31ffSEddie James statusObject.throttleProcTemp(error); 103482e31ffSEddie James } 104482e31ffSEddie James 105482e31ffSEddie James void Device::throttleProcPowerCallback(bool error) 106482e31ffSEddie James { 107482e31ffSEddie James statusObject.throttleProcPower(error); 108482e31ffSEddie James } 109482e31ffSEddie James 110482e31ffSEddie James void Device::throttleMemTempCallback(bool error) 111482e31ffSEddie James { 112482e31ffSEddie James statusObject.throttleMemTemp(error); 113482e31ffSEddie James } 114482e31ffSEddie James 115e2d0a43cSChris Cain fs::path Device::getFilenameByRegex(fs::path basePath, 116e2d0a43cSChris Cain const std::regex& expr) const 117e2d0a43cSChris Cain { 118e2d0a43cSChris Cain try 119e2d0a43cSChris Cain { 120e2d0a43cSChris Cain for (auto& file : fs::directory_iterator(basePath)) 121e2d0a43cSChris Cain { 122e2d0a43cSChris Cain if (std::regex_search(file.path().string(), expr)) 123e2d0a43cSChris Cain { 124e2d0a43cSChris Cain // Found match 125e2d0a43cSChris Cain return file; 126e2d0a43cSChris Cain } 127e2d0a43cSChris Cain } 128e2d0a43cSChris Cain } 129e2d0a43cSChris Cain catch (const fs::filesystem_error& e) 130e2d0a43cSChris Cain { 131e2d0a43cSChris Cain log<level::ERR>( 132e2d0a43cSChris Cain fmt::format("getFilenameByRegex: Failed to get filename: {}", 133e2d0a43cSChris Cain e.what()) 134e2d0a43cSChris Cain .c_str()); 135e2d0a43cSChris Cain } 136e2d0a43cSChris Cain 137e2d0a43cSChris Cain // Return empty path 138e2d0a43cSChris Cain return fs::path{}; 139e2d0a43cSChris Cain } 140e2d0a43cSChris Cain 14132e84e98SVishwanatha Subbanna } // namespace occ 14232e84e98SVishwanatha Subbanna } // namespace open_power 143