@@ -513,69 +513,10 @@ uint32_t handleMemCe( ExtensibleChip * i_chip, const MemAddr & i_addr,
513
513
//------------------------------------------------------------------------------
514
514
515
515
template < TARGETING ::TYPE T , typename D >
516
- uint32_t __analyzeFetchNceTce ( ExtensibleChip * i_chip , const MemAddr & i_addr ,
517
- STEP_CODE_DATA_STRUCT & io_sc ,
518
- bool i_isTce = false )
519
- {
520
- #define PRDF_FUNC "[MemEcc::__analyzeFetchNceTce] "
521
-
522
- uint32_t o_rc = SUCCESS ;
523
-
524
- do
525
- {
526
- // Get the symbol of the failure.
527
- MemSymbol symbol ;
528
- o_rc = getMemReadSymbol < T > ( i_chip , i_addr .getRank (), symbol , i_isTce );
529
- if ( SUCCESS != o_rc )
530
- {
531
- PRDF_ERR ( PRDF_FUNC "getMemReadSymbol(0x%08x) failed" ,
532
- i_chip -> getHuid () );
533
- break ;
534
- }
535
-
536
- // Add the symbol to the callout list and CE table.
537
- bool doTps ;
538
- o_rc = handleMemCe < T ,D > ( i_chip , i_addr , symbol , doTps , io_sc );
539
- if ( SUCCESS != o_rc )
540
- {
541
- PRDF_ERR ( PRDF_FUNC "handleMemCe(0x%08x) failed" ,
542
- i_chip -> getHuid () );
543
- break ;
544
- }
545
-
546
- // Initiate a TPS procedure, if needed.
547
- if ( doTps )
548
- {
549
- #ifdef __HOSTBOOT_RUNTIME
550
-
551
- // If a MNFG threshold has been reached (predictive callout), we
552
- // will still try to start TPS just in case MNFG disables the
553
- // termination policy.
554
-
555
- o_rc = addTpsEvent < T ,D > ( i_chip , i_addr .getRank (), io_sc );
556
- if ( SUCCESS != o_rc )
557
- {
558
- PRDF_ERR ( PRDF_FUNC "addTpsEvent(0x%08x) failed" ,
559
- i_chip -> getHuid () );
560
- }
561
-
562
- #endif
563
- }
564
-
565
- } while (0 );
566
-
567
- return o_rc ;
568
-
569
- #undef PRDF_FUNC
570
- }
571
-
572
- //------------------------------------------------------------------------------
573
-
574
- template < TARGETING ::TYPE T , typename D >
575
- uint32_t analyzeFetchNce ( ExtensibleChip * i_chip ,
576
- STEP_CODE_DATA_STRUCT & io_sc )
516
+ uint32_t analyzeFetchNceTce ( ExtensibleChip * i_chip ,
517
+ STEP_CODE_DATA_STRUCT & io_sc )
577
518
{
578
- #define PRDF_FUNC "[MemEcc::analyzeFetchNce ] "
519
+ #define PRDF_FUNC "[MemEcc ::analyzeFetchNceTce ] "
579
520
580
521
PRDF_ASSERT ( nullptr != i_chip );
581
522
PRDF_ASSERT ( T == i_chip -> getType () );
@@ -593,72 +534,70 @@ uint32_t analyzeFetchNce( ExtensibleChip * i_chip,
593
534
i_chip -> getHuid () );
594
535
break ;
595
536
}
537
+ MemRank rank = addr .getRank ();
596
538
597
- // Complete analysis.
598
- o_rc = __analyzeFetchNceTce < T ,D > ( i_chip , addr , io_sc );
539
+ // Get the symbols for the NCE/TCE attention.
540
+ MemSymbol sym1 , sym2 ;
541
+ o_rc = getMemReadSymbol < T > ( i_chip , rank , sym1 , sym2 );
599
542
if ( SUCCESS != o_rc )
600
543
{
601
- PRDF_ERR ( PRDF_FUNC "__analyzeFetchNceTce (0x%08x) failed" ,
544
+ PRDF_ERR ( PRDF_FUNC "getMemReadSymbol (0 x %08 x ) failed ",
602
545
i_chip -> getHuid () );
603
546
break ;
604
547
}
605
548
606
- } while (0 );
607
-
608
- // Add ECC capture data for FFDC.
609
- MemCaptureData ::addEccData < T > ( i_chip , io_sc );
610
-
611
- return o_rc ;
612
-
613
- #undef PRDF_FUNC
614
- }
615
-
616
- // To resolve template linker errors.
617
- template
618
- uint32_t analyzeFetchNce < TYPE_MCA , McaDataBundle * > ( ExtensibleChip * i_chip ,
619
- STEP_CODE_DATA_STRUCT & io_sc );
620
-
621
- //------------------------------------------------------------------------------
622
-
623
- template < TARGETING ::TYPE T , typename D >
624
- uint32_t analyzeFetchTce ( ExtensibleChip * i_chip ,
625
- STEP_CODE_DATA_STRUCT & io_sc )
626
- {
627
- #define PRDF_FUNC "[MemEcc::analyzeFetchTce] "
628
-
629
- PRDF_ASSERT ( nullptr != i_chip );
630
- PRDF_ASSERT ( T == i_chip -> getType () );
631
-
632
- uint32_t o_rc = SUCCESS ;
633
-
634
- do
635
- {
636
- // Get the address of the failure.
637
- MemAddr addr ;
638
- o_rc = getMemReadAddr < T > ( i_chip , MemAddr ::READ_NCE_ADDR , addr );
639
- if ( SUCCESS != o_rc )
549
+ // Add the first symbol to the callout list and CE table.
550
+ bool doTps = false;
551
+ if ( sym1 .isValid () )
640
552
{
641
- PRDF_ERR ( PRDF_FUNC "getMemReadAddr(0x%08x) failed" ,
642
- i_chip -> getHuid () );
553
+ o_rc = handleMemCe < T ,D > ( i_chip , addr , sym1 , doTps , io_sc );
554
+ if ( SUCCESS != o_rc )
555
+ {
556
+ PRDF_ERR ( PRDF_FUNC "handleMemCe(0x%08x,0x%02x,%d) failed" ,
557
+ i_chip -> getHuid (), rank .getKey (), sym1 .getSymbol () );
558
+ break ;
559
+ }
560
+ }
561
+ else
562
+ {
563
+ // The first symbol should always be valid.
564
+ PRDF_ERR ( PRDF_FUNC "getMemReadSymbol(0x%08x) returned an invalid "
565
+ "symbol" , i_chip -> getHuid () );
566
+ o_rc = FAIL ;
643
567
break ;
644
568
}
645
569
646
- // Complete analysis for first symbol.
647
- o_rc = __analyzeFetchNceTce < T ,D > ( i_chip , addr , io_sc );
648
- if ( SUCCESS != o_rc )
570
+ // Add the second symbol to the callout list and CE table, if it exists.
571
+ if ( sym2 .isValid () )
649
572
{
650
- PRDF_ERR ( PRDF_FUNC "first __analyzeFetchNceTce(0x%08x) failed" ,
651
- i_chip -> getHuid () );
652
- break ;
573
+ bool tmp ;
574
+ o_rc = handleMemCe < T ,D > ( i_chip , addr , sym2 , tmp , io_sc );
575
+ if ( SUCCESS != o_rc )
576
+ {
577
+ PRDF_ERR ( PRDF_FUNC "handleMemCe(0x%08x,0x%02x,%d) failed" ,
578
+ i_chip -> getHuid (), rank .getKey (), sym2 .getSymbol () );
579
+ break ;
580
+ }
581
+ if ( tmp ) doTps = true;
653
582
}
654
583
655
- // Complete analysis for second symbol.
656
- o_rc = __analyzeFetchNceTce < T ,D > ( i_chip , addr , io_sc , true );
657
- if ( SUCCESS != o_rc )
584
+ // Initiate a TPS procedure, if needed.
585
+ if ( doTps )
658
586
{
659
- PRDF_ERR ( PRDF_FUNC "second __analyzeFetchNceTce(0x%08x) failed" ,
660
- i_chip -> getHuid () );
661
- break ;
587
+ #ifdef __HOSTBOOT_RUNTIME
588
+
589
+ // If a MNFG threshold has been reached (predictive callout), we
590
+ // will still try to start TPS just in case MNFG disables the
591
+ // termination policy.
592
+
593
+ o_rc = addTpsEvent < T ,D > ( i_chip , rank , io_sc );
594
+ if ( SUCCESS != o_rc )
595
+ {
596
+ PRDF_ERR ( PRDF_FUNC "addTpsEvent(0x%08x,0x%02x) failed" ,
597
+ i_chip -> getHuid (), rank .getKey () );
598
+ }
599
+
600
+ #endif
662
601
}
663
602
664
603
} while (0 );
@@ -673,7 +612,7 @@ uint32_t analyzeFetchTce( ExtensibleChip * i_chip,
673
612
674
613
// To resolve template linker errors.
675
614
template
676
- uint32_t analyzeFetchTce < TYPE_MCA , McaDataBundle * > ( ExtensibleChip * i_chip ,
615
+ uint32_t analyzeFetchNceTce < TYPE_MCA , McaDataBundle * > ( ExtensibleChip * i_chip ,
677
616
STEP_CODE_DATA_STRUCT & io_sc );
678
617
679
618
//------------------------------------------------------------------------------
@@ -929,7 +868,7 @@ uint32_t analyzeImpe( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc )
929
868
if ( SUCCESS != o_rc )
930
869
{
931
870
PRDF_ERR ( PRDF_FUNC "Read() failed on MSR: i_chip=0x%08x" ,
932
- i_chip -> getHuid () );
871
+ i_chip -> getHuid () );
933
872
break ;
934
873
}
935
874
@@ -944,6 +883,13 @@ uint32_t analyzeImpe( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc )
944
883
945
884
// get symbol and DRAM
946
885
MemSymbol symbol = MemSymbol ::fromGalois ( trgt , rank , galois );
886
+ if ( !symbol .isValid () )
887
+ {
888
+ PRDF_ERR ( PRDF_FUNC "Galois 0x%02x from MSR is invalid: 0x%08x,"
889
+ "0x%02x" , galois , i_chip -> getHuid (), rank .getKey () );
890
+ o_rc = FAIL ;
891
+ break ;
892
+ }
947
893
uint8_t dram = symbol .getDram ();
948
894
949
895
// Add the DIMM to the callout list
0 commit comments