14e0402cbSShawn McCarney /**
24e0402cbSShawn McCarney  * Copyright © 2021 IBM Corporation
34e0402cbSShawn McCarney  *
44e0402cbSShawn McCarney  * Licensed under the Apache License, Version 2.0 (the "License");
54e0402cbSShawn McCarney  * you may not use this file except in compliance with the License.
64e0402cbSShawn McCarney  * You may obtain a copy of the License at
74e0402cbSShawn McCarney  *
84e0402cbSShawn McCarney  *     http://www.apache.org/licenses/LICENSE-2.0
94e0402cbSShawn McCarney  *
104e0402cbSShawn McCarney  * Unless required by applicable law or agreed to in writing, software
114e0402cbSShawn McCarney  * distributed under the License is distributed on an "AS IS" BASIS,
124e0402cbSShawn McCarney  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134e0402cbSShawn McCarney  * See the License for the specific language governing permissions and
144e0402cbSShawn McCarney  * limitations under the License.
154e0402cbSShawn McCarney  */
164e0402cbSShawn McCarney 
174e0402cbSShawn McCarney #include "vpd.hpp"
184e0402cbSShawn McCarney 
194e0402cbSShawn McCarney #include "types.hpp"
204e0402cbSShawn McCarney #include "utility.hpp"
214e0402cbSShawn McCarney 
224e0402cbSShawn McCarney namespace phosphor::power::regulators
234e0402cbSShawn McCarney {
244e0402cbSShawn McCarney 
25*aacc2aafSMatt Spinler std::vector<uint8_t> DBusVPD::getValue(const std::string& inventoryPath,
264e0402cbSShawn McCarney                                        const std::string& keyword)
274e0402cbSShawn McCarney {
28*aacc2aafSMatt Spinler     std::vector<uint8_t> value{};
294e0402cbSShawn McCarney 
304e0402cbSShawn McCarney     // Get cached keywords for the inventory path
314e0402cbSShawn McCarney     KeywordMap& cachedKeywords = cache[inventoryPath];
324e0402cbSShawn McCarney 
334e0402cbSShawn McCarney     // Check if the keyword value is already cached
344e0402cbSShawn McCarney     auto it = cachedKeywords.find(keyword);
354e0402cbSShawn McCarney     if (it != cachedKeywords.end())
364e0402cbSShawn McCarney     {
374e0402cbSShawn McCarney         value = it->second;
384e0402cbSShawn McCarney     }
394e0402cbSShawn McCarney     else
404e0402cbSShawn McCarney     {
41*aacc2aafSMatt Spinler         if (keyword == "HW")
42*aacc2aafSMatt Spinler         {
43*aacc2aafSMatt Spinler             // HW is a vector<uint8_t>, the others are a string.
44*aacc2aafSMatt Spinler             util::getProperty("com.ibm.ipzvpd.VINI", "HW", inventoryPath,
454e0402cbSShawn McCarney                               INVENTORY_MGR_IFACE, bus, value);
46*aacc2aafSMatt Spinler         }
47*aacc2aafSMatt Spinler         else
48*aacc2aafSMatt Spinler         {
49*aacc2aafSMatt Spinler             // Get keyword value from D-Bus interface/property.  The property
50*aacc2aafSMatt Spinler             // name is normally the same as the VPD keyword name.  However, the
51*aacc2aafSMatt Spinler             // CCIN keyword is stored in the Model property.
52*aacc2aafSMatt Spinler             std::string property{(keyword == "CCIN") ? "Model" : keyword};
53*aacc2aafSMatt Spinler             std::string stringValue;
54*aacc2aafSMatt Spinler             util::getProperty(ASSET_IFACE, property, inventoryPath,
55*aacc2aafSMatt Spinler                               INVENTORY_MGR_IFACE, bus, stringValue);
56*aacc2aafSMatt Spinler 
57*aacc2aafSMatt Spinler             if (!stringValue.empty())
58*aacc2aafSMatt Spinler             {
59*aacc2aafSMatt Spinler                 value.insert(value.begin(), stringValue.begin(),
60*aacc2aafSMatt Spinler                              stringValue.end());
61*aacc2aafSMatt Spinler             }
62*aacc2aafSMatt Spinler         }
634e0402cbSShawn McCarney 
644e0402cbSShawn McCarney         // Cache keyword value
654e0402cbSShawn McCarney         cachedKeywords[keyword] = value;
664e0402cbSShawn McCarney     }
674e0402cbSShawn McCarney 
684e0402cbSShawn McCarney     return value;
694e0402cbSShawn McCarney }
704e0402cbSShawn McCarney 
714e0402cbSShawn McCarney } // namespace phosphor::power::regulators
72