From: YiPeng Chai <[email protected]>

Support separate logging of gfx aid and xcd errors.

Signed-off-by: YiPeng Chai <[email protected]>
Reviewed-by: Hawking Zhang <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/ras/core/aca.c | 33 +++++++++++++++---------------
 drivers/gpu/drm/amd/ras/core/aca.h | 13 ++++++------
 2 files changed, 23 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/amd/ras/core/aca.c 
b/drivers/gpu/drm/amd/ras/core/aca.c
index de47137379a16..c8eb1abaccb06 100644
--- a/drivers/gpu/drm/amd/ras/core/aca.c
+++ b/drivers/gpu/drm/amd/ras/core/aca.c
@@ -54,24 +54,24 @@ static void aca_report_ecc_info(struct ras_core_context 
*ras_core,
                                struct aca_bank_ecc *new_ecc)
 {
        struct aca_ecc_count ecc_count = {0};
+       struct aca_ecc_count *xcd_ecc;
+       int xcd_id;
 
        ecc_count.new_ue_count = new_ecc->ue_count;
        ecc_count.new_de_count = new_ecc->de_count;
        ecc_count.new_ce_count = new_ecc->ce_count;
-       if (blk == RAS_BLOCK_ID__GFX) {
-               struct aca_ecc_count *xcd_ecc;
-               int xcd_id;
 
+       ecc_count.total_ue_count = aid_ecc->ecc_err.total_ue_count;
+       ecc_count.total_de_count = aid_ecc->ecc_err.total_de_count;
+       ecc_count.total_ce_count = aid_ecc->ecc_err.total_ce_count;
+
+       if (blk == RAS_BLOCK_ID__GFX) {
                for (xcd_id = 0; xcd_id < aid_ecc->xcd.xcd_num; xcd_id++) {
                        xcd_ecc = &aid_ecc->xcd.xcd[xcd_id].ecc_err;
                        ecc_count.total_ue_count += xcd_ecc->total_ue_count;
                        ecc_count.total_de_count += xcd_ecc->total_de_count;
                        ecc_count.total_ce_count += xcd_ecc->total_ce_count;
                }
-       } else {
-               ecc_count.total_ue_count = aid_ecc->ecc_err.total_ue_count;
-               ecc_count.total_de_count = aid_ecc->ecc_err.total_de_count;
-               ecc_count.total_ce_count = aid_ecc->ecc_err.total_ce_count;
        }
 
        if (ecc_count.new_ue_count) {
@@ -191,7 +191,7 @@ static int aca_check_block_ecc_info(struct ras_core_context 
*ras_core,
                return -ENODATA;
        }
 
-       if ((aca_blk->blk_info->ras_block_id == RAS_BLOCK_ID__GFX) &&
+       if ((aca_blk->blk_info->ras_block_id == RAS_BLOCK_ID__GFX) && 
info->xcd_valid &&
            (info->xcd_id >=
                 
aca_blk->ecc.socket[info->socket_id].aid[info->die_id].xcd.xcd_num)) {
                RAS_DEV_ERR(ras_core->dev,
@@ -221,10 +221,11 @@ static int aca_log_bad_bank(struct ras_core_context 
*ras_core,
 
        mutex_lock(&ras_core->ras_aca.aca_lock);
        aid_ecc = &aca_blk->ecc.socket[info->socket_id].aid[info->die_id];
-       if (aca_blk->blk_info->ras_block_id == RAS_BLOCK_ID__GFX)
+       ecc_err = &aid_ecc->ecc_err;
+
+       if ((aca_blk->blk_info->ras_block_id == RAS_BLOCK_ID__GFX) &&
+               bank_ecc->bank_info.xcd_valid)
                ecc_err = &aid_ecc->xcd.xcd[info->xcd_id].ecc_err;
-       else
-               ecc_err = &aid_ecc->ecc_err;
 
        ecc_err->new_ce_count += bank_ecc->ce_count;
        ecc_err->total_ce_count += bank_ecc->ce_count;
@@ -477,12 +478,12 @@ int ras_aca_clear_block_new_ecc_count(struct 
ras_core_context *ras_core, u32 blk
                                        ecc_err->new_ue_count = 0;
                                        ecc_err->new_de_count = 0;
                                }
-                       } else {
-                               ecc_err = &aid_ecc->ecc_err;
-                               ecc_err->new_ce_count = 0;
-                               ecc_err->new_ue_count = 0;
-                               ecc_err->new_de_count = 0;
                        }
+
+                       ecc_err = &aid_ecc->ecc_err;
+                       ecc_err->new_ce_count = 0;
+                       ecc_err->new_ue_count = 0;
+                       ecc_err->new_de_count = 0;
                }
        }
        mutex_unlock(&ras_core->ras_aca.aca_lock);
diff --git a/drivers/gpu/drm/amd/ras/core/aca.h 
b/drivers/gpu/drm/amd/ras/core/aca.h
index c1a48e713044d..00d4cc1185dff 100644
--- a/drivers/gpu/drm/amd/ras/core/aca.h
+++ b/drivers/gpu/drm/amd/ras/core/aca.h
@@ -73,6 +73,7 @@ struct aca_ecc_info {
        int xcd_id;
        int hwid;
        int mcatype;
+       bool xcd_valid;
        uint64_t status;
        uint64_t ipid;
        uint64_t addr;
@@ -100,13 +101,11 @@ struct aca_xcd_ecc {
 };
 
 struct aca_aid_ecc {
-       union {
-               struct aca_xcd {
-                       struct aca_xcd_ecc xcd[MAX_XCD_NUM_PER_AID];
-                       u32 xcd_num;
-               } xcd;
-               struct aca_ecc_count ecc_err;
-       };
+       struct aca_xcd {
+               struct aca_xcd_ecc xcd[MAX_XCD_NUM_PER_AID];
+               u32 xcd_num;
+       } xcd;
+       struct aca_ecc_count ecc_err;
 };
 
 struct aca_socket_ecc {
-- 
2.55.0

Reply via email to