diff options
Diffstat (limited to 'src/usr/devtree/bld_devtree.C')
-rw-r--r-- | src/usr/devtree/bld_devtree.C | 142 |
1 files changed, 126 insertions, 16 deletions
diff --git a/src/usr/devtree/bld_devtree.C b/src/usr/devtree/bld_devtree.C index f2e9438aa..622178ae1 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; |