One eeprom record may not map to unit number of bad pages,
Correct the relevant update logic accordingly

Signed-off-by: Ce Sun <[email protected]>
---
 drivers/gpu/drm/amd/ras/rascore/ras_umc.c       | 5 +++--
 drivers/gpu/drm/amd/ras/rascore/ras_umc.h       | 2 ++
 drivers/gpu/drm/amd/ras/rascore/ras_umc_v12_0.c | 3 ++-
 3 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/ras/rascore/ras_umc.c 
b/drivers/gpu/drm/amd/ras/rascore/ras_umc.c
index cff6245d8add..b03f72735878 100644
--- a/drivers/gpu/drm/amd/ras/rascore/ras_umc.c
+++ b/drivers/gpu/drm/amd/ras/rascore/ras_umc.c
@@ -525,7 +525,7 @@ static int ras_umc_save_bad_pages(struct ras_core_context 
*ras_core)
        struct ras_umc *ras_umc = &ras_core->ras_umc;
        struct eeprom_store_record *data = &ras_umc->umc_err_data.rom_data;
        uint32_t eeprom_record_num;
-       int save_count;
+       int save_count,map_save_count;
        int ret = 0;
 
        if (!data->bps)
@@ -537,6 +537,7 @@ static int ras_umc_save_bad_pages(struct ras_core_context 
*ras_core)
                eeprom_record_num = ras_eeprom_get_record_count(ras_core);
        mutex_lock(&ras_umc->umc_lock);
        save_count = data->count - eeprom_record_num;
+       map_save_count = save_count * ras_core->ras_umc.retire_unit;
        /* only new entries are saved */
        if (save_count > 0) {
                if (ras_fw_eeprom_supported(ras_core))
@@ -551,7 +552,7 @@ static int ras_umc_save_bad_pages(struct ras_core_context 
*ras_core)
                        goto exit;
                }
 
-               RAS_DEV_INFO(ras_core->dev, "Saved %d pages to EEPROM 
table.\n", save_count);
+               RAS_DEV_INFO(ras_core->dev, "Saved %d pages to EEPROM 
table.\n", map_save_count);
        }
 
 exit:
diff --git a/drivers/gpu/drm/amd/ras/rascore/ras_umc.h 
b/drivers/gpu/drm/amd/ras/rascore/ras_umc.h
index 4a693865a9be..48131bbca00e 100644
--- a/drivers/gpu/drm/amd/ras/rascore/ras_umc.h
+++ b/drivers/gpu/drm/amd/ras/rascore/ras_umc.h
@@ -144,6 +144,8 @@ struct ras_umc {
        u32 pending_ecc_count;
        /* number of entries dropped because pending_ecc_list was full */
        u32 pending_ecc_dropped;
+       /* how many pages are retired */
+       u32 retire_unit;
 };
 
 /*
diff --git a/drivers/gpu/drm/amd/ras/rascore/ras_umc_v12_0.c 
b/drivers/gpu/drm/amd/ras/rascore/ras_umc_v12_0.c
index a272e0d80cdb..8861cb0f01f4 100644
--- a/drivers/gpu/drm/amd/ras/rascore/ras_umc_v12_0.c
+++ b/drivers/gpu/drm/amd/ras/rascore/ras_umc_v12_0.c
@@ -110,6 +110,7 @@ static void __get_nps_pa_flip_bits(struct ras_core_context 
*ras_core,
                        "Unknown HBM type, set RAS retire flip bits to the 
value in NPS1 mode.\n");
                break;
        }
+       ras_core->ras_umc.retire_unit = 0x1 << flip_bits->bit_num;
 }
 
 static uint64_t  convert_nps_pa_to_row_pa(struct ras_core_context *ras_core,
@@ -166,7 +167,7 @@ static int lookup_bad_pages_in_a_row(struct 
ras_core_context *ras_core,
 
        idx = 0;
        row = 0;
-       retire_unit = 0x1 << flip_bits.bit_num;
+       retire_unit = ras_core->ras_umc.retire_unit;
        /* loop for all possibilities of retire bits */
        for (column = 0; column < retire_unit; column++) {
                soc_pa = row_pa;
-- 
2.34.1

Reply via email to