From 1fc7c4c4e67a058c379167a5386f469eb067e63b Mon Sep 17 00:00:00 2001 From: Xiang Liu Date: Fri, 21 Aug 2026 10:07:04 +0800 Subject: [PATCH] drm/amd/ras: keep the established socket id layout on older parts Reporting the RAS capability mask through the ras "features" sysfs node changed the layout that node has always used, so the existing consumer misreads it on the parts it already supports. XGMI error injection then targets the wrong device and the RAS TA rejects it with RAS_TA_STATUS__ERROR_PCS_STATE_HANG. Keep the established layout on parts released before the new one, and stop assigning the multi bit adev->ras_enabled to the single bit en field. Fixes: 375f15db1eb1 ("drm/amdgpu: Support obtaining ras capabilities") Signed-off-by: Xiang Liu Reviewed-by: Hawking Zhang Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c index 83d3d2c9116b..4b19db024a04 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c @@ -5047,16 +5047,23 @@ uint64_t amdgpu_uniras_get_ras_caps(struct amdgpu_device *adev) struct ras_cmd_get_ras_cap_req req = {0}; struct ras_cmd_get_ras_cap_rsp rsp = {0}; union ras_feature feature = {0}; + u32 socket_id = 0; if (amdgpu_ras_mgr_handle_ras_cmd(adev, RAS_CMD__GET_RAS_CAP, &req, sizeof(struct ras_cmd_get_ras_cap_req), &rsp, sizeof(struct ras_cmd_get_ras_cap_rsp))) return 0; - feature.block_mask = rsp.ras_block_mask; - feature.en = adev->ras_enabled; if (adev->smuio.funcs && adev->smuio.funcs->get_socket_id) - feature.tag = adev->smuio.funcs->get_socket_id(adev); + socket_id = adev->smuio.funcs->get_socket_id(adev); + + if (amdgpu_ip_version(adev, GC_HWIP, 0) < IP_VERSION(12, 1, 0)) + return AMDGPU_RAS_GET_FEATURES(lower_32_bits(rsp.ras_block_mask)) | + (socket_id << AMDGPU_RAS_FEATURES_SOCKETID_SHIFT); + + feature.block_mask = rsp.ras_block_mask; + feature.en = !!adev->ras_enabled; + feature.tag = socket_id; return feature.value; }