Skip to content

Commit

Permalink
PRD: Make getDimmSlct/Port generic
Browse files Browse the repository at this point in the history
Change-Id: I1d96a974664ee1d3fdb59c0596a22bc87bd4a5ed
RTC: 199010
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/67773
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Squashed: Ic2144b589f9a26e269ffd2803393d6be7565a23e
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/68274
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
  • Loading branch information
cnpalmer authored and zane131 committed Nov 5, 2018
1 parent 1e21ee6 commit 74aed5f
Show file tree
Hide file tree
Showing 7 changed files with 29 additions and 79 deletions.
2 changes: 1 addition & 1 deletion src/usr/diag/prdf/common/plat/cen/prdfCenMba_common.C
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ void __calloutDimmsOnPort( ExtensibleChip * i_chip, uint32_t i_port,
{
for ( auto & dimm : getConnected(i_chip->getTrgt(), TYPE_DIMM) )
{
if ( getDimmPort<TYPE_MBA>(dimm) == i_port )
if ( getDimmPort(dimm) == i_port )
io_sc.service_data->SetCallout( dimm, MRU_MEDA );
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ void captureRowRepairVpd(TargetHandle_t i_trgt, CaptureData & io_cd)
// Add the rank, port, then the entry data.
capData[idx] = rank.getMaster();
idx += sz_rank;
capData[idx] = getDimmPort<T>( dimm );
capData[idx] = getDimmPort( dimm );
idx += sz_port;
memcpy(&capData[idx], rowRepair.getData(), sz_entry);
idx += sz_entry;
Expand Down
6 changes: 3 additions & 3 deletions src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.C
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ uint32_t __getRowRepairData( TargetHandle_t i_dimm, const MemRank & i_rank,
errlHndl_t l_errl = nullptr;

// get port select
uint8_t l_ps = getDimmPort<T>( i_dimm );
uint8_t l_ps = getDimmPort( i_dimm );

// get mba
TargetHandle_t l_mba = getConnectedParent( i_dimm, T );
Expand Down Expand Up @@ -146,7 +146,7 @@ uint32_t __setRowRepairData( TargetHandle_t i_dimm, const MemRank & i_rank,
errlHndl_t l_errl = nullptr;

// get port select
uint8_t l_ps = getDimmPort<T>( i_dimm );
uint8_t l_ps = getDimmPort( i_dimm );

// get mba
TargetHandle_t l_mba = getConnectedParent(i_dimm, T);
Expand Down Expand Up @@ -282,7 +282,7 @@ uint32_t setRowRepairData( TargetHandle_t i_dimm,
l_tmp = ( l_tmp << 1 ) | 0x1;

// Adjust for mba port 1 address inversion if necessary
if ( (1 == getDimmPort<T>(i_dimm) % 2) && (T == TYPE_MBA) )
if ( (1 == getDimmPort(i_dimm) % 2) && (T == TYPE_MBA) )
{
// Bits flipped in port 1 inversion: (10:12, 16:22, 24, 26:28)
// mask:
Expand Down
78 changes: 15 additions & 63 deletions src/usr/diag/prdf/common/plat/prdfTargetServices.C
Original file line number Diff line number Diff line change
Expand Up @@ -1120,43 +1120,22 @@ TargetHandle_t getConnectedPeerProc( TargetHandle_t i_procTarget,

//------------------------------------------------------------------------------

template<>
uint8_t getDimmPort<TYPE_MBA>( TARGETING::TargetHandle_t i_dimmTrgt )
{
PRDF_ASSERT( nullptr != i_dimmTrgt );
PRDF_ASSERT( TYPE_DIMM == getTargetType(i_dimmTrgt) );

return i_dimmTrgt->getAttr<ATTR_CEN_MBA_PORT>();
}

template<>
uint8_t getDimmPort<TYPE_MCA>( TARGETING::TargetHandle_t i_dimmTrgt )
uint8_t getDimmPort( TARGETING::TargetHandle_t i_dimmTrgt )
{
PRDF_ASSERT( nullptr != i_dimmTrgt );
PRDF_ASSERT( TYPE_DIMM == getTargetType(i_dimmTrgt) );

// Only one port on MCA
return 0;
return i_dimmTrgt->getAttr<ATTR_MEM_PORT>();
}

//------------------------------------------------------------------------------

template<>
uint8_t getDimmSlct<TYPE_MBA>( TargetHandle_t i_trgt )
{
PRDF_ASSERT( nullptr != i_trgt );
PRDF_ASSERT( TYPE_DIMM == getTargetType(i_trgt) );

return i_trgt->getAttr<ATTR_CEN_MBA_DIMM>();
}

template<>
uint8_t getDimmSlct<TYPE_MCA>( TargetHandle_t i_trgt )
uint8_t getDimmSlct( TargetHandle_t i_trgt )
{
PRDF_ASSERT( nullptr != i_trgt );
PRDF_ASSERT( TYPE_DIMM == getTargetType(i_trgt) );

return getTargetPosition(i_trgt) % MAX_DIMM_PER_PORT;
return i_trgt->getAttr<ATTR_POS_ON_MEM_PORT>();
}

//------------------------------------------------------------------------------
Expand All @@ -1167,30 +1146,16 @@ TARGETING::TargetHandleList getConnectedDimms( TARGETING::TargetHandle_t i_trgt,
#define PRDF_FUNC "[PlatServices::getConnectedDimms] "

TargetHandleList o_list;
TYPE l_trgtType = getTargetType( i_trgt );

if ( TYPE_MCA == l_trgtType )
TargetHandleList l_dimmList = getConnected( i_trgt, TYPE_DIMM );
for ( auto & dimm : l_dimmList )
{
o_list.push_back(
getConnectedChild(i_trgt, TYPE_DIMM, i_rank.getDimmSlct()) );
}
else if ( TYPE_MBA == l_trgtType )
{
TargetHandleList l_dimmList = getConnected( i_trgt, TYPE_DIMM );
for ( auto & dimm : l_dimmList )
uint8_t l_dimmSlct = getDimmSlct( dimm );
if ( l_dimmSlct == i_rank.getDimmSlct() )
{
uint8_t l_dimmSlct = getDimmSlct<TYPE_MBA>( dimm );
if ( l_dimmSlct == i_rank.getDimmSlct() )
{
o_list.push_back( dimm );
}
o_list.push_back( dimm );
}
}
else
{
PRDF_ERR(PRDF_FUNC "Invalid target type: HUID=0x%08x", getHuid(i_trgt));
PRDF_ASSERT( false );
}

return o_list;

Expand All @@ -1204,30 +1169,17 @@ TARGETING::TargetHandle_t getConnectedDimm( TARGETING::TargetHandle_t i_trgt,
#define PRDF_FUNC "[PlatServices::getConnectedDimm] "

TargetHandle_t o_dimm = nullptr;
TYPE l_trgtType = getTargetType( i_trgt );

if ( TYPE_MCA == l_trgtType )
{
o_dimm = getConnectedChild( i_trgt, TYPE_DIMM, i_rank.getDimmSlct() );
}
else if ( TYPE_MBA == l_trgtType )
TargetHandleList l_dimmList = getConnectedDimms( i_trgt, i_rank );
for ( auto & dimm : l_dimmList )
{
TargetHandleList l_dimmList = getConnectedDimms( i_trgt, i_rank );
for ( auto & dimm : l_dimmList )
uint8_t l_portSlct = getDimmPort( dimm );
if ( l_portSlct == i_port )
{
uint8_t l_portSlct = getDimmPort<TYPE_MBA>( dimm );
if ( l_portSlct == i_port )
{
o_dimm = dimm;
break;
}
o_dimm = dimm;
break;
}
}
else
{
PRDF_ERR(PRDF_FUNC "Invalid target type: HUID=0x%08x", getHuid(i_trgt));
PRDF_ASSERT( false );
}

return o_dimm;

Expand Down
2 changes: 0 additions & 2 deletions src/usr/diag/prdf/common/plat/prdfTargetServices.H
Original file line number Diff line number Diff line change
Expand Up @@ -394,15 +394,13 @@ bool isMembufOnDimm( TARGETING::TargetHandle_t i_trgt );
* @param i_dimmTrgt Dimm.
* @return port select
*/
template<TARGETING::TYPE T>
uint8_t getDimmPort( TARGETING::TargetHandle_t i_dimmTrgt );

/**
* @brief Obtain the Dimm select for the given Dimm.
* @param i_trgt Dimm.
* @return The DIMM select
*/
template<TARGETING::TYPE T>
uint8_t getDimmSlct( TARGETING::TargetHandle_t i_trgt );

/**
Expand Down
10 changes: 5 additions & 5 deletions src/usr/diag/prdf/plat/mem/prdfMemDynDealloc.C
Original file line number Diff line number Diff line change
Expand Up @@ -1099,7 +1099,7 @@ int32_t __getDimmRange( TargetHandle_t i_dimm,
}

// Get the DIMM select.
uint8_t dimmSlct = getDimmSlct<T>( i_dimm );
uint8_t dimmSlct = getDimmSlct( i_dimm );

// Get the address range of i_dimm.
MemAddr startAddr, endAddr;
Expand Down Expand Up @@ -1172,8 +1172,8 @@ bool isDimmPair( TargetHandle_t i_dimm1, TargetHandle_t i_dimm2 )
bool isDimmPair = false;
do
{
uint8_t dimm1Slct = getDimmSlct<T>( i_dimm1 );
uint8_t dimm2Slct = getDimmSlct<T>( i_dimm2 );
uint8_t dimm1Slct = getDimmSlct( i_dimm1 );
uint8_t dimm2Slct = getDimmSlct( i_dimm2 );

isDimmPair = ( ( dimm1Slct == dimm2Slct ) &&
( getConnectedParent( i_dimm1, T ) ==
Expand All @@ -1191,8 +1191,8 @@ bool compareDimms( TargetHandle_t i_dimm1, TargetHandle_t i_dimm2 )
bool isSmall = false;
do
{
uint8_t dimm1Slct = getDimmSlct<T>( i_dimm1 );
uint8_t dimm2Slct = getDimmSlct<T>( i_dimm2 );
uint8_t dimm1Slct = getDimmSlct( i_dimm1 );
uint8_t dimm2Slct = getDimmSlct( i_dimm2 );

TargetHandle_t tgt1 = getConnectedParent( i_dimm1, T );
TargetHandle_t tgt2 = getConnectedParent( i_dimm2, T );
Expand Down
8 changes: 4 additions & 4 deletions src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ void __calloutDimm( errlHndl_t & io_errl, TargetHandle_t i_portTrgt,
// the repairs will need to be rediscovered.

std::vector<MemRank> ranks;
getMasterRanks<T>( i_portTrgt, ranks, getDimmSlct<T>(i_dimmTrgt) );
getMasterRanks<T>( i_portTrgt, ranks, getDimmSlct(i_dimmTrgt) );

uint8_t data[D][DQ_BITMAP::BITMAP_SIZE];
memset( data, 0x00, sizeof(data) );
Expand Down Expand Up @@ -422,7 +422,7 @@ bool processBadDimms<TYPE_MCA>( TargetHandle_t i_trgt, uint8_t i_badDimmMask )
// DIMM had more bad bits than could be repaired. Note: the value is
// actually a 4-bit field for use with Centaur, but we only use the
// first 2 bits of that field here.
uint8_t mask = 0x80 >> getDimmSlct<TYPE_MCA>(dimm);
uint8_t mask = 0x80 >> getDimmSlct(dimm);

if ( 0 != (i_badDimmMask & mask) )
{
Expand Down Expand Up @@ -470,8 +470,8 @@ bool processBadDimms<TYPE_MBA>( TargetHandle_t i_trgt, uint8_t i_badDimmMask )
TargetHandleList dimms = getConnected( i_trgt, TYPE_DIMM );
for ( auto & dimm : dimms )
{
uint8_t portSlct = getDimmPort<TYPE_MBA>( dimm );
uint8_t dimmSlct = getDimmSlct<TYPE_MBA>( dimm );
uint8_t portSlct = getDimmPort( dimm );
uint8_t dimmSlct = getDimmSlct( dimm );

// The 4 bits of i_badDimmMask is defined as p0d0, p0d1, p1d0, and p1d1.
uint8_t mask = 0x8 >> (portSlct * MBA_DIMMS_PER_RANK + dimmSlct);
Expand Down

0 comments on commit 74aed5f

Please sign in to comment.