Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/amdgpu: make convert_ras_err_addr visible outside UMC block

And change some UMC v12 specific functions to generic version, so the
code can be shared.

Signed-off-by: Tao Zhou <tao.zhou1@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Tao Zhou and committed by
Alex Deucher
4e7812e2 3d60a30c

+78 -58
+63
drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
··· 444 444 445 445 return ret; 446 446 } 447 + 448 + int amdgpu_umc_lookup_bad_pages_in_a_row(struct amdgpu_device *adev, 449 + uint64_t pa_addr, uint64_t *pfns, int len) 450 + { 451 + uint32_t i, ret = 0, pos = 0; 452 + struct ta_ras_query_address_output addr_out; 453 + struct ras_err_data err_data; 454 + 455 + err_data.err_addr = 456 + kcalloc(adev->umc.max_ras_err_cnt_per_query, 457 + sizeof(struct eeprom_table_record), GFP_KERNEL); 458 + if (!err_data.err_addr) { 459 + dev_warn(adev->dev, "Failed to alloc memory in bad page lookup!\n"); 460 + return 0; 461 + } 462 + 463 + addr_out.pa.pa = pa_addr; 464 + 465 + if (adev->umc.ras && adev->umc.ras->convert_ras_err_addr) 466 + adev->umc.ras->convert_ras_err_addr(adev, &err_data, NULL, 467 + &addr_out, false); 468 + else 469 + goto out; 470 + 471 + for (i = 0; i < adev->umc.max_ras_err_cnt_per_query; i++) { 472 + if (pos >= len) 473 + goto out; 474 + 475 + pfns[pos] = err_data.err_addr[pos].retired_page; 476 + pos++; 477 + } 478 + ret = pos; 479 + 480 + out: 481 + kfree(err_data.err_addr); 482 + return ret; 483 + } 484 + 485 + int amdgpu_umc_mca_to_addr(struct amdgpu_device *adev, 486 + uint64_t err_addr, uint32_t ch, uint32_t umc, 487 + uint32_t node, uint32_t socket, 488 + uint64_t *addr, bool dump_addr) 489 + { 490 + struct ta_ras_query_address_input addr_in; 491 + struct ta_ras_query_address_output addr_out; 492 + 493 + memset(&addr_in, 0, sizeof(addr_in)); 494 + addr_in.ma.err_addr = err_addr; 495 + addr_in.ma.ch_inst = ch; 496 + addr_in.ma.umc_inst = umc; 497 + addr_in.ma.node_inst = node; 498 + addr_in.ma.socket_id = socket; 499 + 500 + if (adev->umc.ras && adev->umc.ras->convert_ras_err_addr) 501 + adev->umc.ras->convert_ras_err_addr(adev, NULL, &addr_in, 502 + &addr_out, dump_addr); 503 + else 504 + return 0; 505 + 506 + *addr = addr_out.pa.pa; 507 + 508 + return 0; 509 + }
+11
drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
··· 70 70 enum amdgpu_mca_error_type type, void *ras_error_status); 71 71 int (*update_ecc_status)(struct amdgpu_device *adev, 72 72 uint64_t status, uint64_t ipid, uint64_t addr); 73 + void (*convert_ras_err_addr)(struct amdgpu_device *adev, 74 + struct ras_err_data *err_data, 75 + struct ta_ras_query_address_input *addr_in, 76 + struct ta_ras_query_address_output *addr_out, 77 + bool dump_addr); 73 78 }; 74 79 75 80 struct amdgpu_umc_funcs { ··· 139 134 140 135 void amdgpu_umc_handle_bad_pages(struct amdgpu_device *adev, 141 136 void *ras_error_status); 137 + int amdgpu_umc_lookup_bad_pages_in_a_row(struct amdgpu_device *adev, 138 + uint64_t pa_addr, uint64_t *pfns, int len); 139 + int amdgpu_umc_mca_to_addr(struct amdgpu_device *adev, 140 + uint64_t err_addr, uint32_t ch, uint32_t umc, 141 + uint32_t node, uint32_t socket, 142 + uint64_t *addr, bool dump_addr); 142 143 #endif
+4 -58
drivers/gpu/drm/amd/amdgpu/umc_v12_0.c
··· 243 243 } 244 244 } 245 245 246 - static int umc_v12_0_lookup_bad_pages_in_a_row(struct amdgpu_device *adev, 247 - uint64_t pa_addr, uint64_t *pfns, int len) 248 - { 249 - uint32_t i, ret = 0, pos = 0; 250 - struct ta_ras_query_address_output addr_out; 251 - struct ras_err_data err_data; 252 - 253 - err_data.err_addr = 254 - kcalloc(adev->umc.max_ras_err_cnt_per_query, 255 - sizeof(struct eeprom_table_record), GFP_KERNEL); 256 - if (!err_data.err_addr) { 257 - dev_warn(adev->dev, "Failed to alloc memory in bad page lookup!\n"); 258 - return 0; 259 - } 260 - 261 - addr_out.pa.pa = pa_addr; 262 - umc_v12_0_convert_error_address(adev, &err_data, NULL, &addr_out, false); 263 - 264 - for (i = 0; i < adev->umc.max_ras_err_cnt_per_query; i++) { 265 - if (pos >= len) 266 - goto out; 267 - 268 - pfns[pos] = err_data.err_addr[pos].retired_page; 269 - pos++; 270 - } 271 - ret = pos; 272 - 273 - out: 274 - kfree(err_data.err_addr); 275 - return ret; 276 - } 277 - 278 - static int umc_v12_0_convert_mca_to_addr(struct amdgpu_device *adev, 279 - uint64_t err_addr, uint32_t ch, uint32_t umc, 280 - uint32_t node, uint32_t socket, 281 - uint64_t *addr, bool dump_addr) 282 - { 283 - struct ta_ras_query_address_input addr_in; 284 - struct ta_ras_query_address_output addr_out; 285 - 286 - memset(&addr_in, 0, sizeof(addr_in)); 287 - addr_in.ma.err_addr = err_addr; 288 - addr_in.ma.ch_inst = ch; 289 - addr_in.ma.umc_inst = umc; 290 - addr_in.ma.node_inst = node; 291 - addr_in.ma.socket_id = socket; 292 - addr_in.addr_type = TA_RAS_MCA_TO_PA; 293 - 294 - umc_v12_0_convert_error_address(adev, NULL, &addr_in, &addr_out, dump_addr); 295 - 296 - *addr = addr_out.pa.pa; 297 - 298 - return 0; 299 - } 300 - 301 246 static int umc_v12_0_query_error_address(struct amdgpu_device *adev, 302 247 uint32_t node_inst, uint32_t umc_inst, 303 248 uint32_t ch_inst, void *data) ··· 470 525 MCA_IPID_2_UMC_CH(ipid), 471 526 err_addr); 472 527 473 - ret = umc_v12_0_convert_mca_to_addr(adev, 528 + ret = amdgpu_umc_mca_to_addr(adev, 474 529 err_addr, MCA_IPID_2_UMC_CH(ipid), 475 530 MCA_IPID_2_UMC_INST(ipid), MCA_IPID_2_DIE_ID(ipid), 476 531 MCA_IPID_2_SOCKET_ID(ipid), &pa_addr, true); ··· 504 559 con->umc_ecc_log.de_queried_count++; 505 560 506 561 memset(page_pfn, 0, sizeof(page_pfn)); 507 - count = umc_v12_0_lookup_bad_pages_in_a_row(adev, 562 + count = amdgpu_umc_lookup_bad_pages_in_a_row(adev, 508 563 pa_addr, 509 564 page_pfn, ARRAY_SIZE(page_pfn)); 510 565 if (count <= 0) { ··· 547 602 return -EINVAL; 548 603 549 604 memset(page_pfn, 0, sizeof(page_pfn)); 550 - count = umc_v12_0_lookup_bad_pages_in_a_row(adev, 605 + count = amdgpu_umc_lookup_bad_pages_in_a_row(adev, 551 606 ecc_err->pa_pfn << AMDGPU_GPU_PAGE_SHIFT, 552 607 page_pfn, ARRAY_SIZE(page_pfn)); 553 608 ··· 604 659 .ecc_info_query_ras_error_address = umc_v12_0_query_ras_ecc_err_addr, 605 660 .check_ecc_err_status = umc_v12_0_check_ecc_err_status, 606 661 .update_ecc_status = umc_v12_0_update_ecc_status, 662 + .convert_ras_err_addr = umc_v12_0_convert_error_address, 607 663 }; 608 664