From: YiPeng Chai <[email protected]>

Add unified interface to handle ras interrupts, some redundant
interrupt function interfaces will be removed later.

Signed-off-by: YiPeng Chai <[email protected]>
Reviewed-by: Hawking Zhang <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 .../gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mgr.c  | 31 +++++++++++++++++++
 .../gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mgr.h  |  1 +
 2 files changed, 32 insertions(+)

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 4fc29e548ecbe..861b1f2904754 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
@@ -535,6 +535,37 @@ int amdgpu_ras_mgr_handle_controller_interrupt(struct 
amdgpu_device *adev, void
        return ret;
 }
 
+int amdgpu_ras_mgr_dispatch_interrupt(struct amdgpu_device *adev, struct 
ras_ih_info *ih_info)
+{
+       struct amdgpu_ras_mgr *ras_mgr = amdgpu_ras_mgr_get_context(adev);
+       uint64_t seq_no = 0;
+       int ret = 0;
+
+       if (!amdgpu_ras_mgr_is_ready(adev))
+               return -EPERM;
+
+       if (!ih_info)
+               return 0;
+
+       if (ih_info->block == RAS_BLOCK_ID__UMC) {
+               if (ras_mgr->ras_core->poison_supported) {
+                       seq_no = amdgpu_ras_mgr_gen_ras_event_seqno(adev, 
RAS_SEQNO_TYPE_DE);
+                       RAS_DEV_INFO(adev,
+                               "{%llu} RAS poison is created, no user action 
is needed.\n",
+                               seq_no);
+               }
+
+               ret = amdgpu_ras_process_handle_umc_interrupt(adev, ih_info);
+       } else if (ras_mgr->ras_core->poison_supported) {
+               ret = amdgpu_ras_process_handle_consumption_interrupt(adev, 
ih_info);
+       } else {
+               RAS_DEV_WARN(adev,
+                       "No RAS interrupt handler for non-UMC block with poison 
disabled.\n");
+       }
+
+       return ret;
+}
+
 int amdgpu_ras_mgr_handle_consumer_interrupt(struct amdgpu_device *adev, void 
*data)
 {
        if (!amdgpu_ras_mgr_is_ready(adev))
diff --git a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mgr.h 
b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mgr.h
index 23c411c982319..4f44a917d48be 100644
--- a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mgr.h
+++ b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mgr.h
@@ -67,6 +67,7 @@ bool amdgpu_uniras_enabled(struct amdgpu_device *adev);
 int amdgpu_ras_mgr_handle_fatal_interrupt(struct amdgpu_device *adev, void 
*data);
 int amdgpu_ras_mgr_handle_controller_interrupt(struct amdgpu_device *adev, 
void *data);
 int amdgpu_ras_mgr_handle_consumer_interrupt(struct amdgpu_device *adev, void 
*data);
+int amdgpu_ras_mgr_dispatch_interrupt(struct amdgpu_device *adev, struct 
ras_ih_info *ih_info);
 int amdgpu_ras_mgr_update_ras_ecc(struct amdgpu_device *adev);
 int amdgpu_ras_mgr_reset_gpu(struct amdgpu_device *adev, uint32_t flags);
 uint64_t amdgpu_ras_mgr_gen_ras_event_seqno(struct amdgpu_device *adev,
-- 
2.53.0

Reply via email to