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