blob: 0f20e0bc7be532255047e73d9ea9691c5effad7c [file] [log] [blame]
From 438ebf4b5acbaab0da69009d4248a6aac45fbed6 Mon Sep 17 00:00:00 2001
From: Dan Crowell <dcrowell@us.ibm.com>
Date: Wed, 11 Mar 2015 16:44:59 -0500
Subject: [PATCH 3/5] Pull model name and serial from OSYS record if available
The supported level of OP planar VPD has the system model
name inside OSYS:MM, not OPFR:DR.
Change-Id: Iaa9c4e00325f8fa6efb7a9fca1275bcea2759308
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/16308
Reviewed-by: William H. Schwartz <whs@us.ibm.com>
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
(cherry picked from commit 2114a66c76558f41cd305fc294ccdfaf6607c0e5)
---
src/usr/devtree/bld_devtree.C | 142 +++++++++++++++++++++++++++++++++++++-----
1 file changed, 126 insertions(+), 16 deletions(-)
diff --git a/src/usr/devtree/bld_devtree.C b/src/usr/devtree/bld_devtree.C
index f2e9438..622178a 100644
--- a/src/usr/devtree/bld_devtree.C
+++ b/src/usr/devtree/bld_devtree.C
@@ -1034,18 +1034,26 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
// Nothing to do for small trees currently.
if (!i_smallTree)
{
+ //===== compatible =====
/* Fetch the MRW-defined compatible model from attributes */
ATTR_OPAL_MODEL_type l_model = {0};
TARGETING::Target* sys = NULL;
TARGETING::targetService().getTopLevelTarget(sys);
sys->tryGetAttr<TARGETING::ATTR_OPAL_MODEL>(l_model);
- /* Add compatibility node */
+ /* Add compatibility value */
const char* l_compats[] = { "ibm,powernv", l_model, NULL };
i_dt->addPropertyStrings(rootNode, "compatible", l_compats);
- /* Add system model node */
- // Based off of the DR field in the OPFR
+ //===== model =====
+ /* Add system model value
+ Depending on the vintage of the planar VPD, there are 3 places
+ we need to look for this data.
+ 1) OSYS:MM
+ 2) OPFR:DR
+ 3) Default to 'unknown'
+ */
+ bool foundvpd = false;
// TODO RTC 118373 -- update to account for firestone/memory riser
TARGETING::TargetHandleList l_membTargetList;
getAllChips(l_membTargetList, TYPE_MEMBUF);
@@ -1061,42 +1069,144 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
errhdl = deviceRead( l_pMem,
NULL,
vpdSize,
- DEVICE_CVPD_ADDRESS( CVPD::OPFR,
- CVPD::DR ));
+ DEVICE_CVPD_ADDRESS( CVPD::OSYS,
+ CVPD::MM ));
if(errhdl)
{
- TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get DR size for HUID=0x%.8X",
+ TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get OSYS:MM size for HUID=0x%.8X",
TARGETING::get_huid(l_pMem));
- i_dt->addPropertyString(rootNode, "model", "unknown");
- errlCommit(errhdl, DEVTREE_COMP_ID);
+
+ // Try the OPFR record
+ errlHndl_t opfr_errhdl = deviceRead( l_pMem,
+ NULL,
+ vpdSize,
+ DEVICE_CVPD_ADDRESS( CVPD::OPFR,
+ CVPD::DR ));
+ if(opfr_errhdl)
+ {
+ TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get OPFR:DR size for HUID=0x%.8X",
+ TARGETING::get_huid(l_pMem));
+ delete opfr_errhdl; //delete OPFR log, VPD is just bad
+ }
+ else
+ {
+ delete errhdl; //ignore lack of OSYS due to older vpd
+ errhdl = NULL;
+ char drBuf[vpdSize+1];
+ memset(&drBuf, 0x0, (vpdSize+1)); //null terminated str
+ errhdl = deviceRead( l_pMem,
+ reinterpret_cast<void*>( &drBuf ),
+ vpdSize,
+ DEVICE_CVPD_ADDRESS( CVPD::OPFR,
+ CVPD::DR ));
+
+ if(errhdl)
+ {
+ TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OPFR:DR for HUID=0x%.8X",
+ TARGETING::get_huid(l_pMem));
+ }
+ else
+ {
+ foundvpd = true;
+ i_dt->addPropertyString(rootNode, "model", drBuf);
+ }
+ }
}
else
{
- char drBuf[vpdSize+1];
- memset(&drBuf, 0x0, (vpdSize+1)); //ensure null terminated str
+ char mmBuf[vpdSize+1];
+ memset(&mmBuf, 0x0, (vpdSize+1)); //ensure null terminated str
errhdl = deviceRead( l_pMem,
- reinterpret_cast<void*>( &drBuf ),
+ reinterpret_cast<void*>( &mmBuf ),
vpdSize,
- DEVICE_CVPD_ADDRESS( CVPD::OPFR,
- CVPD::DR ));
+ DEVICE_CVPD_ADDRESS( CVPD::OSYS,
+ CVPD::MM ));
if(errhdl)
{
- TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read DR for HUID=0x%.8X",
+ TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OSYS:MM for HUID=0x%.8X",
TARGETING::get_huid(l_pMem));
}
else
{
- i_dt->addPropertyString(rootNode, "model", drBuf);
+ foundvpd = true;
+ i_dt->addPropertyString(rootNode, "model", mmBuf);
}
}
}
- else //chassis info not found, default to unknown
+
+ // just commit any errors we get, this isn't critical
+ if( errhdl )
+ {
+ errlCommit(errhdl, DEVTREE_COMP_ID); //commit original OSYS log
+ }
+
+ if( !foundvpd ) //chassis info not found, default to unknown
{
TRACFCOMP(g_trac_devtree,ERR_MRK" VPD not found, model defaulted to unknown");
i_dt->addPropertyString(rootNode, "model", "unknown");
}
+
+ //===== system-id =====
+ /* Add system-id value
+ 1) OSYS:SS
+ 2) Default to 'unavailable'
+ */
+ // TODO RTC 118373 -- update to account for firestone/memory riser
+ foundvpd = false;
+ if( l_membTargetList.size() )
+ {
+ // TODO RTC 118373 - Should be able to read from attribute
+ TARGETING::Target * l_pMem = l_membTargetList[0];
+ size_t vpdSize = 0x0;
+
+ // Note: First read with NULL for o_buffer sets vpdSize to the
+ // correct length
+ errhdl = deviceRead( l_pMem,
+ NULL,
+ vpdSize,
+ DEVICE_CVPD_ADDRESS( CVPD::OSYS,
+ CVPD::SS ));
+
+ if(errhdl)
+ {
+ TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get OSYS:SS size for HUID=0x%.8X",
+ TARGETING::get_huid(l_pMem));
+ // Note - not supporting old vpd versions without OSYS here
+ }
+ else
+ {
+ char ssBuf[vpdSize+1];
+ memset(&ssBuf, 0x0, (vpdSize+1)); //ensure null terminated str
+ errhdl = deviceRead( l_pMem,
+ reinterpret_cast<void*>( &ssBuf ),
+ vpdSize,
+ DEVICE_CVPD_ADDRESS( CVPD::OSYS,
+ CVPD::SS ));
+
+ if(errhdl)
+ {
+ TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OSYS:SS for HUID=0x%.8X",
+ TARGETING::get_huid(l_pMem));
+ }
+ else
+ {
+ foundvpd = true;
+ i_dt->addPropertyString(rootNode, "system-id", ssBuf);
+ }
+ }
+ }
+ // just commit any errors we get, this isn't critical
+ if( errhdl )
+ {
+ errlCommit(errhdl, DEVTREE_COMP_ID);
+ }
+
+ if( !foundvpd ) //serial number not found, default to unavailable
+ {
+ i_dt->addPropertyString(rootNode, "system-id", "unavailable");
+ }
}
return errhdl;
--
1.8.2.2