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 18*aced3098SEddie James void Device::setActive(bool active) 19*aced3098SEddie James { 20*aced3098SEddie James std::string data = active ? "1" : "0"; 21*aced3098SEddie James auto activeFile = devPath / "occ_active"; 22*aced3098SEddie James try 23*aced3098SEddie James { 24*aced3098SEddie James write(activeFile, data); 25*aced3098SEddie James } 26*aced3098SEddie James catch (const std::exception& e) 27*aced3098SEddie James { 28*aced3098SEddie James log<level::ERR>(fmt::format("Failed to set {} active: {}", 29*aced3098SEddie James devPath.c_str(), e.what()) 30*aced3098SEddie James .c_str()); 31*aced3098SEddie James } 32*aced3098SEddie 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 54*aced3098SEddie James bool Device::active() const 55*aced3098SEddie James { 56*aced3098SEddie James return readBinary("occ_active"); 57*aced3098SEddie James } 58*aced3098SEddie James 59636577f4SEdward A. James bool Device::master() const 60636577f4SEdward A. James { 61*aced3098SEddie James return readBinary("occ_master"); 62*aced3098SEddie James } 63*aced3098SEddie James 64*aced3098SEddie James bool Device::readBinary(const std::string& fileName) const 65*aced3098SEddie James { 66*aced3098SEddie James int v; 67*aced3098SEddie James auto filePath = devPath / fileName; 68*aced3098SEddie James std::ifstream file(filePath, std::ios::in); 69636577f4SEdward A. James 70636577f4SEdward A. James if (!file) 71636577f4SEdward A. James { 72636577f4SEdward A. James return false; 73636577f4SEdward A. James } 74636577f4SEdward A. James 75*aced3098SEddie James file >> v; 76636577f4SEdward A. James file.close(); 77*aced3098SEddie James return v == 1; 78636577f4SEdward A. James } 79636577f4SEdward A. James 80cbad219eSEddie James void Device::errorCallback(bool error) 81cbad219eSEddie James { 82cbad219eSEddie James if (error) 83cbad219eSEddie James { 84cbad219eSEddie James statusObject.deviceError(); 85cbad219eSEddie James } 86cbad219eSEddie James } 87cbad219eSEddie James 88cbad219eSEddie James #ifdef PLDM 89cbad219eSEddie James void Device::timeoutCallback(bool error) 90cbad219eSEddie James { 91cbad219eSEddie James if (error) 92cbad219eSEddie James { 93cbad219eSEddie James managerObject.sbeTimeout(instance); 94cbad219eSEddie James } 95cbad219eSEddie James } 96cbad219eSEddie James #endif 97cbad219eSEddie James 98482e31ffSEddie James void Device::throttleProcTempCallback(bool error) 99482e31ffSEddie James { 100482e31ffSEddie James statusObject.throttleProcTemp(error); 101482e31ffSEddie James } 102482e31ffSEddie James 103482e31ffSEddie James void Device::throttleProcPowerCallback(bool error) 104482e31ffSEddie James { 105482e31ffSEddie James statusObject.throttleProcPower(error); 106482e31ffSEddie James } 107482e31ffSEddie James 108482e31ffSEddie James void Device::throttleMemTempCallback(bool error) 109482e31ffSEddie James { 110482e31ffSEddie James statusObject.throttleMemTemp(error); 111482e31ffSEddie James } 112482e31ffSEddie James 113e2d0a43cSChris Cain fs::path Device::getFilenameByRegex(fs::path basePath, 114e2d0a43cSChris Cain const std::regex& expr) const 115e2d0a43cSChris Cain { 116e2d0a43cSChris Cain try 117e2d0a43cSChris Cain { 118e2d0a43cSChris Cain for (auto& file : fs::directory_iterator(basePath)) 119e2d0a43cSChris Cain { 120e2d0a43cSChris Cain if (std::regex_search(file.path().string(), expr)) 121e2d0a43cSChris Cain { 122e2d0a43cSChris Cain // Found match 123e2d0a43cSChris Cain return file; 124e2d0a43cSChris Cain } 125e2d0a43cSChris Cain } 126e2d0a43cSChris Cain } 127e2d0a43cSChris Cain catch (const fs::filesystem_error& e) 128e2d0a43cSChris Cain { 129e2d0a43cSChris Cain log<level::ERR>( 130e2d0a43cSChris Cain fmt::format("getFilenameByRegex: Failed to get filename: {}", 131e2d0a43cSChris Cain e.what()) 132e2d0a43cSChris Cain .c_str()); 133e2d0a43cSChris Cain } 134e2d0a43cSChris Cain 135e2d0a43cSChris Cain // Return empty path 136e2d0a43cSChris Cain return fs::path{}; 137e2d0a43cSChris Cain } 138e2d0a43cSChris Cain 13932e84e98SVishwanatha Subbanna } // namespace occ 14032e84e98SVishwanatha Subbanna } // namespace open_power 141