| Adriana Kobylak | 2d8fa22 | 2017-03-15 12:34:32 -0500 | [diff] [blame] | 1 | #pragma once | 
|  | 2 |  | 
| Adriana Kobylak | 2d8fa22 | 2017-03-15 12:34:32 -0500 | [diff] [blame] | 3 | #include "activation.hpp" | 
| Gunnar Mills | f6ed589 | 2018-09-07 17:08:02 -0500 | [diff] [blame] | 4 | #include "org/openbmc/Associations/server.hpp" | 
|  | 5 | #include "version.hpp" | 
|  | 6 | #include "xyz/openbmc_project/Collection/DeleteAll/server.hpp" | 
|  | 7 |  | 
|  | 8 | #include <sdbusplus/server.hpp> | 
| Michael Tritz | dd961b6 | 2017-05-17 14:07:03 -0500 | [diff] [blame] | 9 | #include <xyz/openbmc_project/Common/FactoryReset/server.hpp> | 
| Adriana Kobylak | 7cb480e | 2017-11-07 13:22:59 -0600 | [diff] [blame] | 10 | #include <xyz/openbmc_project/Object/Enable/server.hpp> | 
| Adriana Kobylak | 2d8fa22 | 2017-03-15 12:34:32 -0500 | [diff] [blame] | 11 |  | 
|  | 12 | namespace openpower | 
|  | 13 | { | 
|  | 14 | namespace software | 
|  | 15 | { | 
| Adriana Kobylak | befe5ce | 2017-04-05 15:57:44 -0500 | [diff] [blame] | 16 | namespace updater | 
| Adriana Kobylak | 2d8fa22 | 2017-03-15 12:34:32 -0500 | [diff] [blame] | 17 | { | 
|  | 18 |  | 
| Michael Tritz | dd961b6 | 2017-05-17 14:07:03 -0500 | [diff] [blame] | 19 | using ItemUpdaterInherit = sdbusplus::server::object::object< | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 20 | sdbusplus::xyz::openbmc_project::Common::server::FactoryReset, | 
|  | 21 | sdbusplus::org::openbmc::server::Associations, | 
|  | 22 | sdbusplus::xyz::openbmc_project::Collection::server::DeleteAll>; | 
| Michael Tritz | b541f1b | 2017-10-15 15:10:21 -0500 | [diff] [blame] | 23 | using GardResetInherit = sdbusplus::server::object::object< | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 24 | sdbusplus::xyz::openbmc_project::Common::server::FactoryReset>; | 
| Adriana Kobylak | 7cb480e | 2017-11-07 13:22:59 -0600 | [diff] [blame] | 25 | using ObjectEnable = sdbusplus::server::object::object< | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 26 | sdbusplus::xyz::openbmc_project::Object::server::Enable>; | 
| Patrick Williams | 3accb32 | 2017-05-30 16:29:52 -0500 | [diff] [blame] | 27 | namespace MatchRules = sdbusplus::bus::match::rules; | 
| Michael Tritz | dd961b6 | 2017-05-17 14:07:03 -0500 | [diff] [blame] | 28 |  | 
| Gunnar Mills | 9741cd1 | 2017-08-28 15:09:00 -0500 | [diff] [blame] | 29 | using AssociationList = | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 30 | std::vector<std::tuple<std::string, std::string, std::string>>; | 
| Gunnar Mills | 9741cd1 | 2017-08-28 15:09:00 -0500 | [diff] [blame] | 31 |  | 
| Michael Tritz | 4ecea0f | 2017-12-05 17:51:31 -0600 | [diff] [blame] | 32 | constexpr auto GARD_PATH = "/org/open_power/control/gard"; | 
| Adriana Kobylak | 7cb480e | 2017-11-07 13:22:59 -0600 | [diff] [blame] | 33 | constexpr static auto volatilePath = "/org/open_power/control/volatile"; | 
| Michael Tritz | b541f1b | 2017-10-15 15:10:21 -0500 | [diff] [blame] | 34 |  | 
|  | 35 | /** @class GardReset | 
|  | 36 | *  @brief OpenBMC GARD factory reset implementation. | 
|  | 37 | *  @details An implementation of xyz.openbmc_project.Common.FactoryReset under | 
|  | 38 | *  /org/openpower/control/gard. | 
|  | 39 | */ | 
|  | 40 | class GardReset : public GardResetInherit | 
|  | 41 | { | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 42 | public: | 
|  | 43 | /** @brief Constructs GardReset. | 
|  | 44 | * | 
|  | 45 | * @param[in] bus    - The Dbus bus object | 
|  | 46 | * @param[in] path   - The Dbus object path | 
|  | 47 | */ | 
|  | 48 | GardReset(sdbusplus::bus::bus& bus, const std::string& path) : | 
|  | 49 | GardResetInherit(bus, path.c_str(), true), bus(bus), path(path) | 
|  | 50 | { | 
|  | 51 | std::vector<std::string> interfaces({interface}); | 
|  | 52 | bus.emit_interfaces_added(path.c_str(), interfaces); | 
|  | 53 | } | 
| Michael Tritz | b541f1b | 2017-10-15 15:10:21 -0500 | [diff] [blame] | 54 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 55 | ~GardReset() | 
|  | 56 | { | 
|  | 57 | std::vector<std::string> interfaces({interface}); | 
|  | 58 | bus.emit_interfaces_removed(path.c_str(), interfaces); | 
|  | 59 | } | 
| Michael Tritz | b541f1b | 2017-10-15 15:10:21 -0500 | [diff] [blame] | 60 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 61 | private: | 
|  | 62 | // TODO Remove once openbmc/openbmc#1975 is resolved | 
|  | 63 | static constexpr auto interface = "xyz.openbmc_project.Common.FactoryReset"; | 
|  | 64 | sdbusplus::bus::bus& bus; | 
|  | 65 | std::string path; | 
| Michael Tritz | b541f1b | 2017-10-15 15:10:21 -0500 | [diff] [blame] | 66 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 67 | /** | 
|  | 68 | * @brief GARD factory reset - clears the PNOR GARD partition. | 
|  | 69 | */ | 
|  | 70 | void reset() override; | 
| Michael Tritz | b541f1b | 2017-10-15 15:10:21 -0500 | [diff] [blame] | 71 | }; | 
|  | 72 |  | 
| Adriana Kobylak | 2d8fa22 | 2017-03-15 12:34:32 -0500 | [diff] [blame] | 73 | /** @class ItemUpdater | 
| Gunnar Mills | 139cf1a | 2017-09-21 16:25:37 -0500 | [diff] [blame] | 74 | *  @brief Manages the activation of the host version items. | 
| Adriana Kobylak | 2d8fa22 | 2017-03-15 12:34:32 -0500 | [diff] [blame] | 75 | */ | 
| Michael Tritz | dd961b6 | 2017-05-17 14:07:03 -0500 | [diff] [blame] | 76 | class ItemUpdater : public ItemUpdaterInherit | 
| Adriana Kobylak | 2d8fa22 | 2017-03-15 12:34:32 -0500 | [diff] [blame] | 77 | { | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 78 | public: | 
|  | 79 | /** @brief Constructs ItemUpdater | 
|  | 80 | * | 
|  | 81 | * @param[in] bus    - The D-Bus bus object | 
|  | 82 | * @param[in] path   - The D-Bus path | 
|  | 83 | */ | 
|  | 84 | ItemUpdater(sdbusplus::bus::bus& bus, const std::string& path) : | 
|  | 85 | ItemUpdaterInherit(bus, path.c_str()), bus(bus), | 
|  | 86 | versionMatch(bus, | 
|  | 87 | MatchRules::interfacesAdded() + | 
|  | 88 | MatchRules::path("/xyz/openbmc_project/software"), | 
|  | 89 | std::bind(std::mem_fn(&ItemUpdater::createActivation), | 
|  | 90 | this, std::placeholders::_1)) | 
|  | 91 | { | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 92 | } | 
| Adriana Kobylak | 2d8fa22 | 2017-03-15 12:34:32 -0500 | [diff] [blame] | 93 |  | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 94 | virtual ~ItemUpdater() = default; | 
|  | 95 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 96 | /** @brief Sets the given priority free by incrementing | 
|  | 97 | *  any existing priority with the same value by 1 | 
|  | 98 | * | 
|  | 99 | *  @param[in] value - The priority that needs to be set free. | 
|  | 100 | *  @param[in] versionId - The Id of the version for which we | 
|  | 101 | *                         are trying to free up the priority. | 
|  | 102 | *  @return None | 
|  | 103 | */ | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 104 | virtual void freePriority(uint8_t value, const std::string& versionId) = 0; | 
| Saqib Khan | 81bac88 | 2017-06-08 12:17:01 -0500 | [diff] [blame] | 105 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 106 | /** @brief Determine is the given priority is the lowest | 
|  | 107 | * | 
|  | 108 | *  @param[in] value - The priority that needs to be checked. | 
|  | 109 | * | 
|  | 110 | *  @return boolean corresponding to whether the given | 
|  | 111 | *           priority is lowest. | 
|  | 112 | */ | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 113 | virtual bool isLowestPriority(uint8_t value) = 0; | 
| Saqib Khan | 2af5c49 | 2017-07-17 16:15:13 -0500 | [diff] [blame] | 114 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 115 | /** | 
|  | 116 | * @brief Create and populate the active PNOR Version. | 
|  | 117 | */ | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 118 | virtual void processPNORImage() = 0; | 
| Saqib Khan | 167601b | 2017-06-18 23:33:46 -0500 | [diff] [blame] | 119 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 120 | /** @brief Deletes version | 
|  | 121 | * | 
|  | 122 | *  @param[in] entryId - Id of the version to delete | 
|  | 123 | * | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 124 | *  @return - Returns true if the version is deleted. | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 125 | */ | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 126 | virtual bool erase(std::string entryId); | 
| Leonel Gonzalez | 9c8adfa | 2017-07-12 11:08:40 -0500 | [diff] [blame] | 127 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 128 | /** | 
|  | 129 | * @brief Erases any non-active pnor versions. | 
|  | 130 | */ | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 131 | virtual void deleteAll() = 0; | 
| Michael Tritz | 234a07e | 2017-09-21 00:53:06 -0500 | [diff] [blame] | 132 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 133 | /** @brief Brings the total number of active PNOR versions to | 
|  | 134 | *         ACTIVE_PNOR_MAX_ALLOWED -1. This function is intended to be | 
|  | 135 | *         run before activating a new PNOR version. If this function | 
|  | 136 | *         needs to delete any PNOR version(s) it will delete the | 
|  | 137 | *         version(s) with the highest priority, skipping the | 
|  | 138 | *         functional PNOR version. | 
|  | 139 | */ | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 140 | virtual void freeSpace() = 0; | 
| Saqib Khan | 2cbfa03 | 2017-08-17 14:52:37 -0500 | [diff] [blame] | 141 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 142 | /** @brief Determine the software version id | 
|  | 143 | *         from the symlink target (e.g. /media/ro-2a1022fe). | 
|  | 144 | * | 
|  | 145 | * @param[in] symlinkPath - The path of the symlink. | 
|  | 146 | * @param[out] id - The version id as a string. | 
|  | 147 | */ | 
|  | 148 | static std::string determineId(const std::string& symlinkPath); | 
| Gunnar Mills | 2badd7a | 2017-09-20 12:51:28 -0500 | [diff] [blame] | 149 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 150 | /** @brief Creates an active association to the | 
|  | 151 | *  newly active software image | 
|  | 152 | * | 
|  | 153 | * @param[in]  path - The path to create the association to. | 
|  | 154 | */ | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 155 | virtual void createActiveAssociation(const std::string& path); | 
| Gunnar Mills | 9741cd1 | 2017-08-28 15:09:00 -0500 | [diff] [blame] | 156 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 157 | /** @brief Updates the functional association to the | 
|  | 158 | *  new "running" PNOR image | 
|  | 159 | * | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 160 | * @param[in]  versionId - The id of the image to update the association to. | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 161 | */ | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 162 | virtual void updateFunctionalAssociation(const std::string& versionId); | 
| Gunnar Mills | 833e4f3 | 2017-09-14 12:30:27 -0500 | [diff] [blame] | 163 |  | 
| Adriana Kobylak | b523717 | 2018-10-30 14:51:53 -0500 | [diff] [blame] | 164 | /** @brief Removes the associations from the provided software image path | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 165 | * | 
|  | 166 | * @param[in]  path - The path to remove the association from. | 
|  | 167 | */ | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 168 | virtual void removeAssociation(const std::string& path); | 
| Gunnar Mills | 9741cd1 | 2017-08-28 15:09:00 -0500 | [diff] [blame] | 169 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 170 | /** @brief Persistent GardReset dbus object */ | 
|  | 171 | std::unique_ptr<GardReset> gardReset; | 
| Michael Tritz | b541f1b | 2017-10-15 15:10:21 -0500 | [diff] [blame] | 172 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 173 | /** @brief Check whether the provided image id is the functional one | 
|  | 174 | * | 
|  | 175 | * @param[in] - versionId - The id of the image to check. | 
|  | 176 | * | 
|  | 177 | * @return - Returns true if this version is currently functional. | 
|  | 178 | */ | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 179 | virtual bool isVersionFunctional(const std::string& versionId) = 0; | 
| Michael Tritz | 5b75651 | 2017-10-06 16:52:01 -0500 | [diff] [blame] | 180 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 181 | /** @brief Persistent ObjectEnable D-Bus object */ | 
|  | 182 | std::unique_ptr<ObjectEnable> volatileEnable; | 
| Adriana Kobylak | 7cb480e | 2017-11-07 13:22:59 -0600 | [diff] [blame] | 183 |  | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 184 | protected: | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 185 | /** @brief Callback function for Software.Version match. | 
|  | 186 | *  @details Creates an Activation D-Bus object. | 
|  | 187 | * | 
|  | 188 | * @param[in]  msg       - Data associated with subscribed signal | 
|  | 189 | */ | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 190 | virtual void createActivation(sdbusplus::message::message& msg) = 0; | 
| Saqib Khan | 7254f0e | 2017-04-10 21:45:37 -0500 | [diff] [blame] | 191 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 192 | /** @brief Persistent sdbusplus D-Bus bus connection. */ | 
|  | 193 | sdbusplus::bus::bus& bus; | 
| Adriana Kobylak | 2d8fa22 | 2017-03-15 12:34:32 -0500 | [diff] [blame] | 194 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 195 | /** @brief Persistent map of Activation D-Bus objects and their | 
|  | 196 | * version id */ | 
|  | 197 | std::map<std::string, std::unique_ptr<Activation>> activations; | 
| Adriana Kobylak | 2d8fa22 | 2017-03-15 12:34:32 -0500 | [diff] [blame] | 198 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 199 | /** @brief Persistent map of Version D-Bus objects and their | 
|  | 200 | * version id */ | 
|  | 201 | std::map<std::string, std::unique_ptr<Version>> versions; | 
| Saqib Khan | ce14870 | 2017-06-11 12:01:58 -0500 | [diff] [blame] | 202 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 203 | /** @brief sdbusplus signal match for Software.Version */ | 
|  | 204 | sdbusplus::bus::match_t versionMatch; | 
| Michael Tritz | dd961b6 | 2017-05-17 14:07:03 -0500 | [diff] [blame] | 205 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 206 | /** @brief This entry's associations */ | 
|  | 207 | AssociationList assocs = {}; | 
| Gunnar Mills | 9741cd1 | 2017-08-28 15:09:00 -0500 | [diff] [blame] | 208 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 209 | /** @brief Host factory reset - clears PNOR partitions for each | 
|  | 210 | * Activation D-Bus object */ | 
| Lei YU | f3ce433 | 2019-02-21 14:09:49 +0800 | [diff] [blame^] | 211 | void reset() override = 0; | 
| Eddie James | 13fc66a | 2017-08-31 15:36:44 -0500 | [diff] [blame] | 212 |  | 
| Adriana Kobylak | 70dcb63 | 2018-02-27 15:46:52 -0600 | [diff] [blame] | 213 | /** @brief Check whether the host is running | 
|  | 214 | * | 
|  | 215 | * @return - Returns true if the Chassis is powered on. | 
|  | 216 | */ | 
|  | 217 | bool isChassisOn(); | 
| Adriana Kobylak | 2d8fa22 | 2017-03-15 12:34:32 -0500 | [diff] [blame] | 218 | }; | 
|  | 219 |  | 
| Adriana Kobylak | befe5ce | 2017-04-05 15:57:44 -0500 | [diff] [blame] | 220 | } // namespace updater | 
| Adriana Kobylak | 2d8fa22 | 2017-03-15 12:34:32 -0500 | [diff] [blame] | 221 | } // namespace software | 
|  | 222 | } // namespace openpower |