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

Reply via email to