From 54c2d9739bb748d0f7d6aaa101562cfa5963551d Mon Sep 17 00:00:00 2001 From: YiPeng Chai Date: Mon, 3 Nov 2025 16:32:18 +0800 Subject: [PATCH] drm/amd/ras: Compatible with legacy sriov host If sriov host is legacy, the guest uniras will be disabled. Signed-off-by: YiPeng Chai Reviewed-by: Tao Zhou Reviewed-by: Hawking Zhang Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 4 +++ drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h | 3 +- .../gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mgr.c | 3 ++ .../drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c | 30 +++++++++++++++++++ .../drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.h | 3 ++ 5 files changed, 42 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c index 2d48818773c0c..759f3c642331d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c @@ -37,6 +37,7 @@ #include "vi.h" #include "soc15.h" #include "nv.h" +#include "amdgpu_virt_ras_cmd.h" #define POPULATE_UCODE_INFO(vf2pf_info, ucode, ver) \ do { \ @@ -1533,6 +1534,9 @@ bool amdgpu_virt_get_ras_capability(struct amdgpu_device *adev) if (adev->virt.ras_en_caps.bits.poison_propogation_mode) con->poison_supported = true; /* Poison is handled by host */ + if (adev->virt.ras_en_caps.bits.uniras_supported) + amdgpu_virt_ras_set_remote_uniras(adev, true); + return true; } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h b/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h index 3cdb1e0eca377..cffb2f805de24 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h @@ -201,7 +201,8 @@ union amd_sriov_ras_caps { uint64_t block_mpio : 1; uint64_t block_mmsch : 1; uint64_t poison_propogation_mode : 1; - uint64_t reserved : 43; + uint64_t uniras_supported : 1; + uint64_t reserved : 42; } bits; uint64_t all; }; diff --git a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mgr.c b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mgr.c index cb7fbc791c3cf..923bddd0af3a2 100644 --- a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mgr.c +++ b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mgr.c @@ -452,6 +452,9 @@ bool amdgpu_uniras_enabled(struct amdgpu_device *adev) { struct amdgpu_ras_mgr *ras_mgr = amdgpu_ras_mgr_get_context(adev); + if (amdgpu_sriov_vf(adev)) + return amdgpu_virt_ras_remote_uniras_enabled(adev); + if (!ras_mgr || !ras_mgr->ras_core) return false; 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 895b68785849c..5e90a187155b3 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 @@ -380,6 +380,8 @@ int amdgpu_virt_ras_hw_init(struct amdgpu_device *adev) (struct amdgpu_virt_ras_cmd *)ras_mgr->virt_ras_cmd; struct vram_blocks_ecc *blks_ecc = &virt_ras->blocks_ecc; + amdgpu_virt_get_ras_capability(adev); + memset(blks_ecc, 0, sizeof(*blks_ecc)); blks_ecc->size = PAGE_SIZE; if (amdgpu_bo_create_kernel(adev, blks_ecc->size, @@ -428,3 +430,31 @@ int amdgpu_virt_ras_post_reset(struct amdgpu_device *adev) { return 0; } + +void amdgpu_virt_ras_set_remote_uniras(struct amdgpu_device *adev, bool en) +{ + struct amdgpu_ras_mgr *ras_mgr = amdgpu_ras_mgr_get_context(adev); + struct amdgpu_virt_ras_cmd *virt_ras; + + if (!ras_mgr || !ras_mgr->virt_ras_cmd) + return; + + virt_ras = (struct amdgpu_virt_ras_cmd *)ras_mgr->virt_ras_cmd; + virt_ras->remote_uniras_supported = en; +} + +bool amdgpu_virt_ras_remote_uniras_enabled(struct amdgpu_device *adev) +{ + struct amdgpu_ras_mgr *ras_mgr = amdgpu_ras_mgr_get_context(adev); + struct amdgpu_virt_ras_cmd *virt_ras; + + if (amdgpu_in_reset(adev)) + return false; + + if (!ras_mgr || !ras_mgr->virt_ras_cmd) + return false; + + virt_ras = (struct amdgpu_virt_ras_cmd *)ras_mgr->virt_ras_cmd; + + return virt_ras->remote_uniras_supported; +} 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 03c3cf8363ca4..53b0f3f60103e 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 @@ -39,6 +39,7 @@ struct vram_blocks_ecc { }; struct amdgpu_virt_ras_cmd { + bool remote_uniras_supported; struct remote_batch_trace_mgr batch_mgr; struct vram_blocks_ecc blocks_ecc; }; @@ -51,4 +52,6 @@ int amdgpu_virt_ras_handle_cmd(struct ras_core_context *ras_core, struct ras_cmd_ctx *cmd); int amdgpu_virt_ras_pre_reset(struct amdgpu_device *adev); int amdgpu_virt_ras_post_reset(struct amdgpu_device *adev); +void amdgpu_virt_ras_set_remote_uniras(struct amdgpu_device *adev, bool en); +bool amdgpu_virt_ras_remote_uniras_enabled(struct amdgpu_device *adev); #endif -- 2.47.3