From 03f110b5ea02696adc3d8c4e6c4671c9db8e17e8 Mon Sep 17 00:00:00 2001 From: YiPeng Chai Date: Mon, 13 Apr 2026 16:42:07 +0800 Subject: [PATCH] drm/amd/ras: Supports recording data source timestamps to EEPROM Supports recording data source timestamps to EEPROM. Signed-off-by: YiPeng Chai Reviewed-by: Hawking Zhang Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/ras/core/aca.c | 5 +++++ drivers/gpu/drm/amd/ras/core/aca.h | 1 + drivers/gpu/drm/amd/ras/core/ras.h | 1 + drivers/gpu/drm/amd/ras/core/ras_umc_v12_0.c | 6 ++++++ 4 files changed, 13 insertions(+) diff --git a/drivers/gpu/drm/amd/ras/core/aca.c b/drivers/gpu/drm/amd/ras/core/aca.c index da06c840cfc0..4258ffb490a6 100644 --- a/drivers/gpu/drm/amd/ras/core/aca.c +++ b/drivers/gpu/drm/amd/ras/core/aca.c @@ -132,6 +132,9 @@ static void aca_log_bank_data(struct ras_core_context *ras_core, struct aca_bank_reg *bank, struct aca_bank_ecc *bank_ecc, struct ras_log_batch_tag *batch) { + if (batch && bank->timestamp) + batch->timestamp = bank->timestamp; + if (bank_ecc->ue_count) ras_log_ring_add_log_event(ras_core, RAS_LOG_EVENT_UE, bank->regs, batch); else if (bank_ecc->de_count) @@ -245,6 +248,7 @@ static int aca_log_bad_bank(struct ras_core_context *ras_core, ras_ecc.nps = ras_core_get_curr_nps_mode(ras_core); ras_ecc.status = bank_ecc->bank_info.status; ras_ecc.seq_no = bank->seq_no; + ras_ecc.timestamp = bank->timestamp; } } else { ras_ecc.nps = ras_core_get_curr_nps_mode(ras_core); @@ -252,6 +256,7 @@ static int aca_log_bad_bank(struct ras_core_context *ras_core, ras_ecc.ipid = bank_ecc->bank_info.ipid; ras_ecc.status = bank_ecc->bank_info.status; ras_ecc.seq_no = bank->seq_no; + ras_ecc.timestamp = bank->timestamp; } if (!ret) { diff --git a/drivers/gpu/drm/amd/ras/core/aca.h b/drivers/gpu/drm/amd/ras/core/aca.h index 00d4cc1185df..a8aac196605a 100644 --- a/drivers/gpu/drm/amd/ras/core/aca.h +++ b/drivers/gpu/drm/amd/ras/core/aca.h @@ -53,6 +53,7 @@ struct ras_core_context; struct aca_block; struct aca_bank_reg { + uint64_t timestamp; u32 ecc_type; u64 seq_no; u64 regs[ACA_REG_MAX_COUNT]; diff --git a/drivers/gpu/drm/amd/ras/core/ras.h b/drivers/gpu/drm/amd/ras/core/ras.h index 386315cba504..0a8224d1a795 100644 --- a/drivers/gpu/drm/amd/ras/core/ras.h +++ b/drivers/gpu/drm/amd/ras/core/ras.h @@ -247,6 +247,7 @@ struct ras_ecc_count { }; struct ras_bank_ecc { + uint64_t timestamp; uint32_t nps; uint64_t seq_no; uint64_t status; diff --git a/drivers/gpu/drm/amd/ras/core/ras_umc_v12_0.c b/drivers/gpu/drm/amd/ras/core/ras_umc_v12_0.c index 4bf993325a3f..8a5c7ef6bdf2 100644 --- a/drivers/gpu/drm/amd/ras/core/ras_umc_v12_0.c +++ b/drivers/gpu/drm/amd/ras/core/ras_umc_v12_0.c @@ -398,6 +398,12 @@ static int umc_v12_0_bank_to_eeprom_record(struct ras_core_context *ras_core, if (ras_fw_eeprom_supported(ras_core) && bank->ts) record->ts = bank->ts; + /* If the bank being converted already has a timestamp, + * then use the bank's timestamp. + */ + if (bank->timestamp) + record->ts = bank->timestamp; + lookup_bad_pages_in_a_row(ras_core, record, bank->nps, NULL, 0, bank->seq_no, true);