blob: 1986da00c7f31802684dcbc779b63955d9da0bc0 [file] [log] [blame]
Gilbert Chen6c7fed42022-02-22 15:40:17 +00001#pragma once
2
3#include "libpldm/platform.h"
4
5#include "common/types.hpp"
Thu Nguyen3c5486d2024-08-01 08:03:08 +00006#include "numeric_sensor.hpp"
Gilbert Chen6c7fed42022-02-22 15:40:17 +00007#include "requester/handler.hpp"
Thu Nguyen3c5486d2024-08-01 08:03:08 +00008#include "terminus.hpp"
Gilbert Chen6c7fed42022-02-22 15:40:17 +00009
10#include <sdbusplus/server/object.hpp>
11#include <sdeventplus/event.hpp>
12#include <xyz/openbmc_project/Inventory/Item/Board/server.hpp>
13
14#include <algorithm>
15#include <bitset>
Gilbert Chende2a1322022-05-24 15:35:21 +010016#include <string>
17#include <tuple>
18#include <utility>
Gilbert Chen6c7fed42022-02-22 15:40:17 +000019#include <vector>
20
21namespace pldm
22{
23namespace platform_mc
24{
25
Thu Nguyenb8cf46b2024-06-15 02:44:35 +000026using ContainerID = uint16_t;
27using EntityInstanceNumber = uint16_t;
28using EntityName = std::string;
29using EntityType = uint16_t;
Gilbert Chende2a1322022-05-24 15:35:21 +010030using SensorId = uint16_t;
31using SensorCnt = uint8_t;
32using NameLanguageTag = std::string;
33using SensorName = std::string;
34using SensorAuxiliaryNames = std::tuple<
35 SensorId, SensorCnt,
36 std::vector<std::vector<std::pair<NameLanguageTag, SensorName>>>>;
Thu Nguyen3c5486d2024-08-01 08:03:08 +000037using InventoryItemBoardIntf = sdbusplus::server::object_t<
38 sdbusplus::xyz::openbmc_project::Inventory::Item::server::Board>;
Gilbert Chende2a1322022-05-24 15:35:21 +010039
Thu Nguyenb8cf46b2024-06-15 02:44:35 +000040/** @struct EntityKey
41 *
42 * EntityKey uniquely identifies the PLDM entity and a combination of Entity
43 * Type, Entity Instance Number, Entity Container ID
44 *
45 */
46struct EntityKey
47{
48 EntityType type; //!< Entity type
49 EntityInstanceNumber instanceIdx; //!< Entity instance number
50 ContainerID containerId; //!< Entity container ID
51
52 bool operator==(const EntityKey& e) const
53 {
54 return ((type == e.type) && (instanceIdx == e.instanceIdx) &&
55 (containerId == e.containerId));
56 }
57};
58
59using AuxiliaryNames = std::vector<std::pair<NameLanguageTag, std::string>>;
60using EntityKey = struct EntityKey;
61using EntityAuxiliaryNames = std::tuple<EntityKey, AuxiliaryNames>;
62
Gilbert Chen6c7fed42022-02-22 15:40:17 +000063/**
64 * @brief Terminus
65 *
66 * Terminus class holds the TID, supported PLDM Type or PDRs which are needed by
67 * other manager class for sensor monitoring and control.
68 */
69class Terminus
70{
71 public:
72 Terminus(pldm_tid_t tid, uint64_t supportedPLDMTypes);
73
74 /** @brief Check if the terminus supports the PLDM type message
75 *
76 * @param[in] type - PLDM Type
77 * @return support state - True if support, otherwise False
78 */
79 bool doesSupportType(uint8_t type);
80
81 /** @brief Check if the terminus supports the PLDM command message
82 *
83 * @param[in] type - PLDM Type
84 * @param[in] command - PLDM command
85 * @return support state - True if support, otherwise False
86 */
87 bool doesSupportCommand(uint8_t type, uint8_t command);
88
89 /** @brief Set the supported PLDM commands for terminus
90 *
91 * @param[in] cmds - bit mask of the supported PLDM commands
92 * @return success state - True if success, otherwise False
93 */
94 bool setSupportedCommands(const std::vector<uint8_t>& cmds)
95 {
Patrick Williams16c2a0a2024-08-16 15:20:59 -040096 const size_t expectedSize =
97 PLDM_MAX_TYPES * (PLDM_MAX_CMDS_PER_TYPE / 8);
Gilbert Chen6c7fed42022-02-22 15:40:17 +000098 if (cmds.empty() || cmds.size() != expectedSize)
99 {
100 lg2::error(
101 "setSupportedCommands received invalid bit mask size. Expected: {EXPECTED}, Received: {RECEIVED}",
102 "EXPECTED", expectedSize, "RECEIVED", cmds.size());
103 return false;
104 }
105
106 /* Assign Vector supportedCmds by Vector cmds */
107 supportedCmds.resize(cmds.size());
108 std::copy(cmds.begin(), cmds.begin() + cmds.size(),
109 supportedCmds.begin());
110
111 return true;
112 }
Gilbert Chende2a1322022-05-24 15:35:21 +0100113
114 /** @brief Parse the PDRs stored in the member variable, pdrs.
115 */
116 void parseTerminusPDRs();
117
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000118 /** @brief The getter to return terminus's TID */
119 pldm_tid_t getTid()
120 {
121 return tid;
122 }
123
Thu Nguyenb8cf46b2024-06-15 02:44:35 +0000124 /** @brief The getter to get terminus's mctp medium */
Thu Nguyen9fc79122024-09-10 10:15:01 +0000125 std::optional<std::string_view> getTerminusName()
Thu Nguyenb8cf46b2024-06-15 02:44:35 +0000126 {
Thu Nguyen9fc79122024-09-10 10:15:01 +0000127 if (terminusName.empty())
128 {
129 return std::nullopt;
130 }
Thu Nguyenb8cf46b2024-06-15 02:44:35 +0000131 return terminusName;
132 }
133
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000134 /** @brief A list of PDRs fetched from Terminus */
135 std::vector<std::vector<uint8_t>> pdrs{};
136
137 /** @brief A flag to indicate if terminus has been initialized */
138 bool initialized = false;
139
Gilbert Chen77e6fe72024-08-06 09:23:30 +0000140 /** @brief maximum message buffer size the terminus can send and receive */
141 uint16_t maxBufferSize;
142
Thu Nguyen51d66b52024-08-06 09:15:55 +0000143 /** @brief This value indicates the event messaging styles supported by the
144 * terminus
145 */
146 bitfield8_t synchronyConfigurationSupported;
147
Thu Nguyen3c5486d2024-08-01 08:03:08 +0000148 /** @brief A list of numericSensors */
149 std::vector<std::shared_ptr<NumericSensor>> numericSensors{};
150
Dung Caof48015b2023-11-21 04:38:29 +0000151 /** @brief The flag indicates that the terminus FIFO contains a large
152 * message that will require a multipart transfer via the
153 * PollForPlatformEvent command
154 */
155 bool pollEvent;
156
157 /** @brief The sensor id is used in pollForPlatformMessage command */
158 uint16_t pollEventId;
159
160 /** @brief The dataTransferHandle from `pldmMessagePollEvent` event and will
161 * be used as `dataTransferHandle` for pollForPlatformMessage
162 * command.
163 */
164 uint32_t pollDataTransferHandle;
165
Gilbert Chende2a1322022-05-24 15:35:21 +0100166 /** @brief Get Sensor Auxiliary Names by sensorID
167 *
168 * @param[in] id - sensor ID
169 * @return sensor auxiliary names
170 */
171 std::shared_ptr<SensorAuxiliaryNames> getSensorAuxiliaryNames(SensorId id);
172
Gilbert Chen77e6fe72024-08-06 09:23:30 +0000173 /** @brief Get Numeric Sensor Object by sensorID
174 *
175 * @param[in] id - sensor ID
176 *
177 * @return sensor object
178 */
179 std::shared_ptr<NumericSensor> getSensorObject(SensorId id);
180
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000181 private:
Thu Nguyenb8cf46b2024-06-15 02:44:35 +0000182 /** @brief Find the Terminus Name from the Entity Auxiliary name list
183 * The Entity Auxiliary name list is entityAuxiliaryNamesTbl.
184 * @return terminus name in string option
185 */
186 std::optional<std::string_view> findTerminusName();
187
Thu Nguyen3c5486d2024-08-01 08:03:08 +0000188 /** @brief Construct the NumericSensor sensor class for the PLDM sensor.
189 * The NumericSensor class will handle create D-Bus object path,
190 * provide the APIs to update sensor value, threshold...
191 *
192 * @param[in] pdr - the numeric sensor PDR info
193 */
194 void addNumericSensor(
195 const std::shared_ptr<pldm_numeric_sensor_value_pdr> pdr);
196
Gilbert Chende2a1322022-05-24 15:35:21 +0100197 /** @brief Parse the numeric sensor PDRs
198 *
199 * @param[in] pdrData - the response PDRs from GetPDR command
200 * @return pointer to numeric sensor info struct
201 */
202 std::shared_ptr<pldm_numeric_sensor_value_pdr>
203 parseNumericSensorPDR(const std::vector<uint8_t>& pdrData);
204
205 /** @brief Parse the sensor Auxiliary name PDRs
206 *
207 * @param[in] pdrData - the response PDRs from GetPDR command
208 * @return pointer to sensor Auxiliary name info struct
209 */
210 std::shared_ptr<SensorAuxiliaryNames>
211 parseSensorAuxiliaryNamesPDR(const std::vector<uint8_t>& pdrData);
212
Thu Nguyenb8cf46b2024-06-15 02:44:35 +0000213 /** @brief Parse the Entity Auxiliary name PDRs
214 *
215 * @param[in] pdrData - the response PDRs from GetPDR command
216 * @return pointer to Entity Auxiliary name info struct
217 */
218 std::shared_ptr<EntityAuxiliaryNames>
219 parseEntityAuxiliaryNamesPDR(const std::vector<uint8_t>& pdrData);
220
Thu Nguyen3c5486d2024-08-01 08:03:08 +0000221 /** @brief Construct the NumericSensor sensor class for the compact numeric
222 * PLDM sensor.
223 *
224 * @param[in] pdr - the compact numeric sensor PDR info
225 */
226 void addCompactNumericSensor(
227 const std::shared_ptr<pldm_compact_numeric_sensor_pdr> pdr);
228
Gilbert Chende2a1322022-05-24 15:35:21 +0100229 /** @brief Parse the compact numeric sensor PDRs
230 *
231 * @param[in] pdrData - the response PDRs from GetPDR command
232 * @return pointer to compact numeric sensor info struct
233 */
234 std::shared_ptr<pldm_compact_numeric_sensor_pdr>
235 parseCompactNumericSensorPDR(const std::vector<uint8_t>& pdrData);
236
237 /** @brief Parse the sensor Auxiliary name from compact numeric sensor PDRs
238 *
239 * @param[in] pdrData - the response PDRs from GetPDR command
240 * @return pointer to sensor Auxiliary name info struct
241 */
242 std::shared_ptr<SensorAuxiliaryNames>
243 parseCompactNumericSensorNames(const std::vector<uint8_t>& pdrData);
244
Thu Nguyen3c5486d2024-08-01 08:03:08 +0000245 /** @brief Create the terminus inventory path to
246 * /xyz/openbmc_project/inventory/Item/Board/.
247 *
248 * @param[in] tName - the terminus name
249 * @return true/false: True if there is no error in creating inventory path
250 *
251 */
252 bool createInventoryPath(std::string tName);
253
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000254 /* @brief The terminus's TID */
255 pldm_tid_t tid;
256
257 /* @brief The supported PLDM command types of the terminus */
258 std::bitset<64> supportedTypes;
259
260 /** @brief Store supported PLDM commands of a terminus
261 * Maximum number of PLDM Type is PLDM_MAX_TYPES
262 * Maximum number of PLDM command for each type is
263 * PLDM_MAX_CMDS_PER_TYPE.
264 * Each uint8_t can store the supported state of 8 PLDM commands.
265 * Size of supportedCmds will be
266 * PLDM_MAX_TYPES * (PLDM_MAX_CMDS_PER_TYPE / 8).
267 */
268 std::vector<uint8_t> supportedCmds;
Gilbert Chende2a1322022-05-24 15:35:21 +0100269
270 /* @brief Sensor Auxiliary Name list */
271 std::vector<std::shared_ptr<SensorAuxiliaryNames>>
272 sensorAuxiliaryNamesTbl{};
Thu Nguyenb8cf46b2024-06-15 02:44:35 +0000273
274 /* @brief Entity Auxiliary Name list */
275 std::vector<std::shared_ptr<EntityAuxiliaryNames>>
276 entityAuxiliaryNamesTbl{};
277
278 /** @brief Terminus name */
279 EntityName terminusName{};
Thu Nguyen3c5486d2024-08-01 08:03:08 +0000280 /* @brief The pointer of iventory D-Bus interface for the terminus */
281 std::unique_ptr<InventoryItemBoardIntf> inventoryItemBoardInft = nullptr;
282
283 /* @brief Inventory D-Bus object path of the terminus */
284 std::string inventoryPath;
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000285};
286} // namespace platform_mc
287} // namespace pldm