#include <linux/dma-buf.h>
 #include "amdgpu_xgmi.h"
 #include <uapi/linux/kfd_ioctl.h>
+#include "amdgpu_ras.h"
+#include "amdgpu_umc.h"
 
 /* Total memory size in system memory and all GPU VRAM. Used to
  * estimate worst case amount of memory to reserve for page tables
 
        return adev->have_atomics_support;
 }
+
+void amdgpu_amdkfd_ras_poison_consumption_handler(struct kgd_dev *kgd)
+{
+       struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
+       struct ras_err_data err_data = {0, 0, 0, NULL};
+
+       /* CPU MCA will handle page retirement if connected_to_cpu is 1 */
+       if (!adev->gmc.xgmi.connected_to_cpu)
+               amdgpu_umc_process_ras_data_cb(adev, &err_data, NULL);
+       else
+               amdgpu_amdkfd_gpu_reset(kgd);
+}
 
                                      uint64_t *mmap_offset);
 int amdgpu_amdkfd_get_tile_config(struct kgd_dev *kgd,
                                struct tile_config *config);
+void amdgpu_amdkfd_ras_poison_consumption_handler(struct kgd_dev *kgd);
 #if IS_ENABLED(CONFIG_HSA_AMD)
 void amdgpu_amdkfd_gpuvm_init_mem_limits(void);
 void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev,
 
                                if (sq_intr_err != SQ_INTERRUPT_ERROR_TYPE_ILLEGAL_INST &&
                                        sq_intr_err != SQ_INTERRUPT_ERROR_TYPE_MEMVIOL) {
                                        kfd_signal_poison_consumed_event(dev, pasid);
-                                       amdgpu_amdkfd_gpu_reset(dev->kgd);
+                                       amdgpu_amdkfd_ras_poison_consumption_handler(dev->kgd);
                                        return;
                                }
                                break;
                        kfd_signal_event_interrupt(pasid, context_id0 & 0xfffffff, 28);
                } else if (source_id == SOC15_INTSRC_SDMA_ECC) {
                        kfd_signal_poison_consumed_event(dev, pasid);
-                       amdgpu_amdkfd_gpu_reset(dev->kgd);
+                       amdgpu_amdkfd_ras_poison_consumption_handler(dev->kgd);
                        return;
                }
        } else if (client_id == SOC15_IH_CLIENTID_VMC ||