xref: /openbmc/pldm/platform-mc/terminus.hpp (revision 267c7efc)
1 #pragma once
2 
3 #include "libpldm/platform.h"
4 
5 #include "common/types.hpp"
6 #include "requester/handler.hpp"
7 
8 #include <sdbusplus/server/object.hpp>
9 #include <sdeventplus/event.hpp>
10 #include <xyz/openbmc_project/Inventory/Item/Board/server.hpp>
11 
12 #include <algorithm>
13 #include <bitset>
14 #include <string>
15 #include <tuple>
16 #include <utility>
17 #include <vector>
18 
19 namespace pldm
20 {
21 namespace platform_mc
22 {
23 
24 using SensorId = uint16_t;
25 using SensorCnt = uint8_t;
26 using NameLanguageTag = std::string;
27 using SensorName = std::string;
28 using SensorAuxiliaryNames = std::tuple<
29     SensorId, SensorCnt,
30     std::vector<std::vector<std::pair<NameLanguageTag, SensorName>>>>;
31 
32 /**
33  * @brief Terminus
34  *
35  * Terminus class holds the TID, supported PLDM Type or PDRs which are needed by
36  * other manager class for sensor monitoring and control.
37  */
38 class Terminus
39 {
40   public:
41     Terminus(pldm_tid_t tid, uint64_t supportedPLDMTypes);
42 
43     /** @brief Check if the terminus supports the PLDM type message
44      *
45      *  @param[in] type - PLDM Type
46      *  @return support state - True if support, otherwise False
47      */
48     bool doesSupportType(uint8_t type);
49 
50     /** @brief Check if the terminus supports the PLDM command message
51      *
52      *  @param[in] type - PLDM Type
53      *  @param[in] command - PLDM command
54      *  @return support state - True if support, otherwise False
55      */
56     bool doesSupportCommand(uint8_t type, uint8_t command);
57 
58     /** @brief Set the supported PLDM commands for terminus
59      *
60      *  @param[in] cmds - bit mask of the supported PLDM commands
61      *  @return success state - True if success, otherwise False
62      */
63     bool setSupportedCommands(const std::vector<uint8_t>& cmds)
64     {
65         const size_t expectedSize = PLDM_MAX_TYPES *
66                                     (PLDM_MAX_CMDS_PER_TYPE / 8);
67         if (cmds.empty() || cmds.size() != expectedSize)
68         {
69             lg2::error(
70                 "setSupportedCommands received invalid bit mask size. Expected: {EXPECTED}, Received: {RECEIVED}",
71                 "EXPECTED", expectedSize, "RECEIVED", cmds.size());
72             return false;
73         }
74 
75         /* Assign Vector supportedCmds by Vector cmds */
76         supportedCmds.resize(cmds.size());
77         std::copy(cmds.begin(), cmds.begin() + cmds.size(),
78                   supportedCmds.begin());
79 
80         return true;
81     }
82 
83     /** @brief Parse the PDRs stored in the member variable, pdrs.
84      */
85     void parseTerminusPDRs();
86 
87     /** @brief The getter to return terminus's TID */
88     pldm_tid_t getTid()
89     {
90         return tid;
91     }
92 
93     /** @brief A list of PDRs fetched from Terminus */
94     std::vector<std::vector<uint8_t>> pdrs{};
95 
96     /** @brief A flag to indicate if terminus has been initialized */
97     bool initialized = false;
98 
99     /** @brief Get Sensor Auxiliary Names by sensorID
100      *
101      *  @param[in] id - sensor ID
102      *  @return sensor auxiliary names
103      */
104     std::shared_ptr<SensorAuxiliaryNames> getSensorAuxiliaryNames(SensorId id);
105 
106   private:
107     /** @brief Parse the numeric sensor PDRs
108      *
109      *  @param[in] pdrData - the response PDRs from GetPDR command
110      *  @return pointer to numeric sensor info struct
111      */
112     std::shared_ptr<pldm_numeric_sensor_value_pdr>
113         parseNumericSensorPDR(const std::vector<uint8_t>& pdrData);
114 
115     /** @brief Parse the sensor Auxiliary name PDRs
116      *
117      *  @param[in] pdrData - the response PDRs from GetPDR command
118      *  @return pointer to sensor Auxiliary name info struct
119      */
120     std::shared_ptr<SensorAuxiliaryNames>
121         parseSensorAuxiliaryNamesPDR(const std::vector<uint8_t>& pdrData);
122 
123     /** @brief Parse the compact numeric sensor PDRs
124      *
125      *  @param[in] pdrData - the response PDRs from GetPDR command
126      *  @return pointer to compact numeric sensor info struct
127      */
128     std::shared_ptr<pldm_compact_numeric_sensor_pdr>
129         parseCompactNumericSensorPDR(const std::vector<uint8_t>& pdrData);
130 
131     /** @brief Parse the sensor Auxiliary name from compact numeric sensor PDRs
132      *
133      *  @param[in] pdrData - the response PDRs from GetPDR command
134      *  @return pointer to sensor Auxiliary name info struct
135      */
136     std::shared_ptr<SensorAuxiliaryNames>
137         parseCompactNumericSensorNames(const std::vector<uint8_t>& pdrData);
138 
139     /* @brief The terminus's TID */
140     pldm_tid_t tid;
141 
142     /* @brief The supported PLDM command types of the terminus */
143     std::bitset<64> supportedTypes;
144 
145     /** @brief Store supported PLDM commands of a terminus
146      *         Maximum number of PLDM Type is PLDM_MAX_TYPES
147      *         Maximum number of PLDM command for each type is
148      *         PLDM_MAX_CMDS_PER_TYPE.
149      *         Each uint8_t can store the supported state of 8 PLDM commands.
150      *         Size of supportedCmds will be
151      *         PLDM_MAX_TYPES * (PLDM_MAX_CMDS_PER_TYPE / 8).
152      */
153     std::vector<uint8_t> supportedCmds;
154 
155     /* @brief Sensor Auxiliary Name list */
156     std::vector<std::shared_ptr<SensorAuxiliaryNames>>
157         sensorAuxiliaryNamesTbl{};
158 };
159 } // namespace platform_mc
160 } // namespace pldm
161