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