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