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