diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/usr/diag/prdf/common/plat/prdfTargetServices.C | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/usr/diag/prdf/common/plat/prdfTargetServices.C b/src/usr/diag/prdf/common/plat/prdfTargetServices.C index f9d2e4d60..52dfc0679 100755 --- a/src/usr/diag/prdf/common/plat/prdfTargetServices.C +++ b/src/usr/diag/prdf/common/plat/prdfTargetServices.C @@ -761,14 +761,19 @@ TargetHandle_t getConnectedChild( TargetHandle_t i_target, TYPE i_connType, } else if ( TYPE_MCA == trgtType && TYPE_DIMM == i_connType ) { - // i_connPos is the DIMM select (0-1) + // i_connPos is the DIMM select (0-1). Note that we don't use + // getTargetPosition() on the DIMM because that does not return a + // value that is relative to the processor as we were expecting. + // There really isn't a good position attribute that matches the + // position in the affinity path. We can use ATTR_REL_POS, which + // will always match the DIMM select. This does not let us match the + // parent unit like all of the other checks in this functions. + // Fortunately, it will be very difficult to have a bug where the + // getConnected code returns DIMMs on a different MCA target. So + // this is an acceptible risk. itr = std::find_if( list.begin(), list.end(), [&](const TargetHandle_t & t) - { - uint32_t dimmPos = getTargetPosition(t); - return (trgtPos == (dimmPos / MAX_DIMM_PER_PORT)) && - (i_connPos == (dimmPos % MAX_DIMM_PER_PORT)); - } ); + { return ( i_connPos == t->getAttr<ATTR_REL_POS>() ); } ); } else { |