@@ -209,6 +209,45 @@ static int umc_v8_10_swizzle_mode_na_to_pa(struct amdgpu_device *adev,
209209 return 0 ;
210210}
211211
212+ void umc_v8_10_convert_error_address (struct amdgpu_device * adev ,
213+ struct ras_err_data * err_data , uint64_t err_addr ,
214+ uint32_t ch_inst , uint32_t umc_inst ,
215+ uint32_t node_inst , uint64_t mc_umc_status )
216+ {
217+ uint64_t na_err_addr_base ;
218+ uint64_t na_err_addr , retired_page_addr ;
219+ uint32_t channel_index , addr_lsb , col = 0 ;
220+ int ret = 0 ;
221+
222+ channel_index =
223+ adev -> umc .channel_idx_tbl [node_inst * adev -> umc .umc_inst_num *
224+ adev -> umc .channel_inst_num +
225+ umc_inst * adev -> umc .channel_inst_num +
226+ ch_inst ];
227+
228+ /* the lowest lsb bits should be ignored */
229+ addr_lsb = REG_GET_FIELD (mc_umc_status , MCA_UMC_UMC0_MCUMC_STATUST0 , AddrLsb );
230+ err_addr &= ~((0x1ULL << addr_lsb ) - 1 );
231+ na_err_addr_base = err_addr & ~(0x3ULL << UMC_V8_10_NA_C5_BIT );
232+
233+ /* loop for all possibilities of [C6 C5] in normal address. */
234+ for (col = 0 ; col < UMC_V8_10_NA_COL_2BITS_POWER_OF_2_NUM ; col ++ ) {
235+ na_err_addr = na_err_addr_base | (col << UMC_V8_10_NA_C5_BIT );
236+
237+ /* Mapping normal error address to retired soc physical address. */
238+ ret = umc_v8_10_swizzle_mode_na_to_pa (adev , channel_index ,
239+ na_err_addr , & retired_page_addr );
240+ if (ret ) {
241+ dev_err (adev -> dev , "Failed to map pa from umc na.\n" );
242+ break ;
243+ }
244+ dev_info (adev -> dev , "Error Address(PA): 0x%llx\n" ,
245+ retired_page_addr );
246+ amdgpu_umc_fill_error_record (err_data , na_err_addr ,
247+ retired_page_addr , channel_index , umc_inst );
248+ }
249+ }
250+
212251static void umc_v8_10_query_error_address (struct amdgpu_device * adev ,
213252 struct ras_err_data * err_data ,
214253 uint32_t umc_reg_offset ,
@@ -218,10 +257,7 @@ static void umc_v8_10_query_error_address(struct amdgpu_device *adev,
218257{
219258 uint64_t mc_umc_status_addr ;
220259 uint64_t mc_umc_status , err_addr ;
221- uint64_t mc_umc_addrt0 , na_err_addr_base ;
222- uint64_t na_err_addr , retired_page_addr ;
223- uint32_t channel_index , addr_lsb , col = 0 ;
224- int ret = 0 ;
260+ uint64_t mc_umc_addrt0 ;
225261
226262 mc_umc_status_addr =
227263 SOC15_REG_OFFSET (UMC , 0 , regMCA_UMC_UMC0_MCUMC_STATUST0 );
@@ -236,12 +272,6 @@ static void umc_v8_10_query_error_address(struct amdgpu_device *adev,
236272 return ;
237273 }
238274
239- channel_index =
240- adev -> umc .channel_idx_tbl [node_inst * adev -> umc .umc_inst_num *
241- adev -> umc .channel_inst_num +
242- umc_inst * adev -> umc .channel_inst_num +
243- ch_inst ];
244-
245275 /* calculate error address if ue error is detected */
246276 if (REG_GET_FIELD (mc_umc_status , MCA_UMC_UMC0_MCUMC_STATUST0 , Val ) == 1 &&
247277 REG_GET_FIELD (mc_umc_status , MCA_UMC_UMC0_MCUMC_STATUST0 , AddrV ) == 1 &&
@@ -251,27 +281,8 @@ static void umc_v8_10_query_error_address(struct amdgpu_device *adev,
251281 err_addr = RREG64_PCIE ((mc_umc_addrt0 + umc_reg_offset ) * 4 );
252282 err_addr = REG_GET_FIELD (err_addr , MCA_UMC_UMC0_MCUMC_ADDRT0 , ErrorAddr );
253283
254- /* the lowest lsb bits should be ignored */
255- addr_lsb = REG_GET_FIELD (mc_umc_status , MCA_UMC_UMC0_MCUMC_STATUST0 , AddrLsb );
256- err_addr &= ~((0x1ULL << addr_lsb ) - 1 );
257- na_err_addr_base = err_addr & ~(0x3ULL << UMC_V8_10_NA_C5_BIT );
258-
259- /* loop for all possibilities of [C6 C5] in normal address. */
260- for (col = 0 ; col < UMC_V8_10_NA_COL_2BITS_POWER_OF_2_NUM ; col ++ ) {
261- na_err_addr = na_err_addr_base | (col << UMC_V8_10_NA_C5_BIT );
262-
263- /* Mapping normal error address to retired soc physical address. */
264- ret = umc_v8_10_swizzle_mode_na_to_pa (adev , channel_index ,
265- na_err_addr , & retired_page_addr );
266- if (ret ) {
267- dev_err (adev -> dev , "Failed to map pa from umc na.\n" );
268- break ;
269- }
270- dev_info (adev -> dev , "Error Address(PA): 0x%llx\n" ,
271- retired_page_addr );
272- amdgpu_umc_fill_error_record (err_data , na_err_addr ,
273- retired_page_addr , channel_index , umc_inst );
274- }
284+ umc_v8_10_convert_error_address (adev , err_data , err_addr ,
285+ ch_inst , umc_inst , node_inst , mc_umc_status );
275286 }
276287
277288 /* clear umc status */
0 commit comments