18457f821SDeepak Kodihalli ## This file is a template. The comment below is emitted 28457f821SDeepak Kodihalli ## into the rendered file; feel free to edit this file. 38457f821SDeepak Kodihalli // WARNING: Generated header. Do not edit! 48457f821SDeepak Kodihalli 58457f821SDeepak Kodihalli 68457f821SDeepak Kodihalli #pragma once 78457f821SDeepak Kodihalli 88457f821SDeepak Kodihalli #include <map> 98457f821SDeepak Kodihalli #include <iostream> 10*4cf89a10SDeepak Kodihalli #include <sdbusplus/server.hpp> 11*4cf89a10SDeepak Kodihalli #include <log.hpp> 128457f821SDeepak Kodihalli #include "defines.hpp" 138457f821SDeepak Kodihalli #include "store.hpp" 148457f821SDeepak Kodihalli 158457f821SDeepak Kodihalli namespace openpower 168457f821SDeepak Kodihalli { 178457f821SDeepak Kodihalli namespace vpd 188457f821SDeepak Kodihalli { 198457f821SDeepak Kodihalli namespace inventory 208457f821SDeepak Kodihalli { 218457f821SDeepak Kodihalli 22*4cf89a10SDeepak Kodihalli using Property = std::string; 23*4cf89a10SDeepak Kodihalli using Value = sdbusplus::message::variant<bool, int64_t, std::string>; 24*4cf89a10SDeepak Kodihalli using PropertyMap = std::map<Property, Value>; 258457f821SDeepak Kodihalli 26*4cf89a10SDeepak Kodihalli using Interface = std::string; 27*4cf89a10SDeepak Kodihalli using InterfaceMap = std::map<Interface, PropertyMap>; 28*4cf89a10SDeepak Kodihalli 29*4cf89a10SDeepak Kodihalli using Object = sdbusplus::message::object_path; 30*4cf89a10SDeepak Kodihalli using ObjectMap = std::map<Object, InterfaceMap>; 31*4cf89a10SDeepak Kodihalli 32*4cf89a10SDeepak Kodihalli using namespace std::string_literals; 33*4cf89a10SDeepak Kodihalli static const auto pimPath = "/xyz/openbmc_project/Inventory"s; 34*4cf89a10SDeepak Kodihalli static const auto pimIntf = "xyz.openbmc_project.Inventory.Manager"s; 35*4cf89a10SDeepak Kodihalli 36*4cf89a10SDeepak Kodihalli /** @brief Get inventory-manager's d-bus service 37*4cf89a10SDeepak Kodihalli */ 38*4cf89a10SDeepak Kodihalli auto getPIMService() 398457f821SDeepak Kodihalli { 40*4cf89a10SDeepak Kodihalli auto bus = sdbusplus::bus::new_default(); 41*4cf89a10SDeepak Kodihalli auto mapper = 42*4cf89a10SDeepak Kodihalli bus.new_method_call( 43*4cf89a10SDeepak Kodihalli "xyz.openbmc_project.ObjectMapper", 44*4cf89a10SDeepak Kodihalli "/xyz/openbmc_project/ObjectMapper", 45*4cf89a10SDeepak Kodihalli "xyz.openbmc_project.ObjectMapper", 46*4cf89a10SDeepak Kodihalli "GetObject"); 47*4cf89a10SDeepak Kodihalli 48*4cf89a10SDeepak Kodihalli mapper.append(pimPath); 49*4cf89a10SDeepak Kodihalli mapper.append(std::vector<std::string>({pimIntf})); 50*4cf89a10SDeepak Kodihalli 51*4cf89a10SDeepak Kodihalli auto result = bus.call(mapper); 52*4cf89a10SDeepak Kodihalli if(result.is_method_error()) 538457f821SDeepak Kodihalli { 54*4cf89a10SDeepak Kodihalli throw std::runtime_error("ObjectMapper GetObject failed"); 558457f821SDeepak Kodihalli } 56*4cf89a10SDeepak Kodihalli 57*4cf89a10SDeepak Kodihalli std::map<std::string, std::vector<std::string>> response; 58*4cf89a10SDeepak Kodihalli result.read(response); 59*4cf89a10SDeepak Kodihalli if(response.empty()) 60*4cf89a10SDeepak Kodihalli { 61*4cf89a10SDeepak Kodihalli throw std::runtime_error("ObjectMapper GetObject bad response"); 628457f821SDeepak Kodihalli } 63*4cf89a10SDeepak Kodihalli 64*4cf89a10SDeepak Kodihalli return response.begin()->first; 65*4cf89a10SDeepak Kodihalli } 66*4cf89a10SDeepak Kodihalli 67*4cf89a10SDeepak Kodihalli auto callPIM(ObjectMap&& objects) 68*4cf89a10SDeepak Kodihalli { 69*4cf89a10SDeepak Kodihalli std::string service; 70*4cf89a10SDeepak Kodihalli 71*4cf89a10SDeepak Kodihalli try 72*4cf89a10SDeepak Kodihalli { 73*4cf89a10SDeepak Kodihalli service = getPIMService(); 74*4cf89a10SDeepak Kodihalli auto bus = sdbusplus::bus::new_default(); 75*4cf89a10SDeepak Kodihalli auto pimMsg = bus.new_method_call( 76*4cf89a10SDeepak Kodihalli service.c_str(), 77*4cf89a10SDeepak Kodihalli pimPath.c_str(), 78*4cf89a10SDeepak Kodihalli pimIntf.c_str(), 79*4cf89a10SDeepak Kodihalli "Notify"); 80*4cf89a10SDeepak Kodihalli pimMsg.append(std::move(objects)); 81*4cf89a10SDeepak Kodihalli auto result = bus.call(pimMsg); 82*4cf89a10SDeepak Kodihalli if(result.is_method_error()) 83*4cf89a10SDeepak Kodihalli { 84*4cf89a10SDeepak Kodihalli std::cerr << "PIM Notify() failed\n"; 85*4cf89a10SDeepak Kodihalli } 86*4cf89a10SDeepak Kodihalli } 87*4cf89a10SDeepak Kodihalli catch (const std::runtime_error& e) 88*4cf89a10SDeepak Kodihalli { 89*4cf89a10SDeepak Kodihalli using namespace phosphor::logging; 90*4cf89a10SDeepak Kodihalli log<level::ERR>(e.what()); 91*4cf89a10SDeepak Kodihalli } 92*4cf89a10SDeepak Kodihalli } 938457f821SDeepak Kodihalli 948457f821SDeepak Kodihalli /** @brief API to write parsed VPD to inventory, 958457f821SDeepak Kodihalli * for a specifc FRU 968457f821SDeepak Kodihalli * 978457f821SDeepak Kodihalli * @param [in] vpdStore - Store object containing 988457f821SDeepak Kodihalli * parsed VPD 998457f821SDeepak Kodihalli * @param [in] path - FRU object path 1008457f821SDeepak Kodihalli */ 1018457f821SDeepak Kodihalli template<Fru F> 1028457f821SDeepak Kodihalli void writeFru(const Store& vpdStore, const std::string& path); 1038457f821SDeepak Kodihalli 1048457f821SDeepak Kodihalli % for key in fruDict.iterkeys(): 1058457f821SDeepak Kodihalli <% 1068457f821SDeepak Kodihalli fru = fruDict[key] 1078457f821SDeepak Kodihalli %>\ 1088457f821SDeepak Kodihalli // Specialization of ${key} 1098457f821SDeepak Kodihalli template<> 1108457f821SDeepak Kodihalli void writeFru<Fru::${key}>(const Store& vpdStore, 1118457f821SDeepak Kodihalli const std::string& path) 1128457f821SDeepak Kodihalli { 113*4cf89a10SDeepak Kodihalli ObjectMap objects; 114*4cf89a10SDeepak Kodihalli InterfaceMap interfaces; 1158457f821SDeepak Kodihalli 1168457f821SDeepak Kodihalli // Inventory manager needs object path, list of interface names to be 1178457f821SDeepak Kodihalli // implemented, and property:value pairs contained in said interfaces 1188457f821SDeepak Kodihalli 119*4cf89a10SDeepak Kodihalli % for interface, properties in fru.iteritems(): 1208457f821SDeepak Kodihalli <% 121*4cf89a10SDeepak Kodihalli names = interface.split(".") 122*4cf89a10SDeepak Kodihalli intfName = names[0] + names[-1] 1238457f821SDeepak Kodihalli %>\ 124*4cf89a10SDeepak Kodihalli PropertyMap ${intfName}Props; 1258457f821SDeepak Kodihalli % for name, value in properties.iteritems(): 126*4cf89a10SDeepak Kodihalli % if fru and interface and name and value: 1278457f821SDeepak Kodihalli <% 1288457f821SDeepak Kodihalli record, keyword = value.split(",") 1298457f821SDeepak Kodihalli %>\ 130*4cf89a10SDeepak Kodihalli ${intfName}Props["${name}"] = 1318457f821SDeepak Kodihalli vpdStore.get<Record::${record}, record::Keyword::${keyword}>(); 1328457f821SDeepak Kodihalli % endif 1338457f821SDeepak Kodihalli % endfor 134*4cf89a10SDeepak Kodihalli interfaces.emplace("${interface}", 135*4cf89a10SDeepak Kodihalli std::move(${intfName}Props)); 1368457f821SDeepak Kodihalli % endfor 1378457f821SDeepak Kodihalli 138*4cf89a10SDeepak Kodihalli sdbusplus::message::object_path object(path); 139*4cf89a10SDeepak Kodihalli objects.emplace(std::move(object), std::move(interfaces)); 140*4cf89a10SDeepak Kodihalli 141*4cf89a10SDeepak Kodihalli callPIM(std::move(objects)); 1428457f821SDeepak Kodihalli } 1438457f821SDeepak Kodihalli 1448457f821SDeepak Kodihalli % endfor 1458457f821SDeepak Kodihalli } // namespace inventory 1468457f821SDeepak Kodihalli } // namespace vpd 1478457f821SDeepak Kodihalli } // namespace openpower 148