1 #include <fcntl.h> 2 #include <unistd.h> 3 #include <sys/ioctl.h> 4 #include <errno.h> 5 #include <phosphor-logging/log.hpp> 6 #include <phosphor-logging/elog.hpp> 7 #include <xyz/openbmc_project/Common/error.hpp> 8 #include <org/open_power/OCC/Device/error.hpp> 9 #include "occ_presence.hpp" 10 #include "occ_manager.hpp" 11 #include "elog-errors.hpp" 12 13 namespace open_power 14 { 15 namespace occ 16 { 17 18 // Reads the occs_present file and analyzes the data 19 void Presence::analyzeEvent() 20 { 21 using namespace phosphor::logging; 22 using namespace sdbusplus::org::open_power::OCC::Device::Error; 23 24 // Get the number of bytes to read 25 int len = -1; 26 auto r = ioctl(fd, FIONREAD, &len); 27 if (r < 0) 28 { 29 elog<ConfigFailure>( 30 phosphor::logging::org::open_power::OCC::Device:: 31 ConfigFailure::CALLOUT_ERRNO(errno), 32 phosphor::logging::org::open_power::OCC::Device:: 33 ConfigFailure::CALLOUT_DEVICE_PATH(file.c_str())); 34 } 35 36 auto data = readFile(len); 37 if (data.empty()) 38 { 39 return; 40 } 41 42 // Let stoi determine the base 43 auto occsPresent = std::stoi(data, nullptr, 0); 44 if (manager.getNumOCCs() != occsPresent) 45 { 46 log<level::INFO>("OCC presence mismatch", 47 entry("BMC_OCCS=%d", manager.getNumOCCs(), 48 entry("OCC_OCCS=%d", occsPresent))); 49 if (callBack) 50 { 51 callBack(true); 52 } 53 } 54 } 55 56 } // namespace occ 57 } // namespace open_power 58