Collect Bad/Broken VPDs in BMC
When there is a vpd failure case due to the
corruption in vpd data, this commit collects the bad vpd
into BMC tmp/bad-vpd directory, so that this bad-vpd directory
gets into BMC Dump collection.
Tested on simics.
1.Corrupted the data of a vpd file.
dd if=/dev/zero of=/sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/1e78a500.i2c-bus/i2c-9/9-0050/9-00500/nvmem bs=1 seek=170 count=3
2.No bad-vpd directory before executing the commit changes.
root@rainier:/tmp# ls
dbus_properties.json systemd-private-9dfe8fba43254dfc8b7be9e4278a3ced-systemd-resolved.service-8pLWbo
ibm-read-vpd systemd-private-9dfe8fba43254dfc8b7be9e4278a3ced-systemd-timesyncd.service-7yowK9
images vpd-manager
overlays vpd-tool
systemd-private-9dfe8fba43254dfc8b7be9e4278a3ced-dbus-broker.service-hb47BQ
root@rainier:/tmp#
3. Due to the data corruption, ibm-read-vpd throws exception
root@rainier:/tmp# ./ibm-read-vpd --file /sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/1e78a500.i2c-bus/i2c-9/9-0050/9-00500/nvmem
std::exception
root@rainier:/tmp#
4. And collects the broken vpd into bad-vpd directory in /tmp
root@rainier:/tmp# ls
bad-vpd systemd-private-9dfe8fba43254dfc8b7be9e4278a3ced-dbus-broker.service-hb47BQ
dbus_properties.json systemd-private-9dfe8fba43254dfc8b7be9e4278a3ced-systemd-resolved.service-8pLWbo
ibm-read-vpd systemd-private-9dfe8fba43254dfc8b7be9e4278a3ced-systemd-timesyncd.service-7yowK9
images vpd-manager
overlays vpd-tool
root@rainier:/tmp#
5. The bad vpd file is stored in /tmp/bad-vpd directory.
root@rainier:/tmp/bad-vpd# ls -l
-rw-r--r-- 1 root root 16384 Mar 28 19:54 i2c-9-0050
-rw-r--r-- 1 root root 65504 Mar 28 20:01 spi22
(vpd-names of i2c eeproms will be in the pattern "i2c-busNumber-eepromAddress";
for spi eeproms - "spiBusNumber")
Signed-off-by: PriyangaRamasamy <priyanga24@in.ibm.com>
Change-Id: I34fb8c61c79e02ca72d7e99413baebf7e5cb3d53
diff --git a/ibm_vpd_utils.hpp b/ibm_vpd_utils.hpp
index 4649adc..8983985 100644
--- a/ibm_vpd_utils.hpp
+++ b/ibm_vpd_utils.hpp
@@ -26,7 +26,7 @@
namespace inventory
{
-/** @brief Api to obtain a dictionary of path -> services
+/** @brief API to obtain a dictionary of path -> services
* where path is in subtree and services is of the type
* returned by the GetObject method.
*
@@ -186,5 +186,28 @@
* @param[io] file - path generated from udev event.
*/
void udevToGenericPath(string& file);
+
+/**
+ * @brief API to generate a vpd name in some pattern.
+ * This vpd-name denotes name of the bad vpd file.
+ * For i2c eeproms - the pattern of the vpd-name will be
+ * i2c-<bus-number>-<eeprom-address>. For spi eeproms - the pattern of the
+ * vpd-name will be spi-<spi-number>.
+ *
+ * @param[in] file - file path of the vpd
+ * @return the vpd-name.
+ */
+string getBadVpdName(const string& file);
+
+/**
+ * @brief API which dumps the broken/bad vpd in a directory
+ * When the vpd is bad, this api places the bad vpd file inside
+ * "/tmp/bad-vpd" in BMC, in order to collect bad VPD data as a part of user
+ * initiated BMC dump.
+ *
+ * @param[in] file - bad vpd file path
+ * @param[in] vpdVector - bad vpd vector
+ */
+void dumpBadVpd(const std::string& file, const Binary& vpdVector);
} // namespace vpd
} // namespace openpower
\ No newline at end of file