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