@@ -153,19 +153,49 @@ uint32_t handleMemUe<TYPE_MBA>( ExtensibleChip * i_chip, const MemAddr & i_addr,
153
153
154
154
#ifdef __HOSTBOOT_MODULE
155
155
156
- uint32_t maskMemPort ( ExtensibleChip * i_chip )
156
+ template < >
157
+ uint32_t maskMemPort < TYPE_MCA > ( ExtensibleChip * i_chip )
157
158
{
158
- #define PRDF_FUNC "[MemEcc::maskMemPort] "
159
+ #define PRDF_FUNC "[MemEcc::maskMemPort<TYPE_MCA> ] "
159
160
161
+ PRDF_ASSERT ( nullptr != i_chip );
160
162
PRDF_ASSERT ( TYPE_MCA == i_chip -> getType () );
161
163
162
- SCAN_COMM_REGISTER_CLASS * c = i_chip -> getRegister ("MCACALFIR_MASK_OR" );
163
- SCAN_COMM_REGISTER_CLASS * d = i_chip -> getRegister ("DDRPHYFIR_MASK_OR" );
164
- SCAN_COMM_REGISTER_CLASS * e = i_chip -> getRegister ("MCAECCFIR_MASK_OR" );
164
+ uint32_t o_rc = SUCCESS ;
165
+
166
+ do
167
+ {
168
+ // Mask all FIRs on the port.
169
+ SCAN_COMM_REGISTER_CLASS * c = i_chip -> getRegister ("MCACALFIR_MASK_OR" );
170
+ SCAN_COMM_REGISTER_CLASS * d = i_chip -> getRegister ("DDRPHYFIR_MASK_OR" );
171
+ SCAN_COMM_REGISTER_CLASS * e = i_chip -> getRegister ("MCAECCFIR_MASK_OR" );
172
+
173
+ c -> setAllBits (); d -> setAllBits (); e -> setAllBits ();
174
+
175
+ o_rc = c -> Write () | d -> Write () | e -> Write ();
176
+ if ( SUCCESS != o_rc )
177
+ {
178
+ PRDF_ERR ( PRDF_FUNC "Write() failed on 0x%08x" , i_chip -> getHuid () );
179
+ break ;
180
+ }
181
+
182
+ #ifdef __HOSTBOOT_RUNTIME
165
183
166
- c -> setAllBits (); d -> setAllBits (); e -> setAllBits ();
184
+ /* TODO RTC 136129
185
+ // Dynamically deallocate the port.
186
+ o_rc = MemDealloc::port<TYPE_MCA>( i_chip );
187
+ if ( SUCCESS != o_rc )
188
+ {
189
+ PRDF_ERR( PRDF_FUNC "MemDealloc::port<TYPE_MCA>(0x%08x) failed",
190
+ i_chip->getHuid() );
191
+ }
192
+ */
193
+
194
+ #endif
167
195
168
- return ( c -> Write () | d -> Write () | e -> Write () );
196
+ } while (0 );
197
+
198
+ return o_rc ;
169
199
170
200
#undef PRDF_FUNC
171
201
}
@@ -176,10 +206,13 @@ uint32_t maskMemPort( ExtensibleChip * i_chip )
176
206
177
207
#ifdef __HOSTBOOT_RUNTIME
178
208
179
- uint32_t iuePortFail (ExtensibleChip * i_chip , STEP_CODE_DATA_STRUCT & io_sc )
209
+ template < >
210
+ uint32_t iuePortFail < TYPE_MCA > ( ExtensibleChip * i_chip ,
211
+ STEP_CODE_DATA_STRUCT & io_sc )
180
212
{
181
- #define PRDF_FUNC "[MemEcc::iuePortFail] "
213
+ #define PRDF_FUNC "[MemEcc::iuePortFail<TYPE_MCA> ] "
182
214
215
+ PRDF_ASSERT ( nullptr != i_chip );
183
216
PRDF_ASSERT ( TYPE_MCA == i_chip -> getType () );
184
217
185
218
uint32_t o_rc = SUCCESS ;
@@ -714,89 +747,68 @@ uint32_t analyzeFetchUe<TYPE_MCA, McaDataBundle *>( ExtensibleChip * i_chip,
714
747
715
748
//------------------------------------------------------------------------------
716
749
717
- #ifdef __HOSTBOOT_MODULE
718
-
719
750
template < TARGETING ::TYPE T , typename D >
720
- uint32_t __analyzeIue ( ExtensibleChip * i_chip , STEP_CODE_DATA_STRUCT & io_sc ,
721
- MemAddr i_addr )
751
+ uint32_t handleMemIue ( ExtensibleChip * i_chip , const MemRank & i_rank ,
752
+ STEP_CODE_DATA_STRUCT & io_sc )
722
753
{
723
- #define PRDF_FUNC "[MemEcc::__analyzeIue ] "
754
+ #define PRDF_FUNC "[MemEcc::handleMemIue ] "
724
755
756
+ PRDF_ASSERT ( nullptr != i_chip );
725
757
PRDF_ASSERT ( T == i_chip -> getType () );
758
+
726
759
uint32_t o_rc = SUCCESS ;
727
760
728
- do
729
- {
730
- // get data bundle from chip
731
- D db = static_cast < D > ( i_chip -> getDataBundle () );
761
+ // Add the DIMM to the callout list.
762
+ MemoryMru mm { i_chip -> getTrgt (), i_rank , MemoryMruData ::CALLOUT_RANK };
763
+ io_sc .service_data -> SetCallout ( mm );
732
764
733
- // get the rank
734
- MemRank rank = i_addr .getRank ();
765
+ #ifdef __HOSTBOOT_MODULE
735
766
736
- TargetHandle_t trgt = i_chip -> getTrgt ();
767
+ do
768
+ {
769
+ // Nothing else to do if handling a system checkstop.
770
+ if ( CHECK_STOP == io_sc .service_data -> getPrimaryAttnType () ) break ;
737
771
738
- // Add the DIMM to the callout list
739
- MemoryMru memmru (trgt , rank , MemoryMruData ::CALLOUT_RANK );
740
- io_sc .service_data -> SetCallout ( memmru );
772
+ // Get the data bundle from chip.
773
+ D db = static_cast < D > ( i_chip -> getDataBundle () );
741
774
742
- uint8_t ds = rank .getDimmSlct ();
775
+ // Get the DIMM select.
776
+ uint8_t ds = i_rank .getDimmSlct ();
743
777
744
- // Initialize threshold if it doesn't exist yet
778
+ // Initialize threshold if it doesn't exist yet.
745
779
if ( 0 == db -> iv_iueTh .count (ds ) )
746
780
{
747
781
db -> iv_iueTh [ds ] = TimeBasedThreshold ( getIueTh () );
748
782
}
749
783
750
- // increment the threshold - check if at threshold
784
+ // Increment the count and check if at threshold.
751
785
if ( db -> iv_iueTh [ds ].inc (io_sc ) )
752
786
{
753
- // Make the error log predictive
787
+ // Make the error log predictive.
754
788
io_sc .service_data -> setServiceCall ();
755
789
756
- #ifdef __HOSTBOOT_RUNTIME
757
-
758
- /* TODO RTC 136129
759
- // Dynamically deallocate the rank.
760
- uint32_t dealloc_rc = MemDealloc::rank<T>( i_chip, rank );
761
- if ( SUCCESS != dealloc_rc )
762
- {
763
- PRDF_ERR( PRDF_FUNC "MemDealloc::rank() failed: i_chip=0x%08x "
764
- "rank=m%ds%d", i_chip->getHuid(), rank.getMaster(),
765
- rank.getSlave() );
766
- o_rc = dealloc_rc; break;
767
- }
768
- */
769
-
770
- #endif // __HOSTBOOT_RUNTIME
790
+ // The port fail will be triggered in the PostAnalysis plugin after
791
+ // the error log has been committed.
771
792
772
- // mask off the entire port to avoid collateral
773
- o_rc = maskMemPort ( i_chip );
793
+ // Mask off the entire port to avoid collateral.
794
+ o_rc = MemEcc :: maskMemPort < T > ( i_chip );
774
795
if ( SUCCESS != o_rc )
775
796
{
776
- PRDF_ERR ( PRDF_FUNC "MemEcc::maskMemPort failed: i_chip= 0x%08x" ,
777
- i_chip -> getHuid () );
797
+ PRDF_ERR ( PRDF_FUNC "MemEcc::maskMemPort<T>( 0x%08x) failed " ,
798
+ i_chip -> getHuid () );
778
799
break ;
779
800
}
780
-
781
- // Port fail will be triggered in PostAnalysis after the error log
782
- // has been committed.
783
801
}
784
802
785
- }while (0 );
803
+ } while (0 );
804
+
805
+ #endif // __HOSTBOOT_MODULE
786
806
787
807
return o_rc ;
788
808
789
809
#undef PRDF_FUNC
790
810
}
791
811
792
- // To resolve template linker errors.
793
- template
794
- uint32_t __analyzeIue < TYPE_MCA , McaDataBundle * > (ExtensibleChip * i_chip ,
795
- STEP_CODE_DATA_STRUCT & io_sc ,
796
- MemAddr i_addr );
797
-
798
- #endif // __HOSTBOOT_MODULE
799
-
800
812
//------------------------------------------------------------------------------
801
813
802
814
template < TARGETING ::TYPE T , typename D >
@@ -805,44 +817,39 @@ uint32_t analyzeMainlineIue( ExtensibleChip * i_chip,
805
817
{
806
818
#define PRDF_FUNC "[MemEcc::analyzeMainlineIue] "
807
819
820
+ PRDF_ASSERT ( nullptr != i_chip );
808
821
PRDF_ASSERT ( T == i_chip -> getType () );
809
- uint32_t o_rc = SUCCESS ;
810
822
811
- #ifdef __HOSTBOOT_MODULE
823
+ uint32_t o_rc = SUCCESS ;
812
824
813
825
do
814
826
{
815
-
816
- // get the address of the failure
817
- MemAddr addr ;
818
-
819
827
// Use the address in MBRCER. This address also traps IRCDs, but it is
820
828
// not likely that we will have two independent failure modes at the
821
829
// same time. So we just assume the address is correct.
830
+ MemAddr addr ;
822
831
o_rc = getMemReadAddr < T > ( i_chip , MemAddr ::READ_RCE_ADDR , addr );
823
832
if ( SUCCESS != o_rc )
824
833
{
825
834
PRDF_ERR ( PRDF_FUNC "getMemReadAddr(0x%08x, READ_RCE_ADDR) failed" ,
826
- i_chip -> getHuid () );
835
+ i_chip -> getHuid () );
827
836
break ;
828
837
}
838
+ MemRank rank = addr .getRank ();
829
839
830
- o_rc = __analyzeIue < T ,D > ( i_chip , io_sc , addr );
840
+ o_rc = handleMemIue < T ,D > ( i_chip , rank , io_sc );
831
841
if ( SUCCESS != o_rc )
832
842
{
833
- PRDF_ERR ( PRDF_FUNC "__analyzeIue failed. Chip HUID: 0x%08x" ,
834
- i_chip -> getHuid () );
843
+ PRDF_ERR ( PRDF_FUNC "handleMemIue<T,D>( 0x%08x,m%ds%d) failed " ,
844
+ i_chip -> getHuid (), rank . getMaster (), rank . getSlave () );
835
845
break ;
836
846
}
837
847
838
- }while (0 );
839
-
840
- #endif
848
+ } while (0 );
841
849
842
850
return o_rc ;
843
851
844
852
#undef PRDF_FUNC
845
-
846
853
}
847
854
848
855
// To resolve template linker errors.
@@ -858,40 +865,37 @@ uint32_t analyzeMaintIue( ExtensibleChip * i_chip,
858
865
{
859
866
#define PRDF_FUNC "[MemEcc::analyzeMaintIue] "
860
867
868
+ PRDF_ASSERT ( nullptr != i_chip );
861
869
PRDF_ASSERT ( T == i_chip -> getType () );
862
- uint32_t o_rc = SUCCESS ;
863
870
864
- #ifdef __HOSTBOOT_MODULE
871
+ uint32_t o_rc = SUCCESS ;
865
872
866
873
do
867
874
{
875
+ // Use the current address in the MCBMCAT.
868
876
MemAddr addr ;
869
-
870
- // Use the current address in the MCBMCAT
871
877
o_rc = getMemMaintAddr < T > ( i_chip , addr );
872
878
if ( SUCCESS != o_rc )
873
879
{
874
880
PRDF_ERR ( PRDF_FUNC "getMemMaintAddr(0x%08x) failed" ,
875
- i_chip -> getHuid () );
881
+ i_chip -> getHuid () );
876
882
break ;
877
883
}
884
+ MemRank rank = addr .getRank ();
878
885
879
- o_rc = __analyzeIue < T ,D > ( i_chip , io_sc , addr );
886
+ o_rc = handleMemIue < T ,D > ( i_chip , rank , io_sc );
880
887
if ( SUCCESS != o_rc )
881
888
{
882
- PRDF_ERR ( PRDF_FUNC "__analyzeIue failed. Chip HUID: "
883
- "0x%08x" , i_chip -> getHuid () );
889
+ PRDF_ERR ( PRDF_FUNC "handleMemIue<T,D>(0x%08x,m%ds%d) failed" ,
890
+ i_chip -> getHuid (), rank . getMaster (), rank . getSlave () );
884
891
break ;
885
892
}
886
893
887
- }while (0 );
888
-
889
- #endif
894
+ } while (0 );
890
895
891
896
return o_rc ;
892
897
893
898
#undef PRDF_FUNC
894
-
895
899
}
896
900
897
901
// To resolve template linker errors.
0 commit comments