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(); 43*62dd8ff2SArchana Kakani if (sysTypeCallback) 44*62dd8ff2SArchana Kakani { 45*62dd8ff2SArchana Kakani sysTypeCallback(systemType); 46*62dd8ff2SArchana 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 126*62dd8ff2SArchana Kakani void Handler::registerSystemTypeCallback(SystemTypeCallback callback) 127*62dd8ff2SArchana Kakani { 128*62dd8ff2SArchana Kakani sysTypeCallback = callback; 129*62dd8ff2SArchana Kakani } 130*62dd8ff2SArchana Kakani 1313c50c82aSKamalkumar Patel } // namespace platform_config 1323c50c82aSKamalkumar Patel 1333c50c82aSKamalkumar Patel } // namespace responder 1343c50c82aSKamalkumar Patel 1353c50c82aSKamalkumar Patel } // namespace pldm 136