xref: /openbmc/bios-settings-mgr/include/manager.hpp (revision 4e29f80bf85c3a8197bb6c3183f25face059f29c)
1 /*
2  Copyright (c) 2020 Intel Corporation
3 
4  Licensed under the Apache License, Version 2.0 (the "License");
5  you may not use this file except in compliance with the License.
6  You may obtain a copy of the License at
7 
8       http:www.apache.org/licenses/LICENSE-2.0
9 
10  Unless required by applicable law or agreed to in writing, software
11  distributed under the License is distributed on an "AS IS" BASIS,
12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  See the License for the specific language governing permissions and
14  limitations under the License.
15 */
16 
17 #pragma once
18 
19 #include <sdbusplus/asio/object_server.hpp>
20 #include <sdbusplus/server.hpp>
21 #include <xyz/openbmc_project/BIOSConfig/Manager/server.hpp>
22 
23 #include <filesystem>
24 #include <string>
25 
26 namespace bios_config
27 {
28 
29 static constexpr auto service = "xyz.openbmc_project.BIOSConfigManager";
30 static constexpr auto objectPath = "/xyz/openbmc_project/bios_config/manager";
31 constexpr auto biosPersistFile = "biosData";
32 
33 using Base = sdbusplus::xyz::openbmc_project::BIOSConfig::server::Manager;
34 namespace fs = std::filesystem;
35 
36 /** @class Manager
37  *
38  *  @brief Implements the BIOS Manager
39  */
40 class Manager : public Base
41 {
42   public:
43     using BaseTable = std::map<
44         std::string,
45         std::tuple<
46             AttributeType, bool, std::string, std::string, std::string,
47             std::variant<int64_t, std::string>,
48             std::variant<int64_t, std::string>,
49             std::vector<std::tuple<
50                 BoundType, std::variant<int64_t, std::string>, std::string>>>>;
51 
52     using oldBaseTable = std::map<
53         std::string,
54         std::tuple<AttributeType, bool, std::string, std::string, std::string,
55                    std::variant<int64_t, std::string>,
56                    std::variant<int64_t, std::string>,
57                    std::vector<std::tuple<
58                        BoundType, std::variant<int64_t, std::string>>>>>;
59 
60     using ResetFlag = std::map<std::string, ResetFlag>;
61 
62     using PendingAttributes =
63         std::map<std::string,
64                  std::tuple<AttributeType, std::variant<int64_t, std::string>>>;
65 
66     using PendingAttribute =
67         std::tuple<AttributeType, std::variant<int64_t, std::string>>;
68 
69     using AttributeName = std::string;
70     using AttributeValue = std::variant<int64_t, std::string>;
71     using CurrentValue = std::variant<int64_t, std::string>;
72     using PendingValue = std::variant<int64_t, std::string>;
73     using AttributeDetails =
74         std::tuple<AttributeType, CurrentValue, PendingValue>;
75 
76     Manager() = delete;
77     ~Manager() = default;
78     Manager(const Manager&) = delete;
79     Manager& operator=(const Manager&) = delete;
80     Manager(Manager&&) = delete;
81     Manager& operator=(Manager&&) = delete;
82 
83     /** @brief Constructs Manager object.
84      *
85      *  @param[in] objectServer  - object server
86      *  @param[in] systemBus - bus connection
87      */
88     Manager(sdbusplus::asio::object_server& objectServer,
89             std::shared_ptr<sdbusplus::asio::connection>& systemBus,
90             std::string persistPath);
91 
92     /** @brief Set the BIOS attribute with a new value, the new value is added
93      *         to the PendingAttribute.
94      *
95      *  @param[in] attribute - attribute name
96      *  @param[in] value - new value for the attribute
97      *
98      *  @return On error, throw exception
99      */
100     void setAttribute(AttributeName attribute, AttributeValue value) override;
101 
102     /** @brief Get the details of the BIOS attribute
103      *
104      *  @param[in] attribute - attribute name
105      *
106      *  @return On success, return the attribute details: attribute type,
107      *          current value, pending value. On error, throw exception
108      */
109     AttributeDetails getAttribute(AttributeName attribute) override;
110 
111     /** @brief Set the BaseBIOSTable property and clears the PendingAttributes
112      *         property
113      *
114      *  @param[in] value - new BaseBIOSTable
115      *
116      *  @return The new BaseBIOSTable that is applied.
117      */
118     BaseTable baseBIOSTable(BaseTable value) override;
119 
120     ResetFlag resetBIOSSettings(ResetFlag value);
121 
122     /** @brief Set the PendingAttributes property, additionally checks if the
123      *         attributes are in the BaseBIOSTable, whether the attributes are
124      *         read only and validate the attribute value based on the
125      *         attribute type. PendingAttributes is cleared if value is empty.
126      *
127      *  @param[in] value - new PendingAttributes to append to the
128      *                     PendingAttributes property
129      *
130      *  @return On success, return the new PendingAttributes property that is
131      *          set.Throw exception if the validation fails.
132      */
133     PendingAttributes pendingAttributes(PendingAttributes value) override;
134 
135     /** @brief Convert the previosuly supported Base BIOS table to newly
136      * supported Base BIOS table
137      *
138      *  @param[in] biosTbl - Old Base BIOS table (without VDN)
139      *  @param[in] baseTable - Recently supported Base BIOS table (with VDN)
140      *
141      *  @return void
142      *
143      */
144     void convertBiosDataToVersion1(Manager::oldBaseTable biosTbl,
145                                    Manager::BaseTable& baseTable);
146 
147     /** @brief Convert the VDN supported Base BIOS table to old Base BIOS table
148      *
149      *  @param[in] biosTbl - Old Base BIOS table (without VDN)
150      *  @param[in] baseTable - Recently supported Base BIOS table (with VDN)
151      *
152      *  @return void
153      */
154     void convertBiosDataToVersion0(Manager::oldBaseTable& baseTable,
155                                    Manager::BaseTable& biosTbl);
156 
157   private:
158     /** @enum Index into the fields in the BaseBIOSTable
159      */
160     enum class Index : uint8_t
161     {
162         attributeType = 0,
163         readOnly,
164         displayName,
165         description,
166         menuPath,
167         currentValue,
168         defaultValue,
169         options,
170     };
171 
172     bool validateEnumOption(
173         const std::string& attrValue,
174         const std::vector<std::tuple<
175             BoundType, std::variant<int64_t, std::string>, std::string>>&
176             options);
177 
178     bool validateStringOption(
179         const std::string& attrValue,
180         const std::vector<std::tuple<
181             BoundType, std::variant<int64_t, std::string>, std::string>>&
182             options);
183 
184     bool validateIntegerOption(
185         const int64_t& attrValue,
186         const std::vector<std::tuple<
187             BoundType, std::variant<int64_t, std::string>, std::string>>&
188             options);
189 
190     sdbusplus::asio::object_server& objServer;
191     std::shared_ptr<sdbusplus::asio::connection>& systemBus;
192     std::filesystem::path biosFile;
193 };
194 
195 } // namespace bios_config
196