diff options
| author | Jinzhou Su <jinzhou.su@amd.com> | 2026-02-10 09:36:48 +0300 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2026-02-26 00:56:12 +0300 |
| commit | edd786e9cf355ce777705f44b6e9c3f432c04f73 (patch) | |
| tree | ff571fbd75e8ebf66fa32e783fc14e2a058644ef | |
| parent | a1fafed0f529d8f79e7deac762dc53f901fa13ec (diff) | |
| download | linux-edd786e9cf355ce777705f44b6e9c3f432c04f73.tar.xz | |
drm/amd/ras: Add function to convert retired address
Add function to convert retired address in SR-IOV
guest.
Signed-off-by: Jinzhou Su <jinzhou.su@amd.com>
Reviewed-by: YiPeng Chai <YiPeng.Chai@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
| -rw-r--r-- | drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c | 27 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.h | 2 |
2 files changed, 29 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c index e9c8bd4226da..309cdf595b6b 100644 --- a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c +++ b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c @@ -401,6 +401,33 @@ int amdgpu_virt_ras_check_address_validity(struct amdgpu_device *adev, return RAS_CMD__SUCCESS; } +int amdgpu_virt_ras_convert_retired_address(struct amdgpu_device *adev, + uint64_t address, uint64_t *pfn, uint32_t max_pfn_sz) +{ + struct ras_cmd_convert_retired_address_req req = {0}; + struct ras_cmd_convert_retired_address_rsp rsp = {0}; + int ret = 0, i; + int retired_page_count; + + if (!pfn || !max_pfn_sz) + return -EINVAL; + + req.address = address; + + ret = amdgpu_ras_mgr_handle_ras_cmd(adev, RAS_CMD__CONVERT_RETIRED_ADDRESS, + &req, sizeof(req), &rsp, sizeof(rsp)); + + if (ret || rsp.retired_count == 0) + return -EINVAL; + + retired_page_count = rsp.retired_count > max_pfn_sz ? max_pfn_sz : rsp.retired_count; + + for (i = 0; i < retired_page_count; i++) + pfn[i] = rsp.retired_addr[i] >> AMDGPU_GPU_PAGE_SHIFT; + + return retired_page_count; +} + static struct ras_cmd_func_map amdgpu_virt_ras_cmd_maps[] = { {RAS_CMD__GET_CPER_SNAPSHOT, amdgpu_virt_ras_get_cper_snapshot}, {RAS_CMD__GET_CPER_RECORD, amdgpu_virt_ras_get_cper_records}, diff --git a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.h b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.h index 8245e0de6a9e..3000c354b76f 100644 --- a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.h +++ b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.h @@ -60,4 +60,6 @@ void amdgpu_virt_ras_set_remote_uniras(struct amdgpu_device *adev, bool en); bool amdgpu_virt_ras_remote_uniras_enabled(struct amdgpu_device *adev); int amdgpu_virt_ras_check_address_validity(struct amdgpu_device *adev, uint64_t address, bool *hit); +int amdgpu_virt_ras_convert_retired_address(struct amdgpu_device *adev, + uint64_t address, uint64_t *pfn, uint32_t max_pfn_sz); #endif |
