1 #include "config.h" 2 3 #include "single_fab.hpp" 4 5 #include "constants.hpp" 6 #include "types.hpp" 7 8 #include <utility/json_utility.hpp> 9 10 namespace vpd 11 { 12 constexpr auto pimPersistVsbpPath = 13 "/var/lib/phosphor-inventory-manager/xyz/openbmc_project/inventory/system/chassis/motherboard/com.ibm.ipzvpd.VSBP"; 14 constexpr auto IM_SIZE_IN_BYTES = 0x04; 15 constexpr auto IM_KW_VALUE_OFFSET = 0x000005fb; 16 17 std::string SingleFab::getImFromPersistedLocation() const noexcept 18 { 19 try 20 { 21 auto l_parsedVsbpJsonObj = 22 jsonUtility::getParsedJson(pimPersistVsbpPath); 23 if (!l_parsedVsbpJsonObj.contains("value0") || 24 !l_parsedVsbpJsonObj["value0"].contains(constants::kwdIM) || 25 !l_parsedVsbpJsonObj["value0"][constants::kwdIM].is_array()) 26 { 27 throw std::runtime_error( 28 "Json is empty or mandatory tag(s) missing from JSON"); 29 } 30 31 const types::BinaryVector l_imValue = 32 l_parsedVsbpJsonObj["value0"][constants::kwdIM] 33 .get<types::BinaryVector>(); 34 35 std::ostringstream l_imData; 36 for (const auto& l_byte : l_imValue) 37 { 38 l_imData << std::setw(2) << std::setfill('0') << std::hex 39 << static_cast<int>(l_byte); 40 } 41 return l_imData.str(); 42 } 43 catch (const std::exception& l_ex) 44 { 45 logging::logMessage( 46 "Error while getting IM value from PIM persisted file: " + 47 std::string(pimPersistVsbpPath) + 48 ", reason: " + std::string(l_ex.what())); 49 } 50 51 return std::string(); 52 } 53 54 std::string SingleFab::getImFromPlanar() const noexcept 55 { 56 try 57 { 58 types::BinaryVector l_imValue(IM_SIZE_IN_BYTES); 59 std::fstream l_vpdFileStream; 60 61 l_vpdFileStream.exceptions( 62 std::ifstream::badbit | std::ifstream::failbit); 63 64 l_vpdFileStream.open(SYSTEM_VPD_FILE_PATH, 65 std::ios::in | std::ios::binary); 66 67 l_vpdFileStream.seekg(IM_KW_VALUE_OFFSET, std::ios_base::beg); 68 69 // Read keyword value 70 l_vpdFileStream.read(reinterpret_cast<char*>(&l_imValue[0]), 71 IM_SIZE_IN_BYTES); 72 73 l_vpdFileStream.clear(std::ios_base::eofbit); 74 75 std::ostringstream l_imData; 76 for (const auto& l_byte : l_imValue) 77 { 78 l_imData << std::setw(2) << std::setfill('0') << std::hex 79 << static_cast<int>(l_byte); 80 } 81 return l_imData.str(); 82 } 83 catch (const std::ifstream::failure& l_ex) 84 {} 85 86 return std::string(); 87 } 88 } // namespace vpd 89