blob: 8a39b2eadb24d192bca7496962c18373d18a4821 [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 {
96 const size_t expectedSize = PLDM_MAX_TYPES *
97 (PLDM_MAX_CMDS_PER_TYPE / 8);
98 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 */
125 std::string_view getTerminusName()
126 {
127 return terminusName;
128 }
129
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000130 /** @brief A list of PDRs fetched from Terminus */
131 std::vector<std::vector<uint8_t>> pdrs{};
132
133 /** @brief A flag to indicate if terminus has been initialized */
134 bool initialized = false;
135
Thu Nguyen3c5486d2024-08-01 08:03:08 +0000136 /** @brief A list of numericSensors */
137 std::vector<std::shared_ptr<NumericSensor>> numericSensors{};
138
Gilbert Chende2a1322022-05-24 15:35:21 +0100139 /** @brief Get Sensor Auxiliary Names by sensorID
140 *
141 * @param[in] id - sensor ID
142 * @return sensor auxiliary names
143 */
144 std::shared_ptr<SensorAuxiliaryNames> getSensorAuxiliaryNames(SensorId id);
145
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000146 private:
Thu Nguyenb8cf46b2024-06-15 02:44:35 +0000147 /** @brief Find the Terminus Name from the Entity Auxiliary name list
148 * The Entity Auxiliary name list is entityAuxiliaryNamesTbl.
149 * @return terminus name in string option
150 */
151 std::optional<std::string_view> findTerminusName();
152
Thu Nguyen3c5486d2024-08-01 08:03:08 +0000153 /** @brief Construct the NumericSensor sensor class for the PLDM sensor.
154 * The NumericSensor class will handle create D-Bus object path,
155 * provide the APIs to update sensor value, threshold...
156 *
157 * @param[in] pdr - the numeric sensor PDR info
158 */
159 void addNumericSensor(
160 const std::shared_ptr<pldm_numeric_sensor_value_pdr> pdr);
161
Gilbert Chende2a1322022-05-24 15:35:21 +0100162 /** @brief Parse the numeric sensor PDRs
163 *
164 * @param[in] pdrData - the response PDRs from GetPDR command
165 * @return pointer to numeric sensor info struct
166 */
167 std::shared_ptr<pldm_numeric_sensor_value_pdr>
168 parseNumericSensorPDR(const std::vector<uint8_t>& pdrData);
169
170 /** @brief Parse the sensor Auxiliary name PDRs
171 *
172 * @param[in] pdrData - the response PDRs from GetPDR command
173 * @return pointer to sensor Auxiliary name info struct
174 */
175 std::shared_ptr<SensorAuxiliaryNames>
176 parseSensorAuxiliaryNamesPDR(const std::vector<uint8_t>& pdrData);
177
Thu Nguyenb8cf46b2024-06-15 02:44:35 +0000178 /** @brief Parse the Entity Auxiliary name PDRs
179 *
180 * @param[in] pdrData - the response PDRs from GetPDR command
181 * @return pointer to Entity Auxiliary name info struct
182 */
183 std::shared_ptr<EntityAuxiliaryNames>
184 parseEntityAuxiliaryNamesPDR(const std::vector<uint8_t>& pdrData);
185
Thu Nguyen3c5486d2024-08-01 08:03:08 +0000186 /** @brief Construct the NumericSensor sensor class for the compact numeric
187 * PLDM sensor.
188 *
189 * @param[in] pdr - the compact numeric sensor PDR info
190 */
191 void addCompactNumericSensor(
192 const std::shared_ptr<pldm_compact_numeric_sensor_pdr> pdr);
193
Gilbert Chende2a1322022-05-24 15:35:21 +0100194 /** @brief Parse the compact numeric sensor PDRs
195 *
196 * @param[in] pdrData - the response PDRs from GetPDR command
197 * @return pointer to compact numeric sensor info struct
198 */
199 std::shared_ptr<pldm_compact_numeric_sensor_pdr>
200 parseCompactNumericSensorPDR(const std::vector<uint8_t>& pdrData);
201
202 /** @brief Parse the sensor Auxiliary name from compact numeric sensor PDRs
203 *
204 * @param[in] pdrData - the response PDRs from GetPDR command
205 * @return pointer to sensor Auxiliary name info struct
206 */
207 std::shared_ptr<SensorAuxiliaryNames>
208 parseCompactNumericSensorNames(const std::vector<uint8_t>& pdrData);
209
Thu Nguyen3c5486d2024-08-01 08:03:08 +0000210 /** @brief Create the terminus inventory path to
211 * /xyz/openbmc_project/inventory/Item/Board/.
212 *
213 * @param[in] tName - the terminus name
214 * @return true/false: True if there is no error in creating inventory path
215 *
216 */
217 bool createInventoryPath(std::string tName);
218
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000219 /* @brief The terminus's TID */
220 pldm_tid_t tid;
221
222 /* @brief The supported PLDM command types of the terminus */
223 std::bitset<64> supportedTypes;
224
225 /** @brief Store supported PLDM commands of a terminus
226 * Maximum number of PLDM Type is PLDM_MAX_TYPES
227 * Maximum number of PLDM command for each type is
228 * PLDM_MAX_CMDS_PER_TYPE.
229 * Each uint8_t can store the supported state of 8 PLDM commands.
230 * Size of supportedCmds will be
231 * PLDM_MAX_TYPES * (PLDM_MAX_CMDS_PER_TYPE / 8).
232 */
233 std::vector<uint8_t> supportedCmds;
Gilbert Chende2a1322022-05-24 15:35:21 +0100234
235 /* @brief Sensor Auxiliary Name list */
236 std::vector<std::shared_ptr<SensorAuxiliaryNames>>
237 sensorAuxiliaryNamesTbl{};
Thu Nguyenb8cf46b2024-06-15 02:44:35 +0000238
239 /* @brief Entity Auxiliary Name list */
240 std::vector<std::shared_ptr<EntityAuxiliaryNames>>
241 entityAuxiliaryNamesTbl{};
242
243 /** @brief Terminus name */
244 EntityName terminusName{};
Thu Nguyen3c5486d2024-08-01 08:03:08 +0000245 /* @brief The pointer of iventory D-Bus interface for the terminus */
246 std::unique_ptr<InventoryItemBoardIntf> inventoryItemBoardInft = nullptr;
247
248 /* @brief Inventory D-Bus object path of the terminus */
249 std::string inventoryPath;
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000250};
251} // namespace platform_mc
252} // namespace pldm