Outside of UMC a bank with the poison bit set describes the consumption
of an error that was already reported, not a new uncorrectable one.
Injecting an uncorrectable error while a workload is running therefore
buries the real bank under a dump of GFX poison banks collected from
every other device of the hive.

Signed-off-by: Xiang Liu <[email protected]>
---
 drivers/gpu/drm/amd/ras/core/aca.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/amd/ras/core/aca.c 
b/drivers/gpu/drm/amd/ras/core/aca.c
index 0f5e57965ac8..f316f49c24bd 100644
--- a/drivers/gpu/drm/amd/ras/core/aca.c
+++ b/drivers/gpu/drm/amd/ras/core/aca.c
@@ -403,6 +403,13 @@ static int aca_banks_update(struct ras_core_context 
*ras_core,
 
                memset(&bank_ecc, 0, sizeof(bank_ecc));
                aca_blk = aca_get_bank_aca_block(ras_core, &bank);
+
+               /* Outside of UMC a poison bank is a consumption, not a new 
error. */
+               if (ecc_type == RAS_ERR_TYPE__UE &&
+                   ACA_REG_STATUS_POISON(bank.regs[ACA_REG_IDX__STATUS]) &&
+                   (!aca_blk || aca_blk->blk_info->ras_block_id != 
RAS_BLOCK_ID__UMC))
+                       continue;
+
                if (aca_blk)
                        ret = aca_parse_bank(ras_core, aca_blk, &bank, 
&bank_ecc);
 
-- 
2.34.1

Reply via email to