1 #include "config.h"
2 
3 #include "flash.hpp"
4 
5 #include "activation.hpp"
6 #include "item_updater.hpp"
7 
8 namespace phosphor
9 {
10 namespace software
11 {
12 namespace updater
13 {
14 
15 namespace softwareServer = sdbusplus::xyz::openbmc_project::Software::server;
16 
17 void Activation::flashWrite()
18 {
19     auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
20                                       SYSTEMD_INTERFACE, "StartUnit");
21     auto serviceFile = "obmc-flash-mmc@" + versionId + ".service";
22     method.append(serviceFile, "replace");
23     bus.call_noreply(method);
24 }
25 
26 void Activation::onStateChanges(sdbusplus::message::message& msg)
27 {
28     uint32_t newStateID{};
29     sdbusplus::message::object_path newStateObjPath;
30     std::string newStateUnit{};
31     std::string newStateResult{};
32 
33     // Read the msg and populate each variable
34     msg.read(newStateID, newStateObjPath, newStateUnit, newStateResult);
35 
36     auto mmcServiceFile = "obmc-flash-mmc@" + versionId + ".service";
37     auto flashId = parent.versions.find(versionId)->second->path();
38     auto mmcSetPrimary = "obmc-flash-mmc-setprimary@" + flashId + ".service";
39 
40     if (newStateUnit == mmcServiceFile && newStateResult == "done")
41     {
42         roVolumeCreated = true;
43         activationProgress->progress(activationProgress->progress() + 1);
44     }
45 
46     if (newStateUnit == mmcSetPrimary && newStateResult == "done")
47     {
48         ubootEnvVarsUpdated = true;
49     }
50 
51     if (newStateUnit == mmcServiceFile || newStateUnit == mmcSetPrimary)
52     {
53         if (newStateResult == "failed" || newStateResult == "dependency")
54         {
55             Activation::activation(
56                 softwareServer::Activation::Activations::Failed);
57         }
58         else if (roVolumeCreated)
59         {
60             if (!ubootEnvVarsUpdated)
61             {
62                 activationProgress->progress(90);
63 
64                 // Set the priority which triggers the service that updates the
65                 // environment variables.
66                 if (!Activation::redundancyPriority)
67                 {
68                     Activation::redundancyPriority =
69                         std::make_unique<RedundancyPriority>(bus, path, *this,
70                                                              0);
71                 }
72             }
73             else // Environment variables were updated
74             {
75                 Activation::onFlashWriteSuccess();
76             }
77         }
78     }
79 
80     return;
81 }
82 
83 } // namespace updater
84 } // namespace software
85 } // namespace phosphor
86