Add function to convert retired address in SR-IOV
guest.
Signed-off-by: Jinzhou Su <[email protected]>
---
.../drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c | 27 +++++++++++++++++++
.../drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.h | 2 ++
2 files changed, 29 insertions(+)
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 3e0ce9b004e7..26d062239ba9 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
@@ -344,6 +344,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 f4a4dfa4bdf2..6e1cce490e47 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
@@ -56,4 +56,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
--
2.43.0