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: add function to find all memory pages in one physical row

And the function can be reused across amdgpu driver.

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
b02ef407 19d4b27a

+25 -15
+23 -15
drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
··· 445 445 return ret; 446 446 } 447 447 448 + int amdgpu_umc_pages_in_a_row(struct amdgpu_device *adev, 449 + struct ras_err_data *err_data, uint64_t pa_addr) 450 + { 451 + struct ta_ras_query_address_output addr_out; 452 + 453 + /* reinit err_data */ 454 + err_data->err_addr_cnt = 0; 455 + err_data->err_addr_len = adev->umc.retire_unit; 456 + 457 + addr_out.pa.pa = pa_addr; 458 + if (adev->umc.ras && adev->umc.ras->convert_ras_err_addr) 459 + return adev->umc.ras->convert_ras_err_addr(adev, err_data, NULL, 460 + &addr_out, false); 461 + else 462 + return -EINVAL; 463 + } 464 + 448 465 int amdgpu_umc_lookup_bad_pages_in_a_row(struct amdgpu_device *adev, 449 466 uint64_t pa_addr, uint64_t *pfns, int len) 450 467 { 451 - uint32_t i, ret = 0, pos = 0; 452 - struct ta_ras_query_address_output addr_out; 468 + int i, ret; 453 469 struct ras_err_data err_data; 454 470 455 471 err_data.err_addr = kcalloc(adev->umc.retire_unit, ··· 475 459 return 0; 476 460 } 477 461 478 - addr_out.pa.pa = pa_addr; 479 - 480 - if (adev->umc.ras && adev->umc.ras->convert_ras_err_addr) { 481 - ret = adev->umc.ras->convert_ras_err_addr(adev, &err_data, NULL, 482 - &addr_out, false); 483 - if (ret) 484 - goto out; 485 - } else { 462 + ret = amdgpu_umc_pages_in_a_row(adev, &err_data, pa_addr); 463 + if (ret) 486 464 goto out; 487 - } 488 465 489 466 for (i = 0; i < adev->umc.retire_unit; i++) { 490 - if (pos >= len) 467 + if (i >= len) 491 468 goto out; 492 469 493 - pfns[pos] = err_data.err_addr[pos].retired_page; 494 - pos++; 470 + pfns[i] = err_data.err_addr[i].retired_page; 495 471 } 496 - ret = pos; 472 + ret = i; 497 473 498 474 out: 499 475 kfree(err_data.err_addr);
+2
drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
··· 139 139 140 140 void amdgpu_umc_handle_bad_pages(struct amdgpu_device *adev, 141 141 void *ras_error_status); 142 + int amdgpu_umc_pages_in_a_row(struct amdgpu_device *adev, 143 + struct ras_err_data *err_data, uint64_t pa_addr); 142 144 int amdgpu_umc_lookup_bad_pages_in_a_row(struct amdgpu_device *adev, 143 145 uint64_t pa_addr, uint64_t *pfns, int len); 144 146 int amdgpu_umc_mca_to_addr(struct amdgpu_device *adev,