Skip to content

Commit 2d53b57

Browse files
candicelicyalexdeucher
authored andcommitted
drm/amdgpu: Add convert_error_address function for umc v8_10
Add convert_error_address for umc v8_10. Signed-off-by: Candice Li <candice.li@amd.com> Reviewed-by: Tao Zhou <tao.zhou1@amd.com> Reviewed-by: Stanley.Yang <Stanley.Yang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 22106ed commit 2d53b57

1 file changed

Lines changed: 42 additions & 31 deletions

File tree

drivers/gpu/drm/amd/amdgpu/umc_v8_10.c

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
212251
static 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

Comments
 (0)