From: Gangliang Xie <[email protected]>

add handler for nHT error

v2:
        add EA ill op check

Signed-off-by: Gangliang Xie <[email protected]>
Reviewed-by: Hawking Zhang <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h |  1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v12_1.c  | 44 +++++++++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
index 6722213db8f01..f5fb2e585e8ae 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
@@ -478,6 +478,7 @@ struct amdgpu_gfx {
        struct amdgpu_irq_src           sq_irq;
        struct amdgpu_irq_src           rlc_gc_fed_irq;
        struct amdgpu_irq_src           rlc_poison_irq;
+       struct amdgpu_irq_src           pmr_ea_irq;
        struct sq_work                  sq_work;
 
        /* gfx status */
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v12_1.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v12_1.c
index 82ac39239d789..0c52eb5e8e288 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v12_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v12_1.c
@@ -1499,6 +1499,13 @@ static int gfx_v12_1_sw_init(struct amdgpu_ip_block 
*ip_block)
        if (r)
                return r;
 
+       /* pmr ea error */
+       r = amdgpu_irq_add_id(adev, SOC_V1_0_IH_CLIENTID_GFX,
+                               GFX_12_1_0__SRCID__PMR_EA_ERROR_INTERRUPT,
+                               &adev->gfx.pmr_ea_irq);
+       if (r)
+               return r;
+
        adev->gfx.gfx_current_status = AMDGPU_GFX_NORMAL_MODE;
 
        r = gfx_v12_1_rlc_init(adev);
@@ -4062,6 +4069,36 @@ static int gfx_v12_1_rlc_poison_irq(struct amdgpu_device 
*adev,
        return 0;
 }
 
+static int gfx_v12_1_pmr_ea_irq(struct amdgpu_device *adev,
+                                 struct amdgpu_irq_src *source,
+                                 struct amdgpu_iv_entry *entry)
+{
+       uint32_t ras_blk = RAS_BLOCK_ID__GFX;
+       struct ras_ih_info ih_info = {0};
+       uint32_t ctx_id = entry->src_data[0];
+       int i, num_xcc;
+
+       if (ctx_id & 0x1) {
+               /* request RLC MCA logging here
+                * nHT CTO status clearing is handled by RLC firmware
+                */
+
+               ih_info.block = ras_blk;
+               ih_info.reset = AMDGPU_RAS_GPU_RESET_MODE2_RESET;
+               amdgpu_ras_mgr_dispatch_interrupt(adev, &ih_info);
+       }
+
+       if (ctx_id & 0x2) {
+               num_xcc = NUM_XCC(adev->gfx.xcc_mask);
+               /* ea_ill_op_status will be cleared in a future update */
+               for (i = 0; i < num_xcc; i++)
+                       dev_warn(adev->dev,
+                               "an EA illegal-op is detected and need to clear 
ea_ill_op_status\n");
+       }
+
+       return 0;
+}
+
 static void gfx_v12_1_emit_mem_sync(struct amdgpu_ring *ring)
 {
        const unsigned int gcr_cntl =
@@ -4190,6 +4227,10 @@ static const struct amdgpu_irq_src_funcs 
gfx_v12_1_rlc_poison_irq_funcs = {
        .process = gfx_v12_1_rlc_poison_irq,
 };
 
+static const struct amdgpu_irq_src_funcs gfx_v12_1_pmr_ea_irq_funcs = {
+       .process = gfx_v12_1_pmr_ea_irq,
+};
+
 static void gfx_v12_1_set_irq_funcs(struct amdgpu_device *adev)
 {
        adev->gfx.eop_irq.num_types = AMDGPU_CP_IRQ_LAST;
@@ -4203,6 +4244,9 @@ static void gfx_v12_1_set_irq_funcs(struct amdgpu_device 
*adev)
 
        adev->gfx.rlc_poison_irq.num_types = 1;
        adev->gfx.rlc_poison_irq.funcs = &gfx_v12_1_rlc_poison_irq_funcs;
+
+       adev->gfx.pmr_ea_irq.num_types = 1;
+       adev->gfx.pmr_ea_irq.funcs = &gfx_v12_1_pmr_ea_irq_funcs;
 }
 
 static void gfx_v12_1_set_imu_funcs(struct amdgpu_device *adev)
-- 
2.55.0

Reply via email to