[PATCH 025/109] drm/amd/ras: Support poison consumption handling for A + A sriov guest
Alex Deucher <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
From: YiPeng Chai <[email protected]> Support poison consumption handling for A + A sriov guest. Signed-off-by: YiPeng Chai <[email protected]> Reviewed-by: Hawking Zhang <[email protected]> Signed-off-by: Alex Deucher <[email protected]> --- drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c | 21 +++++++++++-------- .../drm/amd/ras/ras_mgr/amdgpu_ras_process.c | 8 ++++++- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c index a98a6cfd4fba8..986f307630f61 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c @@ -230,6 +230,13 @@ int amdgpu_umc_pasid_poison_handler(struct amdgpu_device *adev, pasid_notify pasid_fn, void *data, uint32_t reset) { int ret = AMDGPU_RAS_SUCCESS; + struct ras_ih_info ih_info = { + .block = block, + .pasid = pasid, + .reset = reset, + .pasid_fn = pasid_fn, + .data = data, + }; if (adev->gmc.xgmi.connected_to_cpu || adev->gmc.is_app_apu) { @@ -264,17 +271,13 @@ int amdgpu_umc_pasid_poison_handler(struct amdgpu_device *adev, amdgpu_ras_error_data_fini(&err_data); } else { - struct ras_ih_info ih_info = {0}; - - ih_info.block = block; - ih_info.pasid = pasid; - ih_info.reset = reset; - ih_info.pasid_fn = pasid_fn; - ih_info.data = data; - amdgpu_ras_mgr_handle_consumer_interrupt(adev, &ih_info); + amdgpu_ras_mgr_dispatch_interrupt(adev, &ih_info); } } else { - if (adev->virt.ops && adev->virt.ops->ras_poison_handler) + if (amdgpu_uniras_enabled(adev) && + (amdgpu_ip_version(adev, GC_HWIP, 0) >= IP_VERSION(12, 1, 0))) + amdgpu_ras_mgr_dispatch_interrupt(adev, &ih_info); + else if (adev->virt.ops && adev->virt.ops->ras_poison_handler) adev->virt.ops->ras_poison_handler(adev, block); else dev_warn(adev->dev, diff --git a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_process.c b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_process.c index 285d81a85a99d..39452a9006155 100644 --- a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_process.c +++ b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_process.c @@ -99,11 +99,17 @@ int amdgpu_ras_process_handle_consumption_interrupt(struct amdgpu_device *adev, struct ras_ih_info *ih_info = (struct ras_ih_info *)data; struct ras_event_req req; uint64_t seqno; + uint32_t gfx_ip_version; if (!ih_info) return -EINVAL; - if (amdgpu_sriov_vf(adev)) { + if (ras_core_get_ip_version(ras_mgr->ras_core, + RAS_UNIT_ID_GFX, &gfx_ip_version)) + return -EPERM; + + if (amdgpu_sriov_vf(adev) && + gfx_ip_version < IP_VERSION(12, 1, 0)) { if (adev->virt.ops && adev->virt.ops->ras_poison_handler) adev->virt.ops->ras_poison_handler(adev, ih_info->block); else -- 2.55.0