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