From 7765daaec56f7d3633e0443641cec63331ffca56 Mon Sep 17 00:00:00 2001 From: YiPeng Chai Date: Wed, 22 Jul 2026 18:09:46 +0800 Subject: [PATCH] drm/amd/ras: fix and improve bad page count calculation Fix an issue where the saved bad page count is always zero. The cur_nps_valid_page_num field in the record already tracks the available bad page count, so use it directly to calculate the correct saved bad page number. Signed-off-by: YiPeng Chai Reviewed-by: Tao Zhou Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/ras/core/ras_umc.c | 32 +++++++++++++------------- drivers/gpu/drm/amd/ras/core/ras_umc.h | 6 ----- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/drivers/gpu/drm/amd/ras/core/ras_umc.c b/drivers/gpu/drm/amd/ras/core/ras_umc.c index e5b6389e4384..b3f30da19a78 100644 --- a/drivers/gpu/drm/amd/ras/core/ras_umc.c +++ b/drivers/gpu/drm/amd/ras/core/ras_umc.c @@ -684,14 +684,6 @@ static int ras_umc_update_eeprom_ram_data(struct ras_core_context *ras_core, return 0; } -static void ras_umc_update_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.ram_data; - - data->bad_page_num_old = data->bad_page_num; -} - void ras_umc_report_badpage_info(struct ras_core_context *ras_core) { struct ras_umc *ras_umc = &ras_core->ras_umc; @@ -798,15 +790,24 @@ int ras_umc_load_bad_pages(struct ras_core_context *ras_core) if (ret) RAS_DEV_ERR(ras_core->dev, "Failed to load EEPROM table records! ret:%d\n", ret); - else { + else ret = ras_umc_add_bad_pages(ras_core, bps, ras_num_recs, &c); - ras_umc_update_bad_pages(ras_core); - } kfree(bps); return ret; } +static int ras_umc_count_valid_pages(struct ras_core_context *ras_core, + struct eeprom_umc_record *records, const u32 nr_records) +{ + int count = 0, i; + + for (i = 0; i < nr_records; i++) + count += records[i].cur_nps_valid_page_num; + + return count; +} + /* * write error record array to eeprom, the function should be * protected by recovery_lock @@ -816,8 +817,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; - struct eeprom_store_record *ram_data = &ras_umc->umc_err_data.ram_data; - int eeprom_record_num, logical_count = 0; + int eeprom_record_num; int save_count; int ret = -ENODATA; @@ -834,7 +834,6 @@ static int ras_umc_save_bad_pages(struct ras_core_context *ras_core) mutex_lock(&ras_umc->umc_lock); save_count = data->count - eeprom_record_num; - logical_count = ram_data->bad_page_num - ram_data->bad_page_num_old; /* only new entries are saved */ if (save_count > 0) { ret = ras_eeprom_mgr_append_records(ras_core, @@ -846,8 +845,9 @@ static int ras_umc_save_bad_pages(struct ras_core_context *ras_core) goto exit; } - ras_umc_update_bad_pages(ras_core); - RAS_DEV_INFO(ras_core->dev, "Saved %d records to EEPROM table.\n", logical_count); + RAS_DEV_INFO(ras_core->dev, "Saved %d pages to EEPROM table.\n", + ras_umc_count_valid_pages(ras_core, + &data->bps[eeprom_record_num], save_count)); } exit: diff --git a/drivers/gpu/drm/amd/ras/core/ras_umc.h b/drivers/gpu/drm/amd/ras/core/ras_umc.h index 5a6f5f69f347..b014e531bec5 100644 --- a/drivers/gpu/drm/amd/ras/core/ras_umc.h +++ b/drivers/gpu/drm/amd/ras/core/ras_umc.h @@ -152,12 +152,6 @@ struct eeprom_store_record { int count; /* the space can place new entries */ int space_left; - /* logical bad page number */ - int bad_page_num; - /* the bad page number is ras_num_recs or - * ras_num_recs * retire_unit - */ - int bad_page_num_old; uint64_t umc_channel_bitmap; };