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