blob: a8477bf033bcedc7ec8d32dab55fd7a3cfdb8aa3 [file] [log] [blame]
Alexander Hansencc372352025-01-14 14:15:39 +01001#pragma once
2
3#include "software_update.hpp"
4
5#include <sdbusplus/async/context.hpp>
6#include <xyz/openbmc_project/Association/Definitions/aserver.hpp>
7#include <xyz/openbmc_project/Software/Activation/aserver.hpp>
8#include <xyz/openbmc_project/Software/ActivationBlocksTransition/aserver.hpp>
9#include <xyz/openbmc_project/Software/ActivationProgress/aserver.hpp>
10#include <xyz/openbmc_project/Software/Version/aserver.hpp>
Alexander Hansende5e76f2025-02-20 16:30:11 +010011#include <xyz/openbmc_project/Software/Version/client.hpp>
Alexander Hansencc372352025-01-14 14:15:39 +010012
13#include <string>
14
15namespace phosphor::software::device
16{
17class Device;
18}
19
20namespace phosphor::software
21{
22
Alexander Hansencc372352025-01-14 14:15:39 +010023using SoftwareActivationBlocksTransition = sdbusplus::aserver::xyz::
24 openbmc_project::software::ActivationBlocksTransition<Software>;
25
26using SoftwareVersion =
27 sdbusplus::aserver::xyz::openbmc_project::software::Version<Software>;
28using SoftwareActivation =
29 sdbusplus::aserver::xyz::openbmc_project::software::Activation<Software>;
30using SoftwareAssociationDefinitions =
31 sdbusplus::aserver::xyz::openbmc_project::association::Definitions<
32 Software>;
33
34// This represents a software version running on the device.
35class Software : private SoftwareActivation
36{
37 public:
38 Software(sdbusplus::async::context& ctx, device::Device& parent);
39
40 // Set the activation status of this software
41 // @param activation The activation status
42 void setActivation(SoftwareActivation::Activations activation);
43
44 // Add / remove the 'ActivationBlocksTransition' dbus interface.
45 // This dbus interface is only needed during the update process.
46 // @param enabled determines if the dbus interface should be there
47 void setActivationBlocksTransition(bool enabled);
48
49 // This should populate 'softwareUpdate'
50 // @param allowedApplyTimes When updates to this Version can be
51 // applied
52 void enableUpdate(const std::set<RequestedApplyTimes>& allowedApplyTimes);
53
54 // This should populate 'softwareVersion'
Alexander Hansende5e76f2025-02-20 16:30:11 +010055 // @param version the version string
56 // @param versionPurpose which kind of software
57 void setVersion(const std::string& versionStr,
58 SoftwareVersion::VersionPurpose versionPurpose =
59 SoftwareVersion::VersionPurpose::Unknown);
60
61 // Return the version purpose
62 SoftwareVersion::VersionPurpose getPurpose();
Alexander Hansencc372352025-01-14 14:15:39 +010063
64 // This should populate 'softwareAssociationDefinitions'
65 // @param isRunning if the software version is currently running
66 // on the device. Otherwise the software is assumed to be activating (not
67 // yet running).
68 sdbusplus::async::task<> createInventoryAssociations(bool isRunning);
69
70 // object path of this software
71 sdbusplus::message::object_path objectPath;
72
73 // The device we are associated to, meaning this software is either running
74 // on the device, or could potentially run on that device (update).
75 device::Device& parentDevice;
76
77 // The software id
78 const std::string swid;
79
80 // This is only required during the activation of the new fw
81 // and is deleted again afterwards.
82 // This member is public since the device specific update function
83 // needs to update the progress.
Alexander Hansendf628192025-06-18 16:28:59 +020084 std::unique_ptr<sdbusplus::aserver::xyz::openbmc_project::software::
85 ActivationProgress<Software>>
86 softwareActivationProgress = nullptr;
Alexander Hansencc372352025-01-14 14:15:39 +010087
Alexander Hansenf2c95a02024-11-26 11:16:44 +010088 static long int getRandomId();
89
Alexander Hansencc372352025-01-14 14:15:39 +010090 protected:
91 // @returns a random software id (swid) for that device
92 static std::string getRandomSoftwareId(device::Device& parent);
93
94 private:
95 Software(sdbusplus::async::context& ctx, device::Device& parent,
96 const std::string& swid);
97
98 // Dbus interface to prevent power state transition during update.
99 std::unique_ptr<SoftwareActivationBlocksTransition>
100 activationBlocksTransition = nullptr;
101
102 // The software update dbus interface is not always present.
103 // It is constructed if the software version is able to be updated.
104 // For the new software version, this interface is constructed after the
105 // update has taken effect
106 std::unique_ptr<update::SoftwareUpdate> updateIntf = nullptr;
107
108 // We do not know the software version until we parse the PLDM package.
109 // Since the Activation interface needs to be available
110 // before then, this is nullptr until we get to know the version.
111 std::unique_ptr<SoftwareVersion> version = nullptr;
112
113 // This represents our association to the inventory item in case
114 // this software is currently on the device.
115 std::unique_ptr<SoftwareAssociationDefinitions> associationDefinitions =
116 nullptr;
117
118 sdbusplus::async::context& ctx;
119
120 friend update::SoftwareUpdate;
121};
122
123}; // namespace phosphor::software