vpd-tool: Fix for Hardware write option
With this commit, vpd-tool has a fix in Hardware (-H) write
option to update only in hardware and not in cache.
This commit also has an added change. User can provide
VPD offset(--seek) value while using read from hardware and write
to hardware options. Providing offset value(--seek) is optional.
By default offset value is 0. This option is mainly usefull
when providing an EEPROM path which is not present in VPD json.
Test: Tested on everest.
CASE 1: Using Hardware write option will update only hardware and not cache.
root@ever20bmc:/tmp# ./vpd-tool -w -H -O /sys/bus/spi/drivers/at25/spi12.0/eeprom -R VINI -K CC --seek 0x30000 -V 0x32
root@ever20bmc:/tmp# ./vpd-tool -r -H -O /sys/bus/spi/drivers/at25/spi12.0/eeprom -R VINI -K CC --seek 0x30000
{
"/sys/bus/spi/drivers/at25/spi12.0/eeprom": {
"CC": "2C5F"
}
}
root@ever20bmc:/tmp# ./vpd-tool -r -O /system/chassis/motherboard/dcm0/cpu0 -R VINI -K CC
{
"/system/chassis/motherboard/dcm0/cpu1": {
"CC": "5C5F"
}
}
CASE 2: Using normal write option will update both hardware and cache
root@ever20bmc:/tmp# ./vpd-tool -w -O /system/chassis/motherboard/dcm0/cpu1 -R VINI -K CC -V 0x64
root@ever20bmc:/tmp# ./vpd-tool -r -O /system/chassis/motherboard/dcm0/cpu1 -R VINI -K CC
{
"/system/chassis/motherboard/dcm0/cpu1": {
"CC": "dC5F"
}
}
root@ever20bmc:/tmp# ./vpd-tool -r -H -O /sys/bus/spi/drivers/at25/spi22.0/eeprom -R VINI -K CC --seek 0x30000
{
"/sys/bus/spi/drivers/at25/spi22.0/eeprom": {
"CC": "dC5F"
}
}
CASE 3: Providing wrong offset value during hardware read
root@ever20bmc:/tmp# ./vpd-tool -r -H -O /sys/bus/i2c/drivers/at24/28-0051/eeprom -R VINI -K CC --seek 19
VHDR record not found
Did you provide a valid offset? By default VPD offset is taken as 0. To input offset, use --offset. Refer vpd-tool help.
CASE 4: Providing offset value during normal read operation. As mentioned, there'll be no impact as the offset value will be
valid only while using --Hardware/-H option.
root@ever20bmc:/tmp# ./vpd-tool -r -O /system/chassis/motherboard/dcm0/cpu1 -R VINI -K CC --seek 0
{
"/system/chassis/motherboard/dcm0/cpu1": {
"CC": "5C5F"
}
}
CASE 5: Providing wrong offset value during hardware write
root@ever20bmc:/tmp# ./vpd-tool -w -H -O /sys/bus/spi/drivers/at25/spi12.0/eeprom -R VINI -K CC --seek 20 -V 0x53
Could not find start tag in VPD /sys/bus/spi/drivers/at25/spi12.0/eeprom
Did you provide a valid offset? By default VPD offset is taken as 0. To input offset, use --seek. Refer vpd-tool help.
CASE 6: Providing offset value during normal write. As mentioned, there'll be no impact as the offset value will be valid
only while using --Hardware/-H option.
root@ever8bmc:/tmp# ./vpd-tool -w -O /system/chassis/motherboard/dasd_backplane/panel1 -R VMPU -K VZ -V 0x64 --seek 19
root@ever8bmc:/tmp# ./vpd-tool -r -O /system/chassis/motherboard/dasd_backplane/panel1 -R VMPU -K VZ
{
"/system/chassis/motherboard/dasd_backplane/panel1": {
"VZ": "d1"
}
}
CASE 7: Reading and Writing on a EEPROM path which is not a key in JSON.
root@ever8bmc:/tmp# ./vpd-tool -w -O /sys/bus/spi/drivers/at25/spi13.0/eeprom -R VMPU -K VZ --seek 196608 -H -V 0x64
root@ever8bmc:/tmp#
root@ever8bmc:/tmp# ./vpd-tool -r -O /sys/bus/spi/drivers/at25/spi13.0/eeprom -R VMPU -K VZ --seek 196608 -H
{
"/sys/bus/spi/drivers/at25/spi13.0/eeprom": {
"VZ": "d1"
}
}
Signed-off-by: Priyanga Ramasamy <priyanga24@in.ibm.com>
Change-Id: Icc94b5ee0d044271acf7b6263405fca07eb33728
diff --git a/vpd_tool.cpp b/vpd_tool.cpp
index 74c12ac..740d5cd 100644
--- a/vpd_tool.cpp
+++ b/vpd_tool.cpp
@@ -21,6 +21,7 @@
string recordName{};
string keyword{};
string val{};
+ uint32_t offset = 0;
auto object =
app.add_option("--object, -O", objectPath, "Enter the Object Path");
@@ -31,6 +32,11 @@
"--value, -V", val,
"Enter the value. The value to be updated should be either in ascii or "
"in hex. ascii eg: 01234; hex eg: 0x30313233");
+ app.add_option("--seek, -s", offset,
+ "User can provide VPD offset using this option. Default "
+ "offset value is 0. Using --offset is optional and is valid "
+ "only while using --Hardware/-H option.");
+
auto dumpObjFlag =
app.add_flag("--dumpObject, -o",
"Dump the given object from the inventory. { "
@@ -63,14 +69,16 @@
->needs(kw)
->needs(valOption);
- auto forceResetFlag = app.add_flag(
- "--forceReset, -f, -F", "Force Collect for Hardware. { vpd-tool-exe "
- "--forceReset/-f/-F }");
+ auto forceResetFlag =
+ app.add_flag("--forceReset, -f, -F",
+ "Force Collect for Hardware. CAUTION: Developer Only "
+ "Option. { vpd-tool-exe --forceReset/-f/-F }");
+
auto Hardware = app.add_flag(
"--Hardware, -H",
- "This is a supplementary flag to write directly to hardware. When the "
- "-H flag is given, User should provide valid hardware/eeprom path (and "
- "not dbus object path) in the -O/--object path.");
+ "This is a supplementary flag to read/write directly from/to hardware. "
+ "User should provide valid hardware/eeprom path (and not dbus object "
+ "path) in the -O/--object path. CAUTION: Developer Only Option");
CLI11_PARSE(app, argc, argv);
@@ -139,13 +147,13 @@
{
VpdTool vpdToolObj(move(objectPath), move(recordName),
move(keyword), move(val));
- rc = vpdToolObj.updateHardware();
+ rc = vpdToolObj.updateHardware(offset);
}
else if (*readFlag && *Hardware)
{
VpdTool vpdToolObj(move(objectPath), move(recordName),
move(keyword));
- vpdToolObj.readKwFromHw();
+ vpdToolObj.readKwFromHw(offset);
}
else
{
@@ -157,6 +165,13 @@
catch (const exception& e)
{
cerr << e.what();
+
+ if (*Hardware)
+ {
+ std::cerr << "\nDid you provide a valid offset? By default VPD "
+ "offset is taken as 0. To input offset, use --offset. "
+ "Refer vpd-tool help.";
+ }
rc = -1;
}