/** * @fn MaskMbaCalSecondaryBits * @brief Mask MBACAL secondary Fir bits which may come up because of L4 UE. * @param i_chip The Centaur chip. * @param i_sc ServiceDataColector. * @return SUCCESS. */ int32_t MaskMbaCalSecondaryBits( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & i_sc ) { #define PRDF_FUNC "[MaskMbaCalSecondaryBits ] " int32_t l_rc = SUCCESS; do { CenMembufDataBundle * membdb = getMembufDataBundle( i_chip ); for( uint32_t i = 0; i < MAX_MBA_PER_MEMBUF; i++ ) { ExtensibleChip * mbaChip = membdb->getMbaChip(i); if ( NULL == mbaChip ) continue; SCAN_COMM_REGISTER_CLASS * mbaCalFirMaskOr = mbaChip->getRegister("MBACALFIR_MASK_OR"); mbaCalFirMaskOr->SetBit(9); mbaCalFirMaskOr->SetBit(15); l_rc = mbaCalFirMaskOr->Write(); if ( SUCCESS != l_rc ) { // Do not break. Just print error trace and look for // other MBA. PRDF_ERR( PRDF_FUNC"MBACALFIR_MASK_OR write failed" "for 0x%08x", mbaChip->GetId()); } } }while( 0 ); return SUCCESS; #undef PRDF_FUNC } PRDF_PLUGIN_DEFINE( Membuf, MaskMbaCalSecondaryBits );
/** * @brief Handles MCS Channel fail bits, if they exist. * * @param i_membChip The Centaur chip. * @param i_sc ServiceDataColector. * * @return SUCCESS if MCS channel fail is present and properly * handled, FAIL otherwise. */ int32_t handleMcsChnlCs( ExtensibleChip * i_membChip, STEP_CODE_DATA_STRUCT & i_sc ) { #define PRDF_FUNC "[handleMcsChnlCs] " // We will return FAIL from this function if MCS channel fail bits // are not set. If MCS channel fail bits are set, we will try to analyze // Mcs. If MCS is not analyzed properly, we will return FAIL. // This will trigger rule code to execute alternate resolution. int32_t l_rc = SUCCESS; do { CenMembufDataBundle * mbdb = getMembufDataBundle( i_membChip ); ExtensibleChip * mcsChip = mbdb->getMcsChip(); if( NULL == mcsChip ) { l_rc = FAIL; break; } SCAN_COMM_REGISTER_CLASS * mciFir = mcsChip->getRegister("MCIFIR"); SCAN_COMM_REGISTER_CLASS * mciFirMask = mcsChip->getRegister("MCIFIR_MASK"); l_rc = mciFir->Read(); l_rc |= mciFirMask->Read(); if ( SUCCESS != l_rc ) { PRDF_ERR( PRDF_FUNC"MCIFIR/MCIFIR_MASK read failed for 0x%08x", mcsChip->GetId()); break; } // If any of MCS channel fail bit is set, we will analyze // MCS. It is safe to do hard coded check as channel fail // bits are hard wired and and they can not change without HW // change. // bits 0,1, 6, 8, 9, 22, 23, 40 are channel fail bits. uint64_t chnlCsBitsMask = 0xC2C0030000800000ull; uint64_t mciFirBits = mciFir->GetBitFieldJustified(0, 64); uint64_t mciFirMaskBits = mciFirMask->GetBitFieldJustified(0, 64); if ( mciFirBits & ~mciFirMaskBits & chnlCsBitsMask ) { l_rc = mcsChip->Analyze( i_sc, i_sc.service_data->GetCauseAttentionType() ); if( SUCCESS == l_rc ) break; } l_rc = FAIL; }while( 0 ); return l_rc; #undef PRDF_FUNC } PRDF_PLUGIN_DEFINE( Membuf, handleMcsChnlCs );
/** * @brief Plugin to mask the side effects of an RCD parity error * @param i_mbaChip A Centaur MBA chip. * @param i_sc The step code data struct. * @return SUCCESS */ int32_t maskRcdParitySideEffects( ExtensibleChip * i_mbaChip, STEP_CODE_DATA_STRUCT & i_sc ) { #define PRDF_FUNC "[maskRcdParitySideEffects] " int32_t l_rc = SUCCESS; do { //use a data bundle to get the membuf chip CenMbaDataBundle * mbadb = getMbaDataBundle( i_mbaChip ); ExtensibleChip * membChip = mbadb->getMembChip(); if (NULL == membChip) { PRDF_ERR(PRDF_FUNC "getMembChip() failed"); break; } //get the FIRs SCAN_COMM_REGISTER_CLASS * mbsFir = membChip->getRegister("MBSFIR"); SCAN_COMM_REGISTER_CLASS * mbaCalFir = i_mbaChip->getRegister("MBACALFIR"); SCAN_COMM_REGISTER_CLASS * mbaFir = i_mbaChip->getRegister("MBAFIR"); l_rc = mbsFir->Read(); l_rc |= mbaCalFir->Read(); l_rc |= mbaFir->Read(); if (SUCCESS != l_rc) { PRDF_ERR(PRDF_FUNC "MBSFIR/MBACALFIR/MBAFIR read failed for" " 0x%08x", i_mbaChip->GetId()); break; } //get the masks for each FIR SCAN_COMM_REGISTER_CLASS * mbsFirMaskOr = membChip->getRegister("MBSFIR_MASK_OR"); SCAN_COMM_REGISTER_CLASS * mbaCalMaskOr = i_mbaChip->getRegister("MBACALFIR_MASK_OR"); SCAN_COMM_REGISTER_CLASS * mbaFirMaskOr = i_mbaChip->getRegister("MBAFIR_MASK_OR"); //set the masks only if the side effect bit is set if (mbaFir->IsBitSet(2)) { mbaFirMaskOr->SetBit(2); l_rc = mbaFirMaskOr->Write(); if (SUCCESS != l_rc) { PRDF_ERR(PRDF_FUNC "MBAFIR_MASK_OR write failed for " "0x%08x", i_mbaChip->GetId()); break; } } if (mbaCalFir->IsBitSet(2)) { mbaCalMaskOr->SetBit(2); l_rc = mbaCalMaskOr->Write(); if (SUCCESS != l_rc) { PRDF_ERR(PRDF_FUNC "MBACALFIR_MASK_OR write failed for " "0x%08x", i_mbaChip->GetId()); break; } } if (mbaCalFir->IsBitSet(17)) { mbaCalMaskOr->SetBit(17); l_rc = mbaCalMaskOr->Write(); if (SUCCESS != l_rc) { PRDF_ERR(PRDF_FUNC "MBACALFIR_MASK_OR write failed for " "0x%08x", i_mbaChip->GetId()); break; } } if (mbsFir->IsBitSet(4)) { mbsFirMaskOr->SetBit(4); l_rc = mbsFirMaskOr->Write(); if (SUCCESS != l_rc) { PRDF_ERR(PRDF_FUNC "MBSFIR_MASK_OR write failed for " "0x%08x", membChip->GetId()); break; } } }while(0); return SUCCESS; #undef PRDF_FUNC }
/** * @fn ClearMbaCalSecondaryBits * @brief Clears MBACAL secondary Fir bits which may come up because of MBSFIR * @param i_chip The Centaur chip. * @param i_sc ServiceDataColector. * @return SUCCESS. */ int32_t ClearMbaCalSecondaryBits( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & i_sc ) { #define PRDF_FUNC "[ClearMbaCalSecondaryBits ] " int32_t l_rc = SUCCESS; do { SCAN_COMM_REGISTER_CLASS * mbsFir = i_chip->getRegister("MBSFIR"); SCAN_COMM_REGISTER_CLASS * mbsFirMask = i_chip->getRegister("MBSFIR_MASK"); l_rc = mbsFir->Read(); l_rc |= mbsFirMask->Read(); if ( SUCCESS != l_rc ) { PRDF_ERR( PRDF_FUNC"MBSFIR/MBSFIR_MASK read failed" "for 0x%08x", i_chip->GetId()); break; } CenMembufDataBundle * membdb = getMembufDataBundle( i_chip ); for( uint32_t i = 0; i < MAX_MBA_PER_MEMBUF; i++ ) { ExtensibleChip * mbaChip = membdb->getMbaChip(i); if ( NULL == mbaChip ) continue; SCAN_COMM_REGISTER_CLASS * mbaCalFir = mbaChip->getRegister("MBACALFIR"); if( SUCCESS != mbaCalFir->Read() ) { // Do not break. Just print error trace and look for // other MBA. PRDF_ERR( PRDF_FUNC"MBACALFIR read failed" "for 0x%08x", mbaChip->GetId()); continue; } if( !( mbaCalFir->IsBitSet( 10 ) || mbaCalFir->IsBitSet( 14 ) )) continue; SCAN_COMM_REGISTER_CLASS * mbaCalAndFir = mbaChip->getRegister("MBACALFIR_AND"); mbaCalAndFir->setAllBits(); mbaCalAndFir->ClearBit(10); mbaCalAndFir->ClearBit(14); l_rc = mbaCalAndFir->Write(); if ( SUCCESS != l_rc ) { // Do not break. Just print error trace and look for // other MBA. PRDF_ERR( PRDF_FUNC"MBACALFIR_AND write failed" "for 0x%08x", mbaChip->GetId()); } } }while( 0 ); return SUCCESS; #undef PRDF_FUNC } PRDF_PLUGIN_DEFINE( Membuf, ClearMbaCalSecondaryBits );
int32_t cleanupSecondaryFirBits( ExtensibleChip * i_chip, TYPE i_busType, uint32_t i_busPos ) { int32_t l_rc = SUCCESS; TargetHandle_t mcsTgt = NULL; TargetHandle_t mbTgt = NULL; ExtensibleChip * mcsChip = NULL; ExtensibleChip * mbChip = NULL; //In case of spare deployed attention for DMI bus, we need to clear // secondary MBIFIR[10] and MCIFIR[10] bits. do { if ( i_busType == TYPE_MCS ) { mcsTgt = getConnectedChild( i_chip->GetChipHandle(), TYPE_MCS, i_busPos); if (!mcsTgt) break; mcsChip = ( ExtensibleChip * )systemPtr->GetChip( mcsTgt ); if (!mcsChip) break; mbChip = getMcsDataBundle( mcsChip )->getMembChip(); if (!mbChip) break; mbTgt = mbChip->GetChipHandle(); if (!mbTgt) break; } else if ( i_busType == TYPE_MEMBUF ) { mbTgt = i_chip->GetChipHandle(); if (!mbTgt) break; mcsChip = getMembufDataBundle( i_chip )->getMcsChip(); if (!mcsChip) break; mcsTgt = mcsChip->GetChipHandle(); if (!mcsTgt) break; mbChip = i_chip; } else { // We only need to clean secondary FIR bits for DMI bus l_rc = SUCCESS; break; } SCAN_COMM_REGISTER_CLASS * mciAnd = mcsChip->getRegister("MCIFIR_AND"); SCAN_COMM_REGISTER_CLASS * mbiAnd = mbChip->getRegister( "MBIFIR_AND"); mciAnd->setAllBits(); mciAnd->ClearBit(10); mbiAnd->setAllBits(); mbiAnd->ClearBit(10); l_rc = mciAnd->Write(); l_rc |= mbiAnd->Write(); if ( SUCCESS != l_rc ) { PRDF_ERR( "[cleanupSecondaryFirBits] Write() failed on " "MCIFIR/MBIFIR: MCS=0x%08x MEMB=0x%08x", mcsChip->GetId(), mbChip->GetId() ); break; } } while (0); return l_rc; }