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 82*9789e71fSEddie James void Device::errorCallback(int error) 83cbad219eSEddie James { 84cbad219eSEddie James if (error) 85cbad219eSEddie James { 86*9789e71fSEddie James if (error != -EHOSTDOWN) 87*9789e71fSEddie James { 88*9789e71fSEddie James fs::path p = devPath; 89*9789e71fSEddie James if (fs::is_symlink(p)) 90*9789e71fSEddie James { 91*9789e71fSEddie James p = fs::read_symlink(p); 92*9789e71fSEddie James } 93*9789e71fSEddie James statusObject.deviceError(Error::Descriptor( 94*9789e71fSEddie James "org.open_power.OCC.Device.ReadFailure", error, p.c_str())); 95*9789e71fSEddie James } 96*9789e71fSEddie James else 97*9789e71fSEddie James { 98*9789e71fSEddie James statusObject.deviceError(Error::Descriptor(SAFE_ERROR_PATH)); 99*9789e71fSEddie James } 100cbad219eSEddie James } 101cbad219eSEddie James } 102cbad219eSEddie James 103*9789e71fSEddie James void Device::presenceCallback(int) 104*9789e71fSEddie James { 105*9789e71fSEddie James statusObject.deviceError(Error::Descriptor(PRESENCE_ERROR_PATH)); 106*9789e71fSEddie James } 107*9789e71fSEddie James 108cbad219eSEddie James #ifdef PLDM 109*9789e71fSEddie 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 118*9789e71fSEddie James void Device::throttleProcTempCallback(int error) 119482e31ffSEddie James { 120482e31ffSEddie James statusObject.throttleProcTemp(error); 121482e31ffSEddie James } 122482e31ffSEddie James 123*9789e71fSEddie James void Device::throttleProcPowerCallback(int error) 124482e31ffSEddie James { 125482e31ffSEddie James statusObject.throttleProcPower(error); 126482e31ffSEddie James } 127482e31ffSEddie James 128*9789e71fSEddie James void Device::throttleMemTempCallback(int error) 129482e31ffSEddie James { 130482e31ffSEddie James statusObject.throttleMemTemp(error); 131482e31ffSEddie James } 132482e31ffSEddie James 133e2d0a43cSChris Cain fs::path Device::getFilenameByRegex(fs::path basePath, 134e2d0a43cSChris Cain const std::regex& expr) const 135e2d0a43cSChris Cain { 136e2d0a43cSChris Cain try 137e2d0a43cSChris Cain { 138e2d0a43cSChris Cain for (auto& file : fs::directory_iterator(basePath)) 139e2d0a43cSChris Cain { 140e2d0a43cSChris Cain if (std::regex_search(file.path().string(), expr)) 141e2d0a43cSChris Cain { 142e2d0a43cSChris Cain // Found match 143e2d0a43cSChris Cain return file; 144e2d0a43cSChris Cain } 145e2d0a43cSChris Cain } 146e2d0a43cSChris Cain } 147e2d0a43cSChris Cain catch (const fs::filesystem_error& e) 148e2d0a43cSChris Cain { 149e2d0a43cSChris Cain log<level::ERR>( 150e2d0a43cSChris Cain fmt::format("getFilenameByRegex: Failed to get filename: {}", 151e2d0a43cSChris Cain e.what()) 152e2d0a43cSChris Cain .c_str()); 153e2d0a43cSChris Cain } 154e2d0a43cSChris Cain 155e2d0a43cSChris Cain // Return empty path 156e2d0a43cSChris Cain return fs::path{}; 157e2d0a43cSChris Cain } 158e2d0a43cSChris Cain 15932e84e98SVishwanatha Subbanna } // namespace occ 16032e84e98SVishwanatha Subbanna } // namespace open_power 161