xref: /openbmc/pldm/libpldmresponder/platform_config.cpp (revision 3c50c82a1c0fba51b537db8e8bb18082904c8e4d)
1*3c50c82aSKamalkumar Patel #include "platform_config.hpp"
2*3c50c82aSKamalkumar Patel 
3*3c50c82aSKamalkumar Patel namespace pldm
4*3c50c82aSKamalkumar Patel {
5*3c50c82aSKamalkumar Patel namespace responder
6*3c50c82aSKamalkumar Patel {
7*3c50c82aSKamalkumar Patel 
8*3c50c82aSKamalkumar Patel namespace platform_config
9*3c50c82aSKamalkumar Patel {
10*3c50c82aSKamalkumar Patel /** @brief callback function invoked when interfaces get added from
11*3c50c82aSKamalkumar Patel  *      Entity manager
12*3c50c82aSKamalkumar Patel  *
13*3c50c82aSKamalkumar Patel  *  @param[in] msg - Data associated with subscribed signal
14*3c50c82aSKamalkumar Patel  */
15*3c50c82aSKamalkumar Patel void Handler::systemCompatibleCallback(sdbusplus::message_t& msg)
16*3c50c82aSKamalkumar Patel {
17*3c50c82aSKamalkumar Patel     sdbusplus::message::object_path path;
18*3c50c82aSKamalkumar Patel 
19*3c50c82aSKamalkumar Patel     pldm::utils::InterfaceMap interfaceMap;
20*3c50c82aSKamalkumar Patel 
21*3c50c82aSKamalkumar Patel     msg.read(path, interfaceMap);
22*3c50c82aSKamalkumar Patel 
23*3c50c82aSKamalkumar Patel     if (!interfaceMap.contains(compatibleInterface))
24*3c50c82aSKamalkumar Patel     {
25*3c50c82aSKamalkumar Patel         return;
26*3c50c82aSKamalkumar Patel     }
27*3c50c82aSKamalkumar Patel     // Get the "Name" property value of the
28*3c50c82aSKamalkumar Patel     // "xyz.openbmc_project.Inventory.Decorator.Compatible" interface
29*3c50c82aSKamalkumar Patel     const auto& properties = interfaceMap.at(compatibleInterface);
30*3c50c82aSKamalkumar Patel 
31*3c50c82aSKamalkumar Patel     if (!properties.contains(namesProperty))
32*3c50c82aSKamalkumar Patel     {
33*3c50c82aSKamalkumar Patel         return;
34*3c50c82aSKamalkumar Patel     }
35*3c50c82aSKamalkumar Patel     auto names =
36*3c50c82aSKamalkumar Patel         std::get<pldm::utils::Interfaces>(properties.at(namesProperty));
37*3c50c82aSKamalkumar Patel 
38*3c50c82aSKamalkumar Patel     std::string systemType;
39*3c50c82aSKamalkumar Patel     if (!names.empty())
40*3c50c82aSKamalkumar Patel     {
41*3c50c82aSKamalkumar Patel         // get only the first system type
42*3c50c82aSKamalkumar Patel         systemType = names.front();
43*3c50c82aSKamalkumar Patel     }
44*3c50c82aSKamalkumar Patel 
45*3c50c82aSKamalkumar Patel     if (!systemType.empty())
46*3c50c82aSKamalkumar Patel     {
47*3c50c82aSKamalkumar Patel         systemCompatibleMatchCallBack.reset();
48*3c50c82aSKamalkumar Patel     }
49*3c50c82aSKamalkumar Patel }
50*3c50c82aSKamalkumar Patel 
51*3c50c82aSKamalkumar Patel /** @brief Method to get the system type information
52*3c50c82aSKamalkumar Patel  *
53*3c50c82aSKamalkumar Patel  *  @return - the system type information
54*3c50c82aSKamalkumar Patel  */
55*3c50c82aSKamalkumar Patel std::optional<std::filesystem::path> Handler::getPlatformName()
56*3c50c82aSKamalkumar Patel {
57*3c50c82aSKamalkumar Patel     if (!systemType.empty())
58*3c50c82aSKamalkumar Patel     {
59*3c50c82aSKamalkumar Patel         return fs::path{systemType};
60*3c50c82aSKamalkumar Patel     }
61*3c50c82aSKamalkumar Patel 
62*3c50c82aSKamalkumar Patel     namespace fs = std::filesystem;
63*3c50c82aSKamalkumar Patel     static constexpr auto orgFreeDesktopInterface =
64*3c50c82aSKamalkumar Patel         "org.freedesktop.DBus.Properties";
65*3c50c82aSKamalkumar Patel     static constexpr auto getMethod = "Get";
66*3c50c82aSKamalkumar Patel 
67*3c50c82aSKamalkumar Patel     static constexpr auto searchpath = "/xyz/openbmc_project/";
68*3c50c82aSKamalkumar Patel     int depth = 0;
69*3c50c82aSKamalkumar Patel     std::vector<std::string> systemCompatible = {compatibleInterface};
70*3c50c82aSKamalkumar Patel     pldm::utils::GetSubTreeResponse response =
71*3c50c82aSKamalkumar Patel         pldm::utils::DBusHandler().getSubtree(searchpath, depth,
72*3c50c82aSKamalkumar Patel                                               systemCompatible);
73*3c50c82aSKamalkumar Patel     auto& bus = pldm::utils::DBusHandler::getBus();
74*3c50c82aSKamalkumar Patel     std::variant<std::vector<std::string>> value;
75*3c50c82aSKamalkumar Patel 
76*3c50c82aSKamalkumar Patel     for (const auto& [objectPath, serviceMap] : response)
77*3c50c82aSKamalkumar Patel     {
78*3c50c82aSKamalkumar Patel         try
79*3c50c82aSKamalkumar Patel         {
80*3c50c82aSKamalkumar Patel             auto method = bus.new_method_call(
81*3c50c82aSKamalkumar Patel                 serviceMap[0].first.c_str(), objectPath.c_str(),
82*3c50c82aSKamalkumar Patel                 orgFreeDesktopInterface, getMethod);
83*3c50c82aSKamalkumar Patel             method.append(systemCompatible[0].c_str(), namesProperty);
84*3c50c82aSKamalkumar Patel             auto reply = bus.call(method);
85*3c50c82aSKamalkumar Patel             reply.read(value);
86*3c50c82aSKamalkumar Patel             auto systemList = std::get<std::vector<std::string>>(value);
87*3c50c82aSKamalkumar Patel             if (!systemList.empty())
88*3c50c82aSKamalkumar Patel             {
89*3c50c82aSKamalkumar Patel                 systemType = systemList.at(0);
90*3c50c82aSKamalkumar Patel                 return fs::path{systemType};
91*3c50c82aSKamalkumar Patel             }
92*3c50c82aSKamalkumar Patel         }
93*3c50c82aSKamalkumar Patel         catch (const std::exception& e)
94*3c50c82aSKamalkumar Patel         {
95*3c50c82aSKamalkumar Patel             error(
96*3c50c82aSKamalkumar Patel                 "Error getting Names property at '{PATH}' on '{INTERFACE}': {ERROR}",
97*3c50c82aSKamalkumar Patel                 "PATH", objectPath, "INTERFACE", systemCompatible[0], "ERROR",
98*3c50c82aSKamalkumar Patel                 e);
99*3c50c82aSKamalkumar Patel         }
100*3c50c82aSKamalkumar Patel     }
101*3c50c82aSKamalkumar Patel     return std::nullopt;
102*3c50c82aSKamalkumar Patel }
103*3c50c82aSKamalkumar Patel 
104*3c50c82aSKamalkumar Patel } // namespace platform_config
105*3c50c82aSKamalkumar Patel 
106*3c50c82aSKamalkumar Patel } // namespace responder
107*3c50c82aSKamalkumar Patel 
108*3c50c82aSKamalkumar Patel } // namespace pldm
109