xref: /openbmc/phosphor-modbus/rtu/device/base_config.cpp (revision e92aba4516471f5a01d4ab1f93eb9919ec05c21f)
1*e92aba45SJagpal Singh Gill #include "base_config.hpp"
2*e92aba45SJagpal Singh Gill 
3*e92aba45SJagpal Singh Gill #include "common/entity_manager_interface.hpp"
4*e92aba45SJagpal Singh Gill 
5*e92aba45SJagpal Singh Gill #include <phosphor-logging/lg2.hpp>
6*e92aba45SJagpal Singh Gill #include <xyz/openbmc_project/Inventory/Item/client.hpp>
7*e92aba45SJagpal Singh Gill #include <xyz/openbmc_project/State/Leak/Detector/aserver.hpp>
8*e92aba45SJagpal Singh Gill 
9*e92aba45SJagpal Singh Gill #include <flat_map>
10*e92aba45SJagpal Singh Gill 
11*e92aba45SJagpal Singh Gill namespace phosphor::modbus::rtu::device::config
12*e92aba45SJagpal Singh Gill {
13*e92aba45SJagpal Singh Gill 
14*e92aba45SJagpal Singh Gill PHOSPHOR_LOG2_USING;
15*e92aba45SJagpal Singh Gill 
16*e92aba45SJagpal Singh Gill using BasicVariantType =
17*e92aba45SJagpal Singh Gill     std::variant<std::vector<std::string>, std::vector<uint8_t>, std::string,
18*e92aba45SJagpal Singh Gill                  int64_t, uint64_t, double, int32_t, uint32_t, int16_t,
19*e92aba45SJagpal Singh Gill                  uint16_t, uint8_t, bool>;
20*e92aba45SJagpal Singh Gill using InventoryBaseConfigMap = std::flat_map<std::string, BasicVariantType>;
21*e92aba45SJagpal Singh Gill using InventoryData = std::flat_map<std::string, InventoryBaseConfigMap>;
22*e92aba45SJagpal Singh Gill using ManagedObjectType =
23*e92aba45SJagpal Singh Gill     std::flat_map<sdbusplus::message::object_path, InventoryData>;
24*e92aba45SJagpal Singh Gill 
25*e92aba45SJagpal Singh Gill static constexpr std::array<std::pair<std::string_view, Parity>, 3>
26*e92aba45SJagpal Singh Gill     validParities = {
27*e92aba45SJagpal Singh Gill         {{"Odd", Parity::odd}, {"Even", Parity::even}, {"None", Parity::none}}};
28*e92aba45SJagpal Singh Gill 
29*e92aba45SJagpal Singh Gill template <typename T>
getValue(const InventoryBaseConfigMap & configMap,const std::string & key,const std::string & contextName)30*e92aba45SJagpal Singh Gill auto getValue(const InventoryBaseConfigMap& configMap, const std::string& key,
31*e92aba45SJagpal Singh Gill               const std::string& contextName) -> T
32*e92aba45SJagpal Singh Gill {
33*e92aba45SJagpal Singh Gill     auto iter = configMap.find(key);
34*e92aba45SJagpal Singh Gill     if (iter == configMap.end())
35*e92aba45SJagpal Singh Gill     {
36*e92aba45SJagpal Singh Gill         throw std::runtime_error(
37*e92aba45SJagpal Singh Gill             "Missing property " + key + " for " + contextName);
38*e92aba45SJagpal Singh Gill     }
39*e92aba45SJagpal Singh Gill 
40*e92aba45SJagpal Singh Gill     try
41*e92aba45SJagpal Singh Gill     {
42*e92aba45SJagpal Singh Gill         return std::get<T>(iter->second);
43*e92aba45SJagpal Singh Gill     }
44*e92aba45SJagpal Singh Gill     catch (const std::bad_variant_access& ex)
45*e92aba45SJagpal Singh Gill     {
46*e92aba45SJagpal Singh Gill         throw std::runtime_error(
47*e92aba45SJagpal Singh Gill             "Incorrect type for property " + key + " in " + contextName);
48*e92aba45SJagpal Singh Gill     }
49*e92aba45SJagpal Singh Gill }
50*e92aba45SJagpal Singh Gill 
getDataParity(Config & config,const InventoryBaseConfigMap & configMap)51*e92aba45SJagpal Singh Gill static inline auto getDataParity(Config& config,
52*e92aba45SJagpal Singh Gill                                  const InventoryBaseConfigMap& configMap)
53*e92aba45SJagpal Singh Gill     -> void
54*e92aba45SJagpal Singh Gill {
55*e92aba45SJagpal Singh Gill     auto receivedParity =
56*e92aba45SJagpal Singh Gill         getValue<std::string>(configMap, "DataParity", config.name);
57*e92aba45SJagpal Singh Gill 
58*e92aba45SJagpal Singh Gill     for (const auto& [parityStr, parity] : validParities)
59*e92aba45SJagpal Singh Gill     {
60*e92aba45SJagpal Singh Gill         if (parityStr == receivedParity)
61*e92aba45SJagpal Singh Gill         {
62*e92aba45SJagpal Singh Gill             config.parity = parity;
63*e92aba45SJagpal Singh Gill             break;
64*e92aba45SJagpal Singh Gill         }
65*e92aba45SJagpal Singh Gill     }
66*e92aba45SJagpal Singh Gill 
67*e92aba45SJagpal Singh Gill     if (config.parity == Parity::unknown)
68*e92aba45SJagpal Singh Gill     {
69*e92aba45SJagpal Singh Gill         throw std::runtime_error(
70*e92aba45SJagpal Singh Gill             "Invalid parity " + receivedParity + " for " + config.name);
71*e92aba45SJagpal Singh Gill     }
72*e92aba45SJagpal Singh Gill }
73*e92aba45SJagpal Singh Gill 
processDeviceInterface(Config & config,const InventoryBaseConfigMap & configMap)74*e92aba45SJagpal Singh Gill static auto processDeviceInterface(Config& config,
75*e92aba45SJagpal Singh Gill                                    const InventoryBaseConfigMap& configMap)
76*e92aba45SJagpal Singh Gill     -> void
77*e92aba45SJagpal Singh Gill {
78*e92aba45SJagpal Singh Gill     debug("Processing device config");
79*e92aba45SJagpal Singh Gill 
80*e92aba45SJagpal Singh Gill     config.name = getValue<std::string>(configMap, "Name", config.name);
81*e92aba45SJagpal Singh Gill 
82*e92aba45SJagpal Singh Gill     std::replace(config.name.begin(), config.name.end(), ' ', '_');
83*e92aba45SJagpal Singh Gill 
84*e92aba45SJagpal Singh Gill     config.address = getValue<uint64_t>(configMap, "Address", config.name);
85*e92aba45SJagpal Singh Gill 
86*e92aba45SJagpal Singh Gill     getDataParity(config, configMap);
87*e92aba45SJagpal Singh Gill 
88*e92aba45SJagpal Singh Gill     config.baudRate = getValue<uint64_t>(configMap, "BaudRate", config.name);
89*e92aba45SJagpal Singh Gill 
90*e92aba45SJagpal Singh Gill     config.portName =
91*e92aba45SJagpal Singh Gill         getValue<std::string>(configMap, "SerialPort", config.name);
92*e92aba45SJagpal Singh Gill 
93*e92aba45SJagpal Singh Gill     getValue<std::string>(configMap, "Type", config.name);
94*e92aba45SJagpal Singh Gill }
95*e92aba45SJagpal Singh Gill 
96*e92aba45SJagpal Singh Gill static const auto sensorTypes = std::unordered_map<
97*e92aba45SJagpal Singh Gill     std::string_view, std::pair<std::string_view, SensorValueIntf::Unit>>{
98*e92aba45SJagpal Singh Gill     {"FanTach",
99*e92aba45SJagpal Singh Gill      {SensorValueIntf::namespace_path::fan_tach, SensorValueIntf::Unit::RPMS}},
100*e92aba45SJagpal Singh Gill     {"LiquidFlow",
101*e92aba45SJagpal Singh Gill      {SensorValueIntf::namespace_path::liquidflow, SensorValueIntf::Unit::LPM}},
102*e92aba45SJagpal Singh Gill     {"Power",
103*e92aba45SJagpal Singh Gill      {SensorValueIntf::namespace_path::power, SensorValueIntf::Unit::Watts}},
104*e92aba45SJagpal Singh Gill     {"Pressure",
105*e92aba45SJagpal Singh Gill      {SensorValueIntf::namespace_path::pressure,
106*e92aba45SJagpal Singh Gill       SensorValueIntf::Unit::Pascals}},
107*e92aba45SJagpal Singh Gill     {"Temperature",
108*e92aba45SJagpal Singh Gill      {SensorValueIntf::namespace_path::temperature,
109*e92aba45SJagpal Singh Gill       SensorValueIntf::Unit::DegreesC}},
110*e92aba45SJagpal Singh Gill };
111*e92aba45SJagpal Singh Gill 
112*e92aba45SJagpal Singh Gill static const auto formatTypes =
113*e92aba45SJagpal Singh Gill     std::unordered_map<std::string_view, SensorFormat>{
114*e92aba45SJagpal Singh Gill         {"Integer", SensorFormat::integer},
115*e92aba45SJagpal Singh Gill         {"Float", SensorFormat::floatingPoint}};
116*e92aba45SJagpal Singh Gill 
processRegisterType(SensorRegister & sensorRegister,const InventoryBaseConfigMap & configMap)117*e92aba45SJagpal Singh Gill static auto processRegisterType(SensorRegister& sensorRegister,
118*e92aba45SJagpal Singh Gill                                 const InventoryBaseConfigMap& configMap) -> void
119*e92aba45SJagpal Singh Gill {
120*e92aba45SJagpal Singh Gill     auto registerType =
121*e92aba45SJagpal Singh Gill         getValue<std::string>(configMap, "RegisterType", sensorRegister.name);
122*e92aba45SJagpal Singh Gill 
123*e92aba45SJagpal Singh Gill     auto type = sensorTypes.find(registerType);
124*e92aba45SJagpal Singh Gill     if (type == sensorTypes.end())
125*e92aba45SJagpal Singh Gill     {
126*e92aba45SJagpal Singh Gill         throw std::runtime_error("Invalid RegisterType " + registerType +
127*e92aba45SJagpal Singh Gill                                  " for " + sensorRegister.name);
128*e92aba45SJagpal Singh Gill     }
129*e92aba45SJagpal Singh Gill     sensorRegister.pathSuffix = type->second.first;
130*e92aba45SJagpal Singh Gill     sensorRegister.unit = type->second.second;
131*e92aba45SJagpal Singh Gill }
132*e92aba45SJagpal Singh Gill 
processRegisterFormat(SensorRegister & sensorRegister,const InventoryBaseConfigMap & configMap)133*e92aba45SJagpal Singh Gill static auto processRegisterFormat(SensorRegister& sensorRegister,
134*e92aba45SJagpal Singh Gill                                   const InventoryBaseConfigMap& configMap)
135*e92aba45SJagpal Singh Gill     -> void
136*e92aba45SJagpal Singh Gill {
137*e92aba45SJagpal Singh Gill     auto format =
138*e92aba45SJagpal Singh Gill         getValue<std::string>(configMap, "Format", sensorRegister.name);
139*e92aba45SJagpal Singh Gill 
140*e92aba45SJagpal Singh Gill     auto formatIter = formatTypes.find(format);
141*e92aba45SJagpal Singh Gill     if (formatIter == formatTypes.end())
142*e92aba45SJagpal Singh Gill     {
143*e92aba45SJagpal Singh Gill         throw std::runtime_error(
144*e92aba45SJagpal Singh Gill             "Invalid Format " + format + " for " + sensorRegister.name);
145*e92aba45SJagpal Singh Gill     }
146*e92aba45SJagpal Singh Gill     sensorRegister.format = formatIter->second;
147*e92aba45SJagpal Singh Gill }
148*e92aba45SJagpal Singh Gill 
processSensorRegistersInterface(Config & config,const InventoryBaseConfigMap & configMap)149*e92aba45SJagpal Singh Gill static auto processSensorRegistersInterface(
150*e92aba45SJagpal Singh Gill     Config& config, const InventoryBaseConfigMap& configMap) -> void
151*e92aba45SJagpal Singh Gill {
152*e92aba45SJagpal Singh Gill     SensorRegister sensorRegister = {};
153*e92aba45SJagpal Singh Gill 
154*e92aba45SJagpal Singh Gill     sensorRegister.name = getValue<std::string>(configMap, "Name", config.name);
155*e92aba45SJagpal Singh Gill 
156*e92aba45SJagpal Singh Gill     processRegisterType(sensorRegister, configMap);
157*e92aba45SJagpal Singh Gill 
158*e92aba45SJagpal Singh Gill     sensorRegister.offset =
159*e92aba45SJagpal Singh Gill         getValue<uint64_t>(configMap, "Address", config.name);
160*e92aba45SJagpal Singh Gill 
161*e92aba45SJagpal Singh Gill     sensorRegister.size = getValue<uint64_t>(configMap, "Size", config.name);
162*e92aba45SJagpal Singh Gill 
163*e92aba45SJagpal Singh Gill     sensorRegister.precision =
164*e92aba45SJagpal Singh Gill         getValue<uint64_t>(configMap, "Precision", config.name);
165*e92aba45SJagpal Singh Gill 
166*e92aba45SJagpal Singh Gill     sensorRegister.shift = getValue<double>(configMap, "Shift", config.name);
167*e92aba45SJagpal Singh Gill 
168*e92aba45SJagpal Singh Gill     sensorRegister.scale = getValue<double>(configMap, "Scale", config.name);
169*e92aba45SJagpal Singh Gill 
170*e92aba45SJagpal Singh Gill     sensorRegister.isSigned = getValue<bool>(configMap, "Signed", config.name);
171*e92aba45SJagpal Singh Gill 
172*e92aba45SJagpal Singh Gill     processRegisterFormat(sensorRegister, configMap);
173*e92aba45SJagpal Singh Gill 
174*e92aba45SJagpal Singh Gill     config.sensorRegisters.emplace_back(sensorRegister);
175*e92aba45SJagpal Singh Gill }
176*e92aba45SJagpal Singh Gill 
177*e92aba45SJagpal Singh Gill static const auto statusBitTypes =
178*e92aba45SJagpal Singh Gill     std::unordered_map<std::string_view, StatusType>{
179*e92aba45SJagpal Singh Gill         {"ControllerFailure", StatusType::controllerFailure},
180*e92aba45SJagpal Singh Gill         {"FanFailure", StatusType::fanFailure},
181*e92aba45SJagpal Singh Gill         {"FilterFailure", StatusType::filterFailure},
182*e92aba45SJagpal Singh Gill         {"PowerFault", StatusType::powerFault},
183*e92aba45SJagpal Singh Gill         {"PumpFailure", StatusType::pumpFailure},
184*e92aba45SJagpal Singh Gill         {"LeakDetectedCritical", StatusType::leakDetectedCritical},
185*e92aba45SJagpal Singh Gill         {"LeakDetectedWarning", StatusType::leakDetectedWarning},
186*e92aba45SJagpal Singh Gill         {"SensorFailure", StatusType::sensorFailure},
187*e92aba45SJagpal Singh Gill         {"SensorReadingCritical", StatusType::sensorReadingCritical},
188*e92aba45SJagpal Singh Gill         {"SensorReadingWarning", StatusType::sensorReadingWarning}};
189*e92aba45SJagpal Singh Gill 
processStatusBitsInterface(Config & config,const InventoryBaseConfigMap & configMap)190*e92aba45SJagpal Singh Gill static auto processStatusBitsInterface(Config& config,
191*e92aba45SJagpal Singh Gill                                        const InventoryBaseConfigMap& configMap)
192*e92aba45SJagpal Singh Gill     -> void
193*e92aba45SJagpal Singh Gill {
194*e92aba45SJagpal Singh Gill     debug("Processing StatusBits for {NAME}", "NAME", config.name);
195*e92aba45SJagpal Singh Gill 
196*e92aba45SJagpal Singh Gill     StatusBit statusBit = {};
197*e92aba45SJagpal Singh Gill 
198*e92aba45SJagpal Singh Gill     statusBit.name = getValue<std::string>(configMap, "Name", config.name);
199*e92aba45SJagpal Singh Gill 
200*e92aba45SJagpal Singh Gill     auto type = getValue<std::string>(configMap, "StatusType", config.name);
201*e92aba45SJagpal Singh Gill     auto typeIter = statusBitTypes.find(type);
202*e92aba45SJagpal Singh Gill     if (typeIter == statusBitTypes.end())
203*e92aba45SJagpal Singh Gill     {
204*e92aba45SJagpal Singh Gill         throw std::runtime_error(
205*e92aba45SJagpal Singh Gill             "Invalid StatusType " + type + " for " + statusBit.name);
206*e92aba45SJagpal Singh Gill     }
207*e92aba45SJagpal Singh Gill     statusBit.type = typeIter->second;
208*e92aba45SJagpal Singh Gill 
209*e92aba45SJagpal Singh Gill     statusBit.bitPosition =
210*e92aba45SJagpal Singh Gill         getValue<uint64_t>(configMap, "BitPosition", config.name);
211*e92aba45SJagpal Singh Gill 
212*e92aba45SJagpal Singh Gill     statusBit.value = getValue<bool>(configMap, "Value", config.name);
213*e92aba45SJagpal Singh Gill 
214*e92aba45SJagpal Singh Gill     auto address = getValue<uint64_t>(configMap, "Address", config.name);
215*e92aba45SJagpal Singh Gill 
216*e92aba45SJagpal Singh Gill     config.statusRegisters[address].emplace_back(statusBit);
217*e92aba45SJagpal Singh Gill }
218*e92aba45SJagpal Singh Gill 
219*e92aba45SJagpal Singh Gill static const auto firmwareRegisterTypes =
220*e92aba45SJagpal Singh Gill     std::unordered_map<std::string_view, FirmwareRegisterType>{
221*e92aba45SJagpal Singh Gill         {"Version", FirmwareRegisterType::version},
222*e92aba45SJagpal Singh Gill         {"Update", FirmwareRegisterType::update}};
223*e92aba45SJagpal Singh Gill 
processFirmwareRegistersInterface(Config & config,const InventoryBaseConfigMap & configMap)224*e92aba45SJagpal Singh Gill static auto processFirmwareRegistersInterface(
225*e92aba45SJagpal Singh Gill     Config& config, const InventoryBaseConfigMap& configMap) -> void
226*e92aba45SJagpal Singh Gill {
227*e92aba45SJagpal Singh Gill     debug("Processing FirmwareRegisters for {NAME}", "NAME", config.name);
228*e92aba45SJagpal Singh Gill 
229*e92aba45SJagpal Singh Gill     FirmwareRegister firmwareRegister = {};
230*e92aba45SJagpal Singh Gill 
231*e92aba45SJagpal Singh Gill     firmwareRegister.name =
232*e92aba45SJagpal Singh Gill         getValue<std::string>(configMap, "Name", config.name);
233*e92aba45SJagpal Singh Gill 
234*e92aba45SJagpal Singh Gill     firmwareRegister.offset =
235*e92aba45SJagpal Singh Gill         getValue<uint64_t>(configMap, "Address", firmwareRegister.name);
236*e92aba45SJagpal Singh Gill 
237*e92aba45SJagpal Singh Gill     firmwareRegister.size =
238*e92aba45SJagpal Singh Gill         getValue<uint64_t>(configMap, "Size", firmwareRegister.name);
239*e92aba45SJagpal Singh Gill 
240*e92aba45SJagpal Singh Gill     auto registerType =
241*e92aba45SJagpal Singh Gill         getValue<std::string>(configMap, "RegisterType", firmwareRegister.name);
242*e92aba45SJagpal Singh Gill     auto registerTypeIter = firmwareRegisterTypes.find(registerType);
243*e92aba45SJagpal Singh Gill     if (registerTypeIter == firmwareRegisterTypes.end())
244*e92aba45SJagpal Singh Gill     {
245*e92aba45SJagpal Singh Gill         throw std::runtime_error("Invalid RegisterType " + registerType +
246*e92aba45SJagpal Singh Gill                                  " for " + firmwareRegister.name);
247*e92aba45SJagpal Singh Gill     }
248*e92aba45SJagpal Singh Gill     firmwareRegister.type = registerTypeIter->second;
249*e92aba45SJagpal Singh Gill 
250*e92aba45SJagpal Singh Gill     config.firmwareRegisters.emplace_back(firmwareRegister);
251*e92aba45SJagpal Singh Gill }
252*e92aba45SJagpal Singh Gill 
printConfig(const Config & config)253*e92aba45SJagpal Singh Gill static auto printConfig(const Config& config) -> void
254*e92aba45SJagpal Singh Gill {
255*e92aba45SJagpal Singh Gill     info("Device Config for {NAME}: {ADDRESS} {PORT} {INV_PATH}", "NAME",
256*e92aba45SJagpal Singh Gill          config.name, "ADDRESS", config.address, "PORT", config.portName,
257*e92aba45SJagpal Singh Gill          "INV_PATH", config.inventoryPath);
258*e92aba45SJagpal Singh Gill 
259*e92aba45SJagpal Singh Gill     for (const auto& sensorRegister : config.sensorRegisters)
260*e92aba45SJagpal Singh Gill     {
261*e92aba45SJagpal Singh Gill         info(
262*e92aba45SJagpal Singh Gill             "Sensor Register {NAME} {ADDRESS} {SIZE} {PRECISION} {SCALE} {SIGNED} {FORMAT} {UNIT} {PATH_SUFFIX}",
263*e92aba45SJagpal Singh Gill             "NAME", sensorRegister.name, "ADDRESS", sensorRegister.offset,
264*e92aba45SJagpal Singh Gill             "SIZE", sensorRegister.size, "PRECISION", sensorRegister.precision,
265*e92aba45SJagpal Singh Gill             "SCALE", sensorRegister.scale, "SIGNED", sensorRegister.isSigned,
266*e92aba45SJagpal Singh Gill             "FORMAT", sensorRegister.format, "UNIT", sensorRegister.unit,
267*e92aba45SJagpal Singh Gill             "PATH_SUFFIX", sensorRegister.pathSuffix);
268*e92aba45SJagpal Singh Gill     }
269*e92aba45SJagpal Singh Gill 
270*e92aba45SJagpal Singh Gill     for (const auto& [address, statusBits] : config.statusRegisters)
271*e92aba45SJagpal Singh Gill     {
272*e92aba45SJagpal Singh Gill         for (const auto& statusBit : statusBits)
273*e92aba45SJagpal Singh Gill         {
274*e92aba45SJagpal Singh Gill             info("Status Bit {NAME} {ADDRESS} {BIT_POSITION} {VALUE} {TYPE}",
275*e92aba45SJagpal Singh Gill                  "NAME", statusBit.name, "ADDRESS", address, "BIT_POSITION",
276*e92aba45SJagpal Singh Gill                  statusBit.bitPosition, "VALUE", statusBit.value, "TYPE",
277*e92aba45SJagpal Singh Gill                  statusBit.type);
278*e92aba45SJagpal Singh Gill         }
279*e92aba45SJagpal Singh Gill     }
280*e92aba45SJagpal Singh Gill 
281*e92aba45SJagpal Singh Gill     for (const auto& firmwareRegister : config.firmwareRegisters)
282*e92aba45SJagpal Singh Gill     {
283*e92aba45SJagpal Singh Gill         info("Firmware Register {NAME} {ADDRESS} {SIZE} {TYPE}", "NAME",
284*e92aba45SJagpal Singh Gill              firmwareRegister.name, "ADDRESS", firmwareRegister.offset, "SIZE",
285*e92aba45SJagpal Singh Gill              firmwareRegister.size, "TYPE", firmwareRegister.type);
286*e92aba45SJagpal Singh Gill     }
287*e92aba45SJagpal Singh Gill }
288*e92aba45SJagpal Singh Gill 
getConfigSubTree(Config & config,const std::string & interfaceName,const InventoryData & deviceConfig)289*e92aba45SJagpal Singh Gill static auto getConfigSubTree(Config& config, const std::string& interfaceName,
290*e92aba45SJagpal Singh Gill                              const InventoryData& deviceConfig) -> void
291*e92aba45SJagpal Singh Gill {
292*e92aba45SJagpal Singh Gill     std::string firmwareRegistersInterface =
293*e92aba45SJagpal Singh Gill         interfaceName + ".FirmwareRegisters";
294*e92aba45SJagpal Singh Gill     std::string sensorRegistersInterface = interfaceName + ".SensorRegisters";
295*e92aba45SJagpal Singh Gill     std::string statusBitsInterface = interfaceName + ".StatusBits";
296*e92aba45SJagpal Singh Gill 
297*e92aba45SJagpal Singh Gill     for (const auto& [curInterface, interfaceConfig] : deviceConfig)
298*e92aba45SJagpal Singh Gill     {
299*e92aba45SJagpal Singh Gill         if (curInterface == interfaceName)
300*e92aba45SJagpal Singh Gill         {
301*e92aba45SJagpal Singh Gill             processDeviceInterface(config, interfaceConfig);
302*e92aba45SJagpal Singh Gill         }
303*e92aba45SJagpal Singh Gill         else if (curInterface.starts_with(sensorRegistersInterface))
304*e92aba45SJagpal Singh Gill         {
305*e92aba45SJagpal Singh Gill             processSensorRegistersInterface(config, interfaceConfig);
306*e92aba45SJagpal Singh Gill         }
307*e92aba45SJagpal Singh Gill         else if (curInterface.starts_with(statusBitsInterface))
308*e92aba45SJagpal Singh Gill         {
309*e92aba45SJagpal Singh Gill             processStatusBitsInterface(config, interfaceConfig);
310*e92aba45SJagpal Singh Gill         }
311*e92aba45SJagpal Singh Gill         else if (curInterface.starts_with(firmwareRegistersInterface))
312*e92aba45SJagpal Singh Gill         {
313*e92aba45SJagpal Singh Gill             processFirmwareRegistersInterface(config, interfaceConfig);
314*e92aba45SJagpal Singh Gill         }
315*e92aba45SJagpal Singh Gill     }
316*e92aba45SJagpal Singh Gill }
317*e92aba45SJagpal Singh Gill 
updateBaseConfig(sdbusplus::async::context & ctx,const sdbusplus::message::object_path & objectPath,const std::string & interfaceName,Config & config)318*e92aba45SJagpal Singh Gill auto updateBaseConfig(sdbusplus::async::context& ctx,
319*e92aba45SJagpal Singh Gill                       const sdbusplus::message::object_path& objectPath,
320*e92aba45SJagpal Singh Gill                       const std::string& interfaceName, Config& config)
321*e92aba45SJagpal Singh Gill     -> sdbusplus::async::task<bool>
322*e92aba45SJagpal Singh Gill {
323*e92aba45SJagpal Singh Gill     config.inventoryPath = objectPath.parent_path();
324*e92aba45SJagpal Singh Gill 
325*e92aba45SJagpal Singh Gill     using InventoryIntf =
326*e92aba45SJagpal Singh Gill         sdbusplus::client::xyz::openbmc_project::inventory::Item<>;
327*e92aba45SJagpal Singh Gill 
328*e92aba45SJagpal Singh Gill     constexpr auto entityManager =
329*e92aba45SJagpal Singh Gill         sdbusplus::async::proxy()
330*e92aba45SJagpal Singh Gill             .service(entity_manager::EntityManagerInterface::serviceName)
331*e92aba45SJagpal Singh Gill             .path(InventoryIntf::namespace_path)
332*e92aba45SJagpal Singh Gill             .interface("org.freedesktop.DBus.ObjectManager");
333*e92aba45SJagpal Singh Gill 
334*e92aba45SJagpal Singh Gill     for (const auto& [path, deviceConfig] :
335*e92aba45SJagpal Singh Gill          co_await entityManager.call<ManagedObjectType>(ctx,
336*e92aba45SJagpal Singh Gill                                                         "GetManagedObjects"))
337*e92aba45SJagpal Singh Gill     {
338*e92aba45SJagpal Singh Gill         if (path.str != objectPath.str)
339*e92aba45SJagpal Singh Gill         {
340*e92aba45SJagpal Singh Gill             debug("Skipping device {PATH}", "PATH", path.str);
341*e92aba45SJagpal Singh Gill             continue;
342*e92aba45SJagpal Singh Gill         }
343*e92aba45SJagpal Singh Gill         debug("Processing device {PATH}", "PATH", path.str);
344*e92aba45SJagpal Singh Gill 
345*e92aba45SJagpal Singh Gill         try
346*e92aba45SJagpal Singh Gill         {
347*e92aba45SJagpal Singh Gill             getConfigSubTree(config, interfaceName, deviceConfig);
348*e92aba45SJagpal Singh Gill         }
349*e92aba45SJagpal Singh Gill         catch (std::exception& e)
350*e92aba45SJagpal Singh Gill         {
351*e92aba45SJagpal Singh Gill             error("Failed to process device {PATH} with {ERROR}", "PATH",
352*e92aba45SJagpal Singh Gill                   path.str, "ERROR", e);
353*e92aba45SJagpal Singh Gill             co_return false;
354*e92aba45SJagpal Singh Gill         }
355*e92aba45SJagpal Singh Gill     }
356*e92aba45SJagpal Singh Gill 
357*e92aba45SJagpal Singh Gill     printConfig(config);
358*e92aba45SJagpal Singh Gill 
359*e92aba45SJagpal Singh Gill     co_return true;
360*e92aba45SJagpal Singh Gill }
361*e92aba45SJagpal Singh Gill 
362*e92aba45SJagpal Singh Gill } // namespace phosphor::modbus::rtu::device::config
363