xref: /openbmc/pldm/libpldmresponder/platform_config.cpp (revision 2edc34bb36691e432e91cb6f48823c1123f05c2d)
13c50c82aSKamalkumar Patel #include "platform_config.hpp"
23c50c82aSKamalkumar Patel 
33c50c82aSKamalkumar Patel namespace pldm
43c50c82aSKamalkumar Patel {
53c50c82aSKamalkumar Patel namespace responder
63c50c82aSKamalkumar Patel {
73c50c82aSKamalkumar Patel 
83c50c82aSKamalkumar Patel namespace platform_config
93c50c82aSKamalkumar Patel {
103c50c82aSKamalkumar Patel /** @brief callback function invoked when interfaces get added from
113c50c82aSKamalkumar Patel  *      Entity manager
123c50c82aSKamalkumar Patel  *
133c50c82aSKamalkumar Patel  *  @param[in] msg - Data associated with subscribed signal
143c50c82aSKamalkumar Patel  */
153c50c82aSKamalkumar Patel void Handler::systemCompatibleCallback(sdbusplus::message_t& msg)
163c50c82aSKamalkumar Patel {
173c50c82aSKamalkumar Patel     sdbusplus::message::object_path path;
183c50c82aSKamalkumar Patel 
193c50c82aSKamalkumar Patel     pldm::utils::InterfaceMap interfaceMap;
203c50c82aSKamalkumar Patel 
213c50c82aSKamalkumar Patel     msg.read(path, interfaceMap);
223c50c82aSKamalkumar Patel 
233c50c82aSKamalkumar Patel     if (!interfaceMap.contains(compatibleInterface))
243c50c82aSKamalkumar Patel     {
253c50c82aSKamalkumar Patel         return;
263c50c82aSKamalkumar Patel     }
273c50c82aSKamalkumar Patel     // Get the "Name" property value of the
283c50c82aSKamalkumar Patel     // "xyz.openbmc_project.Inventory.Decorator.Compatible" interface
293c50c82aSKamalkumar Patel     const auto& properties = interfaceMap.at(compatibleInterface);
303c50c82aSKamalkumar Patel 
313c50c82aSKamalkumar Patel     if (!properties.contains(namesProperty))
323c50c82aSKamalkumar Patel     {
333c50c82aSKamalkumar Patel         return;
343c50c82aSKamalkumar Patel     }
353c50c82aSKamalkumar Patel     auto names =
363c50c82aSKamalkumar Patel         std::get<pldm::utils::Interfaces>(properties.at(namesProperty));
373c50c82aSKamalkumar Patel 
383c50c82aSKamalkumar Patel     std::string systemType;
393c50c82aSKamalkumar Patel     if (!names.empty())
403c50c82aSKamalkumar Patel     {
413c50c82aSKamalkumar Patel         // get only the first system type
423c50c82aSKamalkumar Patel         systemType = names.front();
433c50c82aSKamalkumar Patel     }
443c50c82aSKamalkumar Patel 
453c50c82aSKamalkumar Patel     if (!systemType.empty())
463c50c82aSKamalkumar Patel     {
473c50c82aSKamalkumar Patel         systemCompatibleMatchCallBack.reset();
483c50c82aSKamalkumar Patel     }
493c50c82aSKamalkumar Patel }
503c50c82aSKamalkumar Patel 
513c50c82aSKamalkumar Patel /** @brief Method to get the system type information
523c50c82aSKamalkumar Patel  *
533c50c82aSKamalkumar Patel  *  @return - the system type information
543c50c82aSKamalkumar Patel  */
553c50c82aSKamalkumar Patel std::optional<std::filesystem::path> Handler::getPlatformName()
563c50c82aSKamalkumar Patel {
573c50c82aSKamalkumar Patel     if (!systemType.empty())
583c50c82aSKamalkumar Patel     {
593c50c82aSKamalkumar Patel         return fs::path{systemType};
603c50c82aSKamalkumar Patel     }
613c50c82aSKamalkumar Patel 
623c50c82aSKamalkumar Patel     namespace fs = std::filesystem;
63*2edc34bbSKamalkumar Patel     static const std::string entityMangerService =
64*2edc34bbSKamalkumar Patel         "xyz.openbmc_project.EntityManager";
653c50c82aSKamalkumar Patel 
663c50c82aSKamalkumar Patel     static constexpr auto searchpath = "/xyz/openbmc_project/";
673c50c82aSKamalkumar Patel     int depth = 0;
683c50c82aSKamalkumar Patel     std::vector<std::string> systemCompatible = {compatibleInterface};
69*2edc34bbSKamalkumar Patel 
70*2edc34bbSKamalkumar Patel     try
71*2edc34bbSKamalkumar Patel     {
723c50c82aSKamalkumar Patel         pldm::utils::GetSubTreeResponse response =
733c50c82aSKamalkumar Patel             pldm::utils::DBusHandler().getSubtree(searchpath, depth,
743c50c82aSKamalkumar Patel                                                   systemCompatible);
753c50c82aSKamalkumar Patel         auto& bus = pldm::utils::DBusHandler::getBus();
763c50c82aSKamalkumar Patel 
773c50c82aSKamalkumar Patel         for (const auto& [objectPath, serviceMap] : response)
783c50c82aSKamalkumar Patel         {
793c50c82aSKamalkumar Patel             try
803c50c82aSKamalkumar Patel             {
81*2edc34bbSKamalkumar Patel                 auto record = std::find_if(
82*2edc34bbSKamalkumar Patel                     serviceMap.begin(), serviceMap.end(),
83*2edc34bbSKamalkumar Patel                     [](auto map) { return map.first == entityMangerService; });
84*2edc34bbSKamalkumar Patel 
85*2edc34bbSKamalkumar Patel                 if (record != serviceMap.end())
86*2edc34bbSKamalkumar Patel                 {
873c50c82aSKamalkumar Patel                     auto method = bus.new_method_call(
88*2edc34bbSKamalkumar Patel                         entityMangerService.c_str(), objectPath.c_str(),
89*2edc34bbSKamalkumar Patel                         "org.freedesktop.DBus.Properties", "Get");
90*2edc34bbSKamalkumar Patel                     method.append(compatibleInterface, namesProperty);
91*2edc34bbSKamalkumar Patel                     auto propSystemList =
92*2edc34bbSKamalkumar Patel                         bus.call(method, dbusTimeout).unpack<PropertyValue>();
93*2edc34bbSKamalkumar Patel                     auto systemList =
94*2edc34bbSKamalkumar Patel                         std::get<std::vector<std::string>>(propSystemList);
95*2edc34bbSKamalkumar Patel 
963c50c82aSKamalkumar Patel                     if (!systemList.empty())
973c50c82aSKamalkumar Patel                     {
983c50c82aSKamalkumar Patel                         systemType = systemList.at(0);
99*2edc34bbSKamalkumar Patel                         // once systemtype received,then resetting a callback
100*2edc34bbSKamalkumar Patel                         systemCompatibleMatchCallBack.reset();
1013c50c82aSKamalkumar Patel                         return fs::path{systemType};
1023c50c82aSKamalkumar Patel                     }
1033c50c82aSKamalkumar Patel                 }
104*2edc34bbSKamalkumar Patel             }
1053c50c82aSKamalkumar Patel             catch (const std::exception& e)
1063c50c82aSKamalkumar Patel             {
1073c50c82aSKamalkumar Patel                 error(
1083c50c82aSKamalkumar Patel                     "Error getting Names property at '{PATH}' on '{INTERFACE}': {ERROR}",
109*2edc34bbSKamalkumar Patel                     "PATH", objectPath, "INTERFACE", compatibleInterface,
110*2edc34bbSKamalkumar Patel                     "ERROR", e);
1113c50c82aSKamalkumar Patel             }
1123c50c82aSKamalkumar Patel         }
113*2edc34bbSKamalkumar Patel     }
114*2edc34bbSKamalkumar Patel     catch (const std::exception& e)
115*2edc34bbSKamalkumar Patel     {
116*2edc34bbSKamalkumar Patel         error("Failed to make a d-bus call to get platform name {ERROR}",
117*2edc34bbSKamalkumar Patel               "ERROR", e);
118*2edc34bbSKamalkumar Patel     }
1193c50c82aSKamalkumar Patel     return std::nullopt;
1203c50c82aSKamalkumar Patel }
1213c50c82aSKamalkumar Patel 
1223c50c82aSKamalkumar Patel } // namespace platform_config
1233c50c82aSKamalkumar Patel 
1243c50c82aSKamalkumar Patel } // namespace responder
1253c50c82aSKamalkumar Patel 
1263c50c82aSKamalkumar Patel } // namespace pldm
127