API to update IM value on system planar
This commit implements code to update IM value on system planar
EEPROM path.
Change-Id: Ib4e8570d1ad5c86dd4573aca9882031282342a88
Signed-off-by: Rekha Aparna <vrekhaaparna@ibm.com>
diff --git a/vpd-manager/include/constants.hpp b/vpd-manager/include/constants.hpp
index e605cd1..5195c38 100644
--- a/vpd-manager/include/constants.hpp
+++ b/vpd-manager/include/constants.hpp
@@ -142,6 +142,7 @@
constexpr auto kwdFN = "FN";
constexpr auto recVSYS = "VSYS";
constexpr auto recVCEN = "VCEN";
+constexpr auto recVSBP = "VSBP";
constexpr auto locationCodeInf = "com.ibm.ipzvpd.Location";
constexpr auto xyzLocationCodeInf =
"xyz.openbmc_project.Inventory.Decorator.LocationCode";
diff --git a/vpd-manager/include/single_fab.hpp b/vpd-manager/include/single_fab.hpp
index 8587519..c618cb8 100644
--- a/vpd-manager/include/single_fab.hpp
+++ b/vpd-manager/include/single_fab.hpp
@@ -29,5 +29,14 @@
* @return IM value on success, empty string otherwise.
*/
std::string getImFromPlanar() const noexcept;
+
+ /**
+ * @brief API to update IM value on system planar EEPROM path.
+ *
+ * @param[in] i_imValue - IM value to be updated.
+ *
+ * @return true if value updated successfully, otherwise false.
+ */
+ bool setImOnPlanar(const std::string& i_imValue) const noexcept;
};
} // namespace vpd
diff --git a/vpd-manager/src/single_fab.cpp b/vpd-manager/src/single_fab.cpp
index 24556d0..c198841 100644
--- a/vpd-manager/src/single_fab.cpp
+++ b/vpd-manager/src/single_fab.cpp
@@ -3,8 +3,10 @@
#include "single_fab.hpp"
#include "constants.hpp"
+#include "parser.hpp"
#include "types.hpp"
+#include <nlohmann/json.hpp>
#include <utility/json_utility.hpp>
namespace vpd
@@ -41,12 +43,7 @@
return l_imData.str();
}
catch (const std::exception& l_ex)
- {
- logging::logMessage(
- "Error while getting IM value from PIM persisted file: " +
- std::string(pimPersistVsbpPath) +
- ", reason: " + std::string(l_ex.what()));
- }
+ {}
return std::string();
}
@@ -85,4 +82,33 @@
return std::string();
}
+
+bool SingleFab::setImOnPlanar(const std::string& i_imValue) const noexcept
+{
+ try
+ {
+ types::BinaryVector l_imValue;
+ const std::string l_systemPlanarEepromPath = SYSTEM_VPD_FILE_PATH;
+
+ // Convert string to vector of bytes
+ for (auto l_value : i_imValue | std::views::chunk(2))
+ {
+ std::string l_byteString(l_value.begin(), l_value.end());
+ l_imValue.push_back(
+ static_cast<uint8_t>(std::stoi(l_byteString, nullptr, 16)));
+ }
+
+ std::shared_ptr<Parser> l_parserObj = std::make_shared<Parser>(
+ l_systemPlanarEepromPath, nlohmann::json{});
+
+ int l_bytes_updated = l_parserObj->updateVpdKeywordOnHardware(
+ std::make_tuple(constants::recVSBP, constants::kwdIM, l_imValue));
+
+ return l_bytes_updated > 0 ? true : false;
+ }
+ catch (const std::exception& l_ex)
+ {
+ return false;
+ }
+}
} // namespace vpd