blob: d097b2621cb3d592e74469d051c2fb781aedc306 [file] [log] [blame]
George Liu6492f522020-06-16 10:34:05 +08001#include "libpldm/platform.h"
2
George Liue53193f2020-02-24 09:23:26 +08003#include "pdr.hpp"
4
Tom Josephb4268602020-04-17 17:20:45 +05305#include <climits>
6
Brad Bishop5079ac42021-08-19 18:35:06 -04007using namespace pldm::pdr;
8
George Liue53193f2020-02-24 09:23:26 +08009namespace pldm
10{
11
12namespace responder
13{
14
15namespace pdr_utils
16{
17
Deepak Kodihallic682fe22020-03-04 00:42:54 -060018pldm_pdr* Repo::getPdr() const
George Liue53193f2020-02-24 09:23:26 +080019{
20 return repo;
21}
22
23RecordHandle Repo::addRecord(const PdrEntry& pdrEntry)
24{
25 return pldm_pdr_add(repo, pdrEntry.data, pdrEntry.size,
Deepak Kodihalli87514cc2020-04-16 09:08:38 -050026 pdrEntry.handle.recordHandle, false);
George Liue53193f2020-02-24 09:23:26 +080027}
28
29const pldm_pdr_record* Repo::getFirstRecord(PdrEntry& pdrEntry)
30{
31 constexpr uint32_t firstNum = 0;
32 uint8_t* pdrData = nullptr;
33 auto record =
34 pldm_pdr_find_record(getPdr(), firstNum, &pdrData, &pdrEntry.size,
35 &pdrEntry.handle.nextRecordHandle);
36 if (record)
37 {
38 pdrEntry.data = pdrData;
39 }
40
41 return record;
42}
43
44const pldm_pdr_record* Repo::getNextRecord(const pldm_pdr_record* currRecord,
45 PdrEntry& pdrEntry)
46{
47 uint8_t* pdrData = nullptr;
48 auto record =
49 pldm_pdr_get_next_record(getPdr(), currRecord, &pdrData, &pdrEntry.size,
50 &pdrEntry.handle.nextRecordHandle);
51 if (record)
52 {
53 pdrEntry.data = pdrData;
54 }
55
56 return record;
57}
58
Deepak Kodihallic682fe22020-03-04 00:42:54 -060059uint32_t Repo::getRecordHandle(const pldm_pdr_record* record) const
George Liue53193f2020-02-24 09:23:26 +080060{
61 return pldm_pdr_get_record_handle(getPdr(), record);
62}
63
64uint32_t Repo::getRecordCount()
65{
66 return pldm_pdr_get_record_count(getPdr());
67}
68
69bool Repo::empty()
70{
71 return !getRecordCount();
72}
73
George Liu1ec85d42020-02-12 16:05:32 +080074StatestoDbusVal populateMapping(const std::string& type, const Json& dBusValues,
75 const PossibleValues& pv)
76{
77 size_t pos = 0;
78 pldm::utils::PropertyValue value;
79 StatestoDbusVal valueMap;
80 if (dBusValues.size() != pv.size())
81 {
82 std::cerr
83 << "dBusValues size is not equal to pv size, dBusValues Size: "
84 << dBusValues.size() << ", pv Size: " << pv.size() << "\n";
85
86 return {};
87 }
88
89 for (auto it = dBusValues.begin(); it != dBusValues.end(); ++it, ++pos)
90 {
91 if (type == "uint8_t")
92 {
93 value = static_cast<uint8_t>(it.value());
94 }
95 else if (type == "uint16_t")
96 {
97 value = static_cast<uint16_t>(it.value());
98 }
99 else if (type == "uint32_t")
100 {
101 value = static_cast<uint32_t>(it.value());
102 }
103 else if (type == "uint64_t")
104 {
105 value = static_cast<uint64_t>(it.value());
106 }
107 else if (type == "int16_t")
108 {
109 value = static_cast<int16_t>(it.value());
110 }
111 else if (type == "int32_t")
112 {
113 value = static_cast<int32_t>(it.value());
114 }
115 else if (type == "int64_t")
116 {
117 value = static_cast<int64_t>(it.value());
118 }
119 else if (type == "bool")
120 {
121 value = static_cast<bool>(it.value());
122 }
123 else if (type == "double")
124 {
125 value = static_cast<double>(it.value());
126 }
127 else if (type == "string")
128 {
129 value = static_cast<std::string>(it.value());
130 }
131 else
132 {
133 std::cerr << "Unknown D-Bus property type, TYPE=" << type.c_str()
134 << "\n";
135 return {};
136 }
137
138 valueMap.emplace(pv[pos], value);
139 }
140
141 return valueMap;
142}
143
Tom Josephb4268602020-04-17 17:20:45 +0530144std::tuple<TerminusHandle, SensorID, SensorInfo>
145 parseStateSensorPDR(const std::vector<uint8_t>& stateSensorPdr)
146{
147 auto pdr =
148 reinterpret_cast<const pldm_state_sensor_pdr*>(stateSensorPdr.data());
149 CompositeSensorStates sensors{};
150 auto statesPtr = pdr->possible_states;
151 auto compositeSensorCount = pdr->composite_sensor_count;
152
153 while (compositeSensorCount--)
154 {
155 auto state =
156 reinterpret_cast<const state_sensor_possible_states*>(statesPtr);
157 PossibleStates possibleStates{};
158 uint8_t possibleStatesPos{};
159 auto updateStates = [&possibleStates,
160 &possibleStatesPos](const bitfield8_t& val) {
161 for (int i = 0; i < CHAR_BIT; i++)
162 {
163 if (val.byte & (1 << i))
164 {
165 possibleStates.insert(possibleStatesPos * CHAR_BIT + i);
166 }
167 }
168 possibleStatesPos++;
169 };
170 std::for_each(&state->states[0],
171 &state->states[state->possible_states_size],
172 updateStates);
173
174 sensors.emplace_back(std::move(possibleStates));
175 if (compositeSensorCount)
176 {
177 statesPtr += sizeof(state_sensor_possible_states) +
178 state->possible_states_size - 1;
179 }
180 }
181
182 auto entityInfo =
183 std::make_tuple(static_cast<ContainerID>(pdr->container_id),
184 static_cast<EntityType>(pdr->entity_type),
185 static_cast<EntityInstance>(pdr->entity_instance));
186 auto sensorInfo =
187 std::make_tuple(std::move(entityInfo), std::move(sensors));
188 return std::make_tuple(pdr->terminus_handle, pdr->sensor_id,
189 std::move(sensorInfo));
190}
191
George Liue53193f2020-02-24 09:23:26 +0800192} // namespace pdr_utils
193} // namespace responder
194} // namespace pldm