1*13c57ad8SJayanth Othayoth #include "fw_update_watch.hpp" 2*13c57ad8SJayanth Othayoth 3*13c57ad8SJayanth Othayoth #include <fmt/format.h> 4*13c57ad8SJayanth Othayoth 5*13c57ad8SJayanth Othayoth #include <phosphor-logging/elog.hpp> 6*13c57ad8SJayanth Othayoth #include <sdbusplus/exception.hpp> 7*13c57ad8SJayanth Othayoth 8*13c57ad8SJayanth Othayoth namespace openpower 9*13c57ad8SJayanth Othayoth { 10*13c57ad8SJayanth Othayoth namespace phal 11*13c57ad8SJayanth Othayoth { 12*13c57ad8SJayanth Othayoth namespace fwupdate 13*13c57ad8SJayanth Othayoth { 14*13c57ad8SJayanth Othayoth using namespace phosphor::logging; 15*13c57ad8SJayanth Othayoth using Message = std::string; 16*13c57ad8SJayanth Othayoth using Attributes = std::variant<Message>; 17*13c57ad8SJayanth Othayoth using PropertyName = std::string; 18*13c57ad8SJayanth Othayoth using PropertyMap = std::map<PropertyName, Attributes>; 19*13c57ad8SJayanth Othayoth using InterfaceName = std::string; 20*13c57ad8SJayanth Othayoth using InterfaceMap = std::map<InterfaceName, PropertyMap>; 21*13c57ad8SJayanth Othayoth 22*13c57ad8SJayanth Othayoth void Watch::fwIntfAddedCallback(sdbusplus::message::message& msg) 23*13c57ad8SJayanth Othayoth { 24*13c57ad8SJayanth Othayoth // DBusInterfaceAdded interfaces; 25*13c57ad8SJayanth Othayoth sdbusplus::message::object_path objectPath; 26*13c57ad8SJayanth Othayoth InterfaceMap interfaceMap; 27*13c57ad8SJayanth Othayoth 28*13c57ad8SJayanth Othayoth try 29*13c57ad8SJayanth Othayoth { 30*13c57ad8SJayanth Othayoth msg.read(objectPath, interfaceMap); 31*13c57ad8SJayanth Othayoth } 32*13c57ad8SJayanth Othayoth catch (const sdbusplus::exception::SdBusError& e) 33*13c57ad8SJayanth Othayoth { 34*13c57ad8SJayanth Othayoth log<level::ERR>(fmt::format("Failed to parse software add signal" 35*13c57ad8SJayanth Othayoth "Exception [{}] REPLY_SIG [{}]", 36*13c57ad8SJayanth Othayoth e.what(), msg.get_signature()) 37*13c57ad8SJayanth Othayoth .c_str()); 38*13c57ad8SJayanth Othayoth return; 39*13c57ad8SJayanth Othayoth } 40*13c57ad8SJayanth Othayoth 41*13c57ad8SJayanth Othayoth auto iter = interfaceMap.find("xyz.openbmc_project.Software.Activation"); 42*13c57ad8SJayanth Othayoth if (iter == interfaceMap.end()) 43*13c57ad8SJayanth Othayoth { 44*13c57ad8SJayanth Othayoth // Skip not related Software Activation 45*13c57ad8SJayanth Othayoth return; 46*13c57ad8SJayanth Othayoth } 47*13c57ad8SJayanth Othayoth 48*13c57ad8SJayanth Othayoth auto attr = iter->second.find("Activation"); 49*13c57ad8SJayanth Othayoth if (attr == iter->second.end()) 50*13c57ad8SJayanth Othayoth { 51*13c57ad8SJayanth Othayoth // Skip not related to Activation property. 52*13c57ad8SJayanth Othayoth return; 53*13c57ad8SJayanth Othayoth } 54*13c57ad8SJayanth Othayoth 55*13c57ad8SJayanth Othayoth auto& imageProperty = std::get<InterfaceName>(attr->second); 56*13c57ad8SJayanth Othayoth if (imageProperty.empty()) 57*13c57ad8SJayanth Othayoth { 58*13c57ad8SJayanth Othayoth // Skip, no image property 59*13c57ad8SJayanth Othayoth return; 60*13c57ad8SJayanth Othayoth } 61*13c57ad8SJayanth Othayoth 62*13c57ad8SJayanth Othayoth if (imageProperty == 63*13c57ad8SJayanth Othayoth "xyz.openbmc_project.Software.Activation.Activations.Ready" && 64*13c57ad8SJayanth Othayoth !isSoftwareUpdateInProgress()) 65*13c57ad8SJayanth Othayoth { 66*13c57ad8SJayanth Othayoth log<level::INFO>("Software path interface add signal received"); 67*13c57ad8SJayanth Othayoth 68*13c57ad8SJayanth Othayoth // Set status to code update in progress. 69*13c57ad8SJayanth Othayoth // Interface added signal triggered multiple times in code update path, 70*13c57ad8SJayanth Othayoth // it's due to additional interfaces added by the software manager app 71*13c57ad8SJayanth Othayoth // after the version interface is created. 72*13c57ad8SJayanth Othayoth // Device tree data collection is required only for the first trigger 73*13c57ad8SJayanth Othayoth setSoftwareUpdateProgress(true); 74*13c57ad8SJayanth Othayoth 75*13c57ad8SJayanth Othayoth // Colect device tree data 76*13c57ad8SJayanth Othayoth openpower::phal::fwupdate::exportDevtree(); 77*13c57ad8SJayanth Othayoth } 78*13c57ad8SJayanth Othayoth 79*13c57ad8SJayanth Othayoth return; 80*13c57ad8SJayanth Othayoth } 81*13c57ad8SJayanth Othayoth 82*13c57ad8SJayanth Othayoth void exportDevtree() 83*13c57ad8SJayanth Othayoth {} 84*13c57ad8SJayanth Othayoth 85*13c57ad8SJayanth Othayoth } // namespace fwupdate 86*13c57ad8SJayanth Othayoth } // namespace phal 87*13c57ad8SJayanth Othayoth } // namespace openpower 88