fru-device: fixup fru edit commit
Adds a number of fixups to review comments and simplifications
to the flow of the previous fru-edit commit.
Tested: Edited FRU property on nvl32-obmc
```
root@nvl32-obmc:/sys/bus/i2c/devices/4-0051# busctl introspect xyz.openbmc_project.FruDevice /xyz/openbmc_project/FruDevice/MSX4_MG1_000
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
org.freedesktop.DBus.Introspectable interface - - -
.Introspect method - s -
org.freedesktop.DBus.Peer interface - - -
.GetMachineId method - s -
.Ping method - - -
org.freedesktop.DBus.Properties interface - - -
.Get method ss v -
.GetAll method s a{sv} -
.Set method ssv - -
.PropertiesChanged signal sa{sv}as - -
xyz.openbmc_project.FruDevice interface - - -
.UpdateFruField method ss b -
.ADDRESS property u 81 emits-change
.BOARD_INFO_AM1 property s "NULL" emits-change writable
.BOARD_LANGUAGE_CODE property s "0" emits-change
.BOARD_MANUFACTURER property s "Giga Computing" emits-change writable
.BOARD_MANUFACTURE_DATE property s "20250101T000800Z" emits-change
.BOARD_PART_NUMBER property s "123456789AB" emits-change writable
.BOARD_PRODUCT_NAME property s "MSX4-MG1-000" emits-change writable
.BOARD_SERIAL_NUMBER property s "S2510200007" emits-change writable
.BUS property u 4 emits-change
.CHASSIS_PART_NUMBER property s "01234567" emits-change writable
.CHASSIS_SERIAL_NUMBER property s "01234567890123456789AB" emits-change writable
.CHASSIS_TYPE property s "23" emits-change
.Common_Format_Version property s "1" emits-change
.PRODUCT_ASSET_TAG property s "01234567890" emits-change writable
.PRODUCT_LANGUAGE_CODE property s "0" emits-change
.PRODUCT_MANUFACTURER property s "Giga Computing" emits-change writable
.PRODUCT_PART_NUMBER property s "000000000001" emits-change writable
.PRODUCT_PRODUCT_NAME property s "XL44-SX2-AAS1-000" emits-change writable
.PRODUCT_SERIAL_NUMBER property s "01234567890123" emits-change writable
.PRODUCT_VERSION property s "0100" emits-change writable
root@nvl32-obmc:/sys/bus/i2c/devices/4-0051# busctl call xyz.openbmc_project.FruDevice /xyz/openbmc_project/FruDevice/MSX4_MG1_000 xyz.openbmc_project.FruDevice UpdateFruField ss "PRODUCT_ASSET_TAG" "12345678901234"
b true
root@nvl32-obmc:/sys/bus/i2c/devices/4-0051# busctl introspect xyz.openbmc_project.FruDevice /xyz/openbmc_project/FruDevice/MSX4_MG1_000
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
org.freedesktop.DBus.Introspectable interface - - -
.Introspect method - s -
org.freedesktop.DBus.Peer interface - - -
.GetMachineId method - s -
.Ping method - - -
org.freedesktop.DBus.Properties interface - - -
.Get method ss v -
.GetAll method s a{sv} -
.Set method ssv - -
.PropertiesChanged signal sa{sv}as - -
xyz.openbmc_project.FruDevice interface - - -
.UpdateFruField method ss b -
.ADDRESS property u 81 emits-change
.BOARD_INFO_AM1 property s "NULL" emits-change writable
.BOARD_LANGUAGE_CODE property s "0" emits-change
.BOARD_MANUFACTURER property s "Giga Computing" emits-change writable
.BOARD_MANUFACTURE_DATE property s "20250101T000800Z" emits-change
.BOARD_PART_NUMBER property s "123456789AB" emits-change writable
.BOARD_PRODUCT_NAME property s "MSX4-MG1-000" emits-change writable
.BOARD_SERIAL_NUMBER property s "S2510200007" emits-change writable
.BUS property u 4 emits-change
.CHASSIS_PART_NUMBER property s "01234567" emits-change writable
.CHASSIS_SERIAL_NUMBER property s "01234567890123456789AB" emits-change writable
.CHASSIS_TYPE property s "23" emits-change
.Common_Format_Version property s "1" emits-change
.PRODUCT_ASSET_TAG property s "12345678901234" emits-change writable
.PRODUCT_LANGUAGE_CODE property s "0" emits-change
.PRODUCT_MANUFACTURER property s "Giga Computing" emits-change writable
.PRODUCT_PART_NUMBER property s "000000000001" emits-change writable
.PRODUCT_PRODUCT_NAME property s "XL44-SX2-AAS1-000" emits-change writable
.PRODUCT_SERIAL_NUMBER property s "01234567890123" emits-change writable
.PRODUCT_VERSION property s "0100" emits-change writable
```
Change-Id: Ic4cd7111cd4f3694faed79793e1abc98f254617b
Signed-off-by: Marc Olberding <molberding@nvidia.com>
diff --git a/src/fru_device/fru_device.cpp b/src/fru_device/fru_device.cpp
index cbd2af0..2678f90 100644
--- a/src/fru_device/fru_device.cpp
+++ b/src/fru_device/fru_device.cpp
@@ -1214,10 +1214,10 @@
// Validate field length: must be 2–63 characters
const size_t len = propertyValue.length();
- if (len <= 1 || len > 63)
+ if (len == 1 || len > 63)
{
- lg2::debug(
- "FRU field data must be between 2 and 63 characters. Invalid Length: {LEN}",
+ lg2::error(
+ "FRU field data must be 0 or between 2 and 63 characters. Invalid Length: {LEN}",
"LEN", len);
return false;
}
@@ -1225,29 +1225,37 @@
std::vector<uint8_t> fruData;
if (!getFruData(fruData, bus, address))
{
- std::cerr << "Failure getting FRU Data from bus " << bus << ", address "
- << address << "\n";
+ lg2::error("Failure getting FRU Data from bus {BUS}, address {ADDRESS}",
+ "BUS", bus, "ADDRESS", address);
return false;
}
if (fruData.empty())
{
- std::cerr << "Empty FRU data\n";
+ lg2::error("Empty FRU data\n");
return false;
}
// Extract area name (prefix before underscore)
- fruAreas fruAreaToUpdate{};
std::string areaName = propertyName.substr(0, propertyName.find('_'));
- if (!getAreaIdx(areaName, fruAreaToUpdate))
+ auto areaIterator =
+ std::find(fruAreaNames.begin(), fruAreaNames.end(), areaName);
+ if (areaIterator == fruAreaNames.end())
{
- lg2::debug("Failed to get FRU area for property: {AREA}", "AREA",
+ lg2::error("Failed to get FRU area for property: {AREA}", "AREA",
areaName);
return false;
}
+ fruAreas fruAreaToUpdate = static_cast<fruAreas>(
+ std::distance(fruAreaNames.begin(), areaIterator));
+
std::vector<std::vector<uint8_t>> areasData;
- disassembleFruData(fruData, areasData);
+ if (!disassembleFruData(fruData, areasData))
+ {
+ lg2::error("Failed to disassemble Fru Data");
+ return false;
+ }
std::vector<uint8_t>& areaData =
areasData[static_cast<size_t>(fruAreaToUpdate)];
@@ -1255,7 +1263,7 @@
{
// If ENABLE_FRU_AREA_RESIZE is not defined then return with failure
#ifndef ENABLE_FRU_AREA_RESIZE
- lg2::debug(
+ lg2::error(
"FRU area {AREA} not present and ENABLE_FRU_AREA_RESIZE is not set. "
"Returning failure.",
"AREA", areaName);
@@ -1263,7 +1271,7 @@
#endif
if (!createDummyArea(fruAreaToUpdate, areaData))
{
- lg2::debug("Failed to create dummy area for {AREA}", "AREA",
+ lg2::error("Failed to create dummy area for {AREA}", "AREA",
areaName);
return false;
}
@@ -1271,22 +1279,27 @@
if (!setField(fruAreaToUpdate, areaData, propertyName, propertyValue))
{
- lg2::debug("Failed to set field value for property: {PROPERTY}",
+ lg2::error("Failed to set field value for property: {PROPERTY}",
"PROPERTY", propertyName);
return false;
}
- assembleFruData(fruData, areasData);
+ if (!assembleFruData(fruData, areasData))
+ {
+ lg2::error("Failed to reassemble FRU data");
+ return false;
+ }
if (fruData.empty())
{
- std::cerr << "FRU data is empty after assembly\n";
+ lg2::error("FRU data is empty after assembly");
return false;
}
if (!writeFRU(static_cast<uint8_t>(bus), static_cast<uint8_t>(address),
fruData))
{
+ lg2::error("Failed to write the FRU");
return false;
}