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