xref: /openbmc/pldm/libpldmresponder/platform_config.cpp (revision 46f352ed2426368185f3bd36fd6bf88f15fa5111)
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();
4362dd8ff2SArchana Kakani         if (sysTypeCallback)
4462dd8ff2SArchana Kakani         {
45*46f352edSArchana Kakani             sysTypeCallback(systemType, true);
4662dd8ff2SArchana Kakani         }
473c50c82aSKamalkumar Patel     }
483c50c82aSKamalkumar Patel 
493c50c82aSKamalkumar Patel     if (!systemType.empty())
503c50c82aSKamalkumar Patel     {
513c50c82aSKamalkumar Patel         systemCompatibleMatchCallBack.reset();
523c50c82aSKamalkumar Patel     }
533c50c82aSKamalkumar Patel }
543c50c82aSKamalkumar Patel 
553c50c82aSKamalkumar Patel /** @brief Method to get the system type information
563c50c82aSKamalkumar Patel  *
573c50c82aSKamalkumar Patel  *  @return - the system type information
583c50c82aSKamalkumar Patel  */
593c50c82aSKamalkumar Patel std::optional<std::filesystem::path> Handler::getPlatformName()
603c50c82aSKamalkumar Patel {
613c50c82aSKamalkumar Patel     if (!systemType.empty())
623c50c82aSKamalkumar Patel     {
633c50c82aSKamalkumar Patel         return fs::path{systemType};
643c50c82aSKamalkumar Patel     }
653c50c82aSKamalkumar Patel 
663c50c82aSKamalkumar Patel     namespace fs = std::filesystem;
672edc34bbSKamalkumar Patel     static const std::string entityMangerService =
682edc34bbSKamalkumar Patel         "xyz.openbmc_project.EntityManager";
693c50c82aSKamalkumar Patel 
703c50c82aSKamalkumar Patel     static constexpr auto searchpath = "/xyz/openbmc_project/";
713c50c82aSKamalkumar Patel     int depth = 0;
723c50c82aSKamalkumar Patel     std::vector<std::string> systemCompatible = {compatibleInterface};
732edc34bbSKamalkumar Patel 
742edc34bbSKamalkumar Patel     try
752edc34bbSKamalkumar Patel     {
763c50c82aSKamalkumar Patel         pldm::utils::GetSubTreeResponse response =
773c50c82aSKamalkumar Patel             pldm::utils::DBusHandler().getSubtree(searchpath, depth,
783c50c82aSKamalkumar Patel                                                   systemCompatible);
793c50c82aSKamalkumar Patel         auto& bus = pldm::utils::DBusHandler::getBus();
803c50c82aSKamalkumar Patel 
813c50c82aSKamalkumar Patel         for (const auto& [objectPath, serviceMap] : response)
823c50c82aSKamalkumar Patel         {
833c50c82aSKamalkumar Patel             try
843c50c82aSKamalkumar Patel             {
852edc34bbSKamalkumar Patel                 auto record = std::find_if(
862edc34bbSKamalkumar Patel                     serviceMap.begin(), serviceMap.end(),
872edc34bbSKamalkumar Patel                     [](auto map) { return map.first == entityMangerService; });
882edc34bbSKamalkumar Patel 
892edc34bbSKamalkumar Patel                 if (record != serviceMap.end())
902edc34bbSKamalkumar Patel                 {
913c50c82aSKamalkumar Patel                     auto method = bus.new_method_call(
922edc34bbSKamalkumar Patel                         entityMangerService.c_str(), objectPath.c_str(),
932edc34bbSKamalkumar Patel                         "org.freedesktop.DBus.Properties", "Get");
942edc34bbSKamalkumar Patel                     method.append(compatibleInterface, namesProperty);
952edc34bbSKamalkumar Patel                     auto propSystemList =
962edc34bbSKamalkumar Patel                         bus.call(method, dbusTimeout).unpack<PropertyValue>();
972edc34bbSKamalkumar Patel                     auto systemList =
982edc34bbSKamalkumar Patel                         std::get<std::vector<std::string>>(propSystemList);
992edc34bbSKamalkumar Patel 
1003c50c82aSKamalkumar Patel                     if (!systemList.empty())
1013c50c82aSKamalkumar Patel                     {
1023c50c82aSKamalkumar Patel                         systemType = systemList.at(0);
1032edc34bbSKamalkumar Patel                         // once systemtype received,then resetting a callback
1042edc34bbSKamalkumar Patel                         systemCompatibleMatchCallBack.reset();
1053c50c82aSKamalkumar Patel                         return fs::path{systemType};
1063c50c82aSKamalkumar Patel                     }
1073c50c82aSKamalkumar Patel                 }
1082edc34bbSKamalkumar Patel             }
1093c50c82aSKamalkumar Patel             catch (const std::exception& e)
1103c50c82aSKamalkumar Patel             {
1113c50c82aSKamalkumar Patel                 error(
1123c50c82aSKamalkumar Patel                     "Error getting Names property at '{PATH}' on '{INTERFACE}': {ERROR}",
1132edc34bbSKamalkumar Patel                     "PATH", objectPath, "INTERFACE", compatibleInterface,
1142edc34bbSKamalkumar Patel                     "ERROR", e);
1153c50c82aSKamalkumar Patel             }
1163c50c82aSKamalkumar Patel         }
1172edc34bbSKamalkumar Patel     }
1182edc34bbSKamalkumar Patel     catch (const std::exception& e)
1192edc34bbSKamalkumar Patel     {
1202edc34bbSKamalkumar Patel         error("Failed to make a d-bus call to get platform name {ERROR}",
1212edc34bbSKamalkumar Patel               "ERROR", e);
1222edc34bbSKamalkumar Patel     }
1233c50c82aSKamalkumar Patel     return std::nullopt;
1243c50c82aSKamalkumar Patel }
1253c50c82aSKamalkumar Patel 
12662dd8ff2SArchana Kakani void Handler::registerSystemTypeCallback(SystemTypeCallback callback)
12762dd8ff2SArchana Kakani {
12862dd8ff2SArchana Kakani     sysTypeCallback = callback;
12962dd8ff2SArchana Kakani }
13062dd8ff2SArchana Kakani 
1313c50c82aSKamalkumar Patel } // namespace platform_config
1323c50c82aSKamalkumar Patel 
1333c50c82aSKamalkumar Patel } // namespace responder
1343c50c82aSKamalkumar Patel 
1353c50c82aSKamalkumar Patel } // namespace pldm
136