From: YiPeng Chai <[email protected]>

Add umc ecc error handling for gmc v12_1.

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 | 11 +++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h |  3 +++
 drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c  | 10 +++++++---
 drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c  |  7 +++++++
 4 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
index 3f0b0e9af4f34..1be722ba6c9ee 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
@@ -398,6 +398,17 @@ int amdgpu_umc_process_ecc_irq(struct amdgpu_device *adev,
        return 0;
 }
 
+int amdgpu_umc_uniras_process_ecc_irq(struct amdgpu_device *adev,
+                       struct amdgpu_irq_src *source,
+                       struct amdgpu_iv_entry *entry)
+{
+       struct ras_ih_info ih_info = {0};
+
+       ih_info.block = RAS_BLOCK_ID__UMC;
+       amdgpu_ras_mgr_dispatch_interrupt(adev, &ih_info);
+       return 0;
+}
+
 int amdgpu_umc_fill_error_record(struct ras_err_data *err_data,
                uint64_t err_addr,
                uint64_t retired_page,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
index 28dff750c47e3..8494a55ebf76c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
@@ -161,6 +161,9 @@ int amdgpu_umc_pasid_poison_handler(struct amdgpu_device 
*adev,
 int amdgpu_umc_process_ecc_irq(struct amdgpu_device *adev,
                struct amdgpu_irq_src *source,
                struct amdgpu_iv_entry *entry);
+int amdgpu_umc_uniras_process_ecc_irq(struct amdgpu_device *adev,
+               struct amdgpu_irq_src *source,
+               struct amdgpu_iv_entry *entry);
 int amdgpu_umc_fill_error_record(struct ras_err_data *err_data,
                uint64_t err_addr,
                uint64_t retired_page,
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c
index ac39011d1268c..f1079bd8cf001 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c
@@ -893,11 +893,15 @@ static int gmc_v12_0_sw_init(struct amdgpu_ip_block 
*ip_block)
        if (r)
                return r;
 
-       if ((amdgpu_ip_version(adev, GC_HWIP, 0) != IP_VERSION(12, 1, 0)) &&
-           !amdgpu_sriov_vf(adev)) {
+       if (!amdgpu_sriov_vf(adev)) {
                /* interrupt sent to DF. */
-               r = amdgpu_irq_add_id(adev, SOC21_IH_CLIENTID_DF, 0,
+               if (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(12, 0, 0))
+                       r = amdgpu_irq_add_id(adev, SOC21_IH_CLIENTID_DF, 0,
+                                     &adev->gmc.ecc_irq);
+               else
+                       r = amdgpu_irq_add_id(adev, SOC_V1_0_IH_CLIENTID_DF, 0,
                                      &adev->gmc.ecc_irq);
+
                if (r)
                        return r;
        }
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c
index 5e3102d072c4c..38c366b9a88bd 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c
@@ -624,10 +624,17 @@ static const struct amdgpu_irq_src_funcs 
gmc_v12_1_irq_funcs = {
        .process = gmc_v12_1_process_interrupt,
 };
 
+static const struct amdgpu_irq_src_funcs gmc_v12_1_ecc_funcs = {
+       .process = amdgpu_umc_uniras_process_ecc_irq,
+};
+
 void gmc_v12_1_set_irq_funcs(struct amdgpu_device *adev)
 {
        adev->gmc.vm_fault.num_types = 1;
        adev->gmc.vm_fault.funcs = &gmc_v12_1_irq_funcs;
+
+       adev->gmc.ecc_irq.num_types = 1;
+       adev->gmc.ecc_irq.funcs = &gmc_v12_1_ecc_funcs;
 }
 
 void gmc_v12_1_init_vram_info(struct amdgpu_device *adev)
-- 
2.53.0

Reply via email to