xref: /openbmc/pldm/libpldmresponder/platform_config.cpp (revision 89644441c01beaee1db50fa3c4ed9ad6607b0261)
13c50c82aSKamalkumar Patel #include "platform_config.hpp"
23c50c82aSKamalkumar Patel 
3*89644441SRiya Dixit #include <phosphor-logging/lg2.hpp>
4*89644441SRiya Dixit 
5*89644441SRiya Dixit PHOSPHOR_LOG2_USING;
6*89644441SRiya Dixit 
73c50c82aSKamalkumar Patel namespace pldm
83c50c82aSKamalkumar Patel {
93c50c82aSKamalkumar Patel namespace responder
103c50c82aSKamalkumar Patel {
113c50c82aSKamalkumar Patel 
123c50c82aSKamalkumar Patel namespace platform_config
133c50c82aSKamalkumar Patel {
143c50c82aSKamalkumar Patel /** @brief callback function invoked when interfaces get added from
153c50c82aSKamalkumar Patel  *      Entity manager
163c50c82aSKamalkumar Patel  *
173c50c82aSKamalkumar Patel  *  @param[in] msg - Data associated with subscribed signal
183c50c82aSKamalkumar Patel  */
193c50c82aSKamalkumar Patel void Handler::systemCompatibleCallback(sdbusplus::message_t& msg)
203c50c82aSKamalkumar Patel {
213c50c82aSKamalkumar Patel     sdbusplus::message::object_path path;
223c50c82aSKamalkumar Patel 
233c50c82aSKamalkumar Patel     pldm::utils::InterfaceMap interfaceMap;
243c50c82aSKamalkumar Patel 
253c50c82aSKamalkumar Patel     msg.read(path, interfaceMap);
263c50c82aSKamalkumar Patel 
273c50c82aSKamalkumar Patel     if (!interfaceMap.contains(compatibleInterface))
283c50c82aSKamalkumar Patel     {
293c50c82aSKamalkumar Patel         return;
303c50c82aSKamalkumar Patel     }
313c50c82aSKamalkumar Patel     // Get the "Name" property value of the
323c50c82aSKamalkumar Patel     // "xyz.openbmc_project.Inventory.Decorator.Compatible" interface
333c50c82aSKamalkumar Patel     const auto& properties = interfaceMap.at(compatibleInterface);
343c50c82aSKamalkumar Patel 
353c50c82aSKamalkumar Patel     if (!properties.contains(namesProperty))
363c50c82aSKamalkumar Patel     {
373c50c82aSKamalkumar Patel         return;
383c50c82aSKamalkumar Patel     }
393c50c82aSKamalkumar Patel     auto names =
403c50c82aSKamalkumar Patel         std::get<pldm::utils::Interfaces>(properties.at(namesProperty));
413c50c82aSKamalkumar Patel 
423c50c82aSKamalkumar Patel     std::string systemType;
433c50c82aSKamalkumar Patel     if (!names.empty())
443c50c82aSKamalkumar Patel     {
453c50c82aSKamalkumar Patel         // get only the first system type
463c50c82aSKamalkumar Patel         systemType = names.front();
4762dd8ff2SArchana Kakani         if (sysTypeCallback)
4862dd8ff2SArchana Kakani         {
4946f352edSArchana Kakani             sysTypeCallback(systemType, true);
5062dd8ff2SArchana Kakani         }
513c50c82aSKamalkumar Patel     }
523c50c82aSKamalkumar Patel 
533c50c82aSKamalkumar Patel     if (!systemType.empty())
543c50c82aSKamalkumar Patel     {
553c50c82aSKamalkumar Patel         systemCompatibleMatchCallBack.reset();
563c50c82aSKamalkumar Patel     }
573c50c82aSKamalkumar Patel }
583c50c82aSKamalkumar Patel 
593c50c82aSKamalkumar Patel /** @brief Method to get the system type information
603c50c82aSKamalkumar Patel  *
613c50c82aSKamalkumar Patel  *  @return - the system type information
623c50c82aSKamalkumar Patel  */
633c50c82aSKamalkumar Patel std::optional<std::filesystem::path> Handler::getPlatformName()
643c50c82aSKamalkumar Patel {
653c50c82aSKamalkumar Patel     if (!systemType.empty())
663c50c82aSKamalkumar Patel     {
673c50c82aSKamalkumar Patel         return fs::path{systemType};
683c50c82aSKamalkumar Patel     }
693c50c82aSKamalkumar Patel 
703c50c82aSKamalkumar Patel     namespace fs = std::filesystem;
712edc34bbSKamalkumar Patel     static const std::string entityMangerService =
722edc34bbSKamalkumar Patel         "xyz.openbmc_project.EntityManager";
733c50c82aSKamalkumar Patel 
743c50c82aSKamalkumar Patel     static constexpr auto searchpath = "/xyz/openbmc_project/";
753c50c82aSKamalkumar Patel     int depth = 0;
763c50c82aSKamalkumar Patel     std::vector<std::string> systemCompatible = {compatibleInterface};
772edc34bbSKamalkumar Patel 
782edc34bbSKamalkumar Patel     try
792edc34bbSKamalkumar Patel     {
803c50c82aSKamalkumar Patel         pldm::utils::GetSubTreeResponse response =
813c50c82aSKamalkumar Patel             pldm::utils::DBusHandler().getSubtree(searchpath, depth,
823c50c82aSKamalkumar Patel                                                   systemCompatible);
833c50c82aSKamalkumar Patel         auto& bus = pldm::utils::DBusHandler::getBus();
843c50c82aSKamalkumar Patel 
853c50c82aSKamalkumar Patel         for (const auto& [objectPath, serviceMap] : response)
863c50c82aSKamalkumar Patel         {
873c50c82aSKamalkumar Patel             try
883c50c82aSKamalkumar Patel             {
892edc34bbSKamalkumar Patel                 auto record = std::find_if(
902edc34bbSKamalkumar Patel                     serviceMap.begin(), serviceMap.end(),
912edc34bbSKamalkumar Patel                     [](auto map) { return map.first == entityMangerService; });
922edc34bbSKamalkumar Patel 
932edc34bbSKamalkumar Patel                 if (record != serviceMap.end())
942edc34bbSKamalkumar Patel                 {
953c50c82aSKamalkumar Patel                     auto method = bus.new_method_call(
962edc34bbSKamalkumar Patel                         entityMangerService.c_str(), objectPath.c_str(),
972edc34bbSKamalkumar Patel                         "org.freedesktop.DBus.Properties", "Get");
982edc34bbSKamalkumar Patel                     method.append(compatibleInterface, namesProperty);
992edc34bbSKamalkumar Patel                     auto propSystemList =
1002edc34bbSKamalkumar Patel                         bus.call(method, dbusTimeout).unpack<PropertyValue>();
1012edc34bbSKamalkumar Patel                     auto systemList =
1022edc34bbSKamalkumar Patel                         std::get<std::vector<std::string>>(propSystemList);
1032edc34bbSKamalkumar Patel 
1043c50c82aSKamalkumar Patel                     if (!systemList.empty())
1053c50c82aSKamalkumar Patel                     {
1063c50c82aSKamalkumar Patel                         systemType = systemList.at(0);
1072edc34bbSKamalkumar Patel                         // once systemtype received,then resetting a callback
1082edc34bbSKamalkumar Patel                         systemCompatibleMatchCallBack.reset();
1093c50c82aSKamalkumar Patel                         return fs::path{systemType};
1103c50c82aSKamalkumar Patel                     }
1113c50c82aSKamalkumar Patel                 }
1122edc34bbSKamalkumar Patel             }
1133c50c82aSKamalkumar Patel             catch (const std::exception& e)
1143c50c82aSKamalkumar Patel             {
1153c50c82aSKamalkumar Patel                 error(
116*89644441SRiya Dixit                     "Failed to get Names property at '{PATH}' on interface '{INTERFACE}', error - {ERROR}",
1172edc34bbSKamalkumar Patel                     "PATH", objectPath, "INTERFACE", compatibleInterface,
1182edc34bbSKamalkumar Patel                     "ERROR", e);
1193c50c82aSKamalkumar Patel             }
1203c50c82aSKamalkumar Patel         }
1212edc34bbSKamalkumar Patel     }
1222edc34bbSKamalkumar Patel     catch (const std::exception& e)
1232edc34bbSKamalkumar Patel     {
124*89644441SRiya Dixit         error(
125*89644441SRiya Dixit             "Failed to make a d-bus call to get platform name, error - {ERROR}",
1262edc34bbSKamalkumar Patel             "ERROR", e);
1272edc34bbSKamalkumar Patel     }
1283c50c82aSKamalkumar Patel     return std::nullopt;
1293c50c82aSKamalkumar Patel }
1303c50c82aSKamalkumar Patel 
13162dd8ff2SArchana Kakani void Handler::registerSystemTypeCallback(SystemTypeCallback callback)
13262dd8ff2SArchana Kakani {
13362dd8ff2SArchana Kakani     sysTypeCallback = callback;
13462dd8ff2SArchana Kakani }
13562dd8ff2SArchana Kakani 
1363c50c82aSKamalkumar Patel } // namespace platform_config
1373c50c82aSKamalkumar Patel 
1383c50c82aSKamalkumar Patel } // namespace responder
1393c50c82aSKamalkumar Patel 
1403c50c82aSKamalkumar Patel } // namespace pldm
141