summaryrefslogtreecommitdiffstats
path: root/src/usr/vpd/vpd.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/vpd/vpd.C')
-rwxr-xr-xsrc/usr/vpd/vpd.C62
1 files changed, 61 insertions, 1 deletions
diff --git a/src/usr/vpd/vpd.C b/src/usr/vpd/vpd.C
index e50b673f5..585c168fa 100755
--- a/src/usr/vpd/vpd.C
+++ b/src/usr/vpd/vpd.C
@@ -40,6 +40,10 @@
#include "ipvpd.H"
#include "dvpd.H"
#include <map>
+#include <console/consoleif.H>
+#include <initservice/istepdispatcherif.H>
+#include <ipmi/ipmifruinv.H>
+
// ----------------------------------------------
// Trace - defined in vpd_common
@@ -465,7 +469,63 @@ void setPartAndSerialNumberAttributes( TARGETING::Target * i_target )
}
-
+// ------------------------------------------------------------------
+// setPartAndSerialNumberAttributes
+// ------------------------------------------------------------------
+void updateSerialNumberFromBMC( TARGETING::Target * i_nodetarget )
+{
+#ifdef CONFIG_UPDATE_SN_FROM_BMC
+ errlHndl_t l_errl = NULL;
+ size_t l_vpdSize = 0;
+
+ //Get Product Serial Number from Backplane
+ char* l_sn_prod = NULL;
+ l_sn_prod = IPMIFRUINV::getProductSN(0);
+ if (l_sn_prod != NULL)
+ {
+ TRACFCOMP(g_trac_vpd, "Got system serial number from BMC.");
+ TRACFCOMP(g_trac_vpd, "SN from BMC is: %s", l_sn_prod);
+
+ l_errl = deviceRead(i_nodetarget, NULL, l_vpdSize,
+ DEVICE_PVPD_ADDRESS( PVPD::OSYS, PVPD::SS ));
+
+ if(l_errl == NULL)
+ {
+ uint8_t l_vpddata[l_vpdSize];
+
+ l_errl = deviceRead(i_nodetarget, l_vpddata, l_vpdSize,
+ DEVICE_PVPD_ADDRESS( PVPD::OSYS, PVPD::SS ));
+
+ if(l_errl == NULL)
+ {
+ TRACFCOMP(g_trac_vpd, "SN in PVPD::OSYS:SS: %s, size: %d", l_vpddata, l_vpdSize);
+
+ if (strncmp(l_sn_prod, l_vpddata, l_vpdSize) != 0)
+ {
+ l_errl = deviceWrite(i_nodetarget, l_sn_prod, l_vpdSize,
+ DEVICE_PVPD_ADDRESS( PVPD::OSYS, PVPD::SS ));
+ CONSOLE::displayf(NULL, "updated SN from BMC into PVPD.");
+ CONSOLE::flush();
+ CONSOLE::displayf(NULL, "Need a reboot.");
+ CONSOLE::flush();
+ INITSERVICE::requestReboot();
+ }
+ }
+ }
+
+ if(l_errl)
+ {
+ ERRORLOG::errlCommit(l_errl,VPD_COMP_ID);
+ }
+
+ //getProductSN requires the caller to delete the char array
+ delete[] l_sn_prod;
+ l_sn_prod = NULL;
+
+ TRACFCOMP(g_trac_vpd, "End updateSerialNumberFromBMC.");
+ }
+#endif
+}
// ------------------------------------------------------------------
// getPnAndSnRecordAndKeywords
OpenPOWER on IntegriCloud