[PATCH 013/109] drm/amd/ras: Improve function interface to record different types of data
Alex Deucher <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
From: YiPeng Chai <[email protected]> Improve function interface to record different types of data. 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 | 11 +++-- drivers/gpu/drm/amd/ras/core/cmd.c | 5 ++- drivers/gpu/drm/amd/ras/core/log_ring.c | 17 +++----- drivers/gpu/drm/amd/ras/core/log_ring.h | 13 +++--- drivers/gpu/drm/amd/ras/core/ras_cper.c | 43 +++++++++++-------- .../gpu/drm/amd/ras/ras_mgr/amdgpu_ras_sys.c | 2 +- 6 files changed, 53 insertions(+), 38 deletions(-) diff --git a/drivers/gpu/drm/amd/ras/core/aca.c b/drivers/gpu/drm/amd/ras/core/aca.c index 4258ffb490a60..67269062f072b 100644 --- a/drivers/gpu/drm/amd/ras/core/aca.c +++ b/drivers/gpu/drm/amd/ras/core/aca.c @@ -132,15 +132,20 @@ 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) { + enum ras_log_event event; + 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); + event = RAS_LOG_EVENT_UE; else if (bank_ecc->de_count) - ras_log_ring_add_log_event(ras_core, RAS_LOG_EVENT_DE, bank->regs, batch); + event = RAS_LOG_EVENT_DE; else - ras_log_ring_add_log_event(ras_core, RAS_LOG_EVENT_CE, bank->regs, batch); + event = RAS_LOG_EVENT_CE; + + ras_log_ring_add_log_event(ras_core, + event, bank->regs, sizeof(bank->regs), batch); } static int aca_get_bank_count(struct ras_core_context *ras_core, diff --git a/drivers/gpu/drm/amd/ras/core/cmd.c b/drivers/gpu/drm/amd/ras/core/cmd.c index 35c53f47e4500..98767a94d267b 100644 --- a/drivers/gpu/drm/amd/ras/core/cmd.c +++ b/drivers/gpu/drm/amd/ras/core/cmd.c @@ -331,8 +331,9 @@ static int ras_cmd_get_batch_trace_records(struct ras_core_context *ras_core, record->seqno = trace_arry[j].seqno; record->timestamp = trace_arry[j].timestamp; record->event = trace_arry[j].event; - memcpy(&record->aca_reg, - &trace_arry[j].aca_reg, sizeof(trace_arry[j].aca_reg)); + memcpy(&record->body.aca_reg, + &trace_arry[j].body.aca_reg, + sizeof(trace_arry[j].body.aca_reg)); } } else { count = 0; diff --git a/drivers/gpu/drm/amd/ras/core/log_ring.c b/drivers/gpu/drm/amd/ras/core/log_ring.c index 73f075b0f1fdd..b57749bc63d0f 100644 --- a/drivers/gpu/drm/amd/ras/core/log_ring.c +++ b/drivers/gpu/drm/amd/ras/core/log_ring.c @@ -223,7 +223,8 @@ void ras_log_ring_destroy_batch_tag(struct ras_core_context *ras_core, } void ras_log_ring_add_log_event(struct ras_core_context *ras_core, - enum ras_log_event event, void *data, struct ras_log_batch_tag *batch_tag) + enum ras_log_event event, + void *data, uint32_t size, struct ras_log_batch_tag *batch_tag) { struct ras_log_ring *log_ring = &ras_core->ras_log_ring; struct device_system_info dev_info = {0}; @@ -251,19 +252,15 @@ void ras_log_ring_add_log_event(struct ras_core_context *ras_core, batch_tag ? batch_tag->timestamp : ras_core_get_utc_second_timestamp(ras_core); log->event = event; - if (data) { - if (event == RAS_LOG_EVENT_BOOT) - memcpy(&log->boot_err_ctx, data, sizeof(log->boot_err_ctx)); - else - memcpy(&log->aca_reg, data, sizeof(log->aca_reg)); - } + if (data && size && size <= sizeof(log->body)) + memcpy(&log->body, data, size); if (event == RAS_LOG_EVENT_RMA) { - memcpy(&log->aca_reg, ras_rma_aca_reg, sizeof(log->aca_reg)); + memcpy(&log->body.aca_reg, ras_rma_aca_reg, sizeof(log->body.aca_reg)); ras_core_get_device_system_info(ras_core, &dev_info); socket_id = dev_info.socket_id; - log->aca_reg.regs[ACA_REG_IDX__IPID] |= ((socket_id / 4) & 0x01); - log->aca_reg.regs[ACA_REG_IDX__IPID] |= (((socket_id % 4) & 0x3) << 44); + log->body.aca_reg.regs[ACA_REG_IDX__IPID] |= ((socket_id / 4) & 0x01); + log->body.aca_reg.regs[ACA_REG_IDX__IPID] |= (((socket_id % 4) & 0x3) << 44); } ras_log_ring_add_data(ras_core, log, batch_tag); diff --git a/drivers/gpu/drm/amd/ras/core/log_ring.h b/drivers/gpu/drm/amd/ras/core/log_ring.h index 428ad48d08fee..2eaeccfb8965f 100644 --- a/drivers/gpu/drm/amd/ras/core/log_ring.h +++ b/drivers/gpu/drm/amd/ras/core/log_ring.h @@ -55,14 +55,16 @@ struct ras_boot_err_ctx { u64 regs[CPER_OAM_MAX_COUNT]; }; +union ras_log_body { + struct ras_aca_reg aca_reg; + struct ras_boot_err_ctx boot_err_ctx; +}; + struct ras_log_info { uint64_t seqno; uint64_t timestamp; enum ras_log_event event; - union { - struct ras_aca_reg aca_reg; - struct ras_boot_err_ctx boot_err_ctx; - }; + union ras_log_body body; }; struct ras_log_batch_tag { @@ -95,7 +97,8 @@ struct ras_log_batch_tag *ras_log_ring_create_batch_tag(struct ras_core_context void ras_log_ring_destroy_batch_tag(struct ras_core_context *ras_core, struct ras_log_batch_tag *tag); void ras_log_ring_add_log_event(struct ras_core_context *ras_core, - enum ras_log_event event, void *data, struct ras_log_batch_tag *tag); + enum ras_log_event event, + void *data, uint32_t size, struct ras_log_batch_tag *batch_tag); int ras_log_ring_get_batch_records(struct ras_core_context *ras_core, uint64_t batch_idx, struct ras_log_info *log_arr, uint32_t arr_num); diff --git a/drivers/gpu/drm/amd/ras/core/ras_cper.c b/drivers/gpu/drm/amd/ras/core/ras_cper.c index 6d7c1cf6a8f4e..82fd277c3552f 100644 --- a/drivers/gpu/drm/amd/ras/core/ras_cper.c +++ b/drivers/gpu/drm/amd/ras/core/ras_cper.c @@ -137,10 +137,10 @@ static int fill_section_fatal(struct ras_core_context *ras_core, fatal->data.reg_ctx_type = CPER_CTX_TYPE__CRASH; fatal->data.reg_arr_size = sizeof(fatal->data.reg); - fatal->data.reg.status = trace->aca_reg.regs[RAS_CPER_ACA_REG_STATUS]; - fatal->data.reg.addr = trace->aca_reg.regs[RAS_CPER_ACA_REG_ADDR]; - fatal->data.reg.ipid = trace->aca_reg.regs[RAS_CPER_ACA_REG_IPID]; - fatal->data.reg.synd = trace->aca_reg.regs[RAS_CPER_ACA_REG_SYND]; + fatal->data.reg.status = trace->body.aca_reg.regs[RAS_CPER_ACA_REG_STATUS]; + fatal->data.reg.addr = trace->body.aca_reg.regs[RAS_CPER_ACA_REG_ADDR]; + fatal->data.reg.ipid = trace->body.aca_reg.regs[RAS_CPER_ACA_REG_IPID]; + fatal->data.reg.synd = trace->body.aca_reg.regs[RAS_CPER_ACA_REG_SYND]; return 0; } @@ -163,13 +163,20 @@ static int fill_section_runtime(struct ras_core_context *ras_core, runtime->reg.reg_ctx_type = CPER_CTX_TYPE__CRASH; runtime->reg.reg_arr_size = sizeof(runtime->reg.reg_dump); - runtime->reg.reg_dump[RAS_CPER_ACA_REG_CTL] = trace->aca_reg.regs[ACA_REG_IDX__CTL]; - runtime->reg.reg_dump[RAS_CPER_ACA_REG_STATUS] = trace->aca_reg.regs[ACA_REG_IDX__STATUS]; - runtime->reg.reg_dump[RAS_CPER_ACA_REG_ADDR] = trace->aca_reg.regs[ACA_REG_IDX__ADDR]; - runtime->reg.reg_dump[RAS_CPER_ACA_REG_MISC0] = trace->aca_reg.regs[ACA_REG_IDX__MISC0]; - runtime->reg.reg_dump[RAS_CPER_ACA_REG_CONFIG] = trace->aca_reg.regs[ACA_REG_IDX__CONFG]; - runtime->reg.reg_dump[RAS_CPER_ACA_REG_IPID] = trace->aca_reg.regs[ACA_REG_IDX__IPID]; - runtime->reg.reg_dump[RAS_CPER_ACA_REG_SYND] = trace->aca_reg.regs[ACA_REG_IDX__SYND]; + runtime->reg.reg_dump[RAS_CPER_ACA_REG_CTL] = + trace->body.aca_reg.regs[ACA_REG_IDX__CTL]; + runtime->reg.reg_dump[RAS_CPER_ACA_REG_STATUS] = + trace->body.aca_reg.regs[ACA_REG_IDX__STATUS]; + runtime->reg.reg_dump[RAS_CPER_ACA_REG_ADDR] = + trace->body.aca_reg.regs[ACA_REG_IDX__ADDR]; + runtime->reg.reg_dump[RAS_CPER_ACA_REG_MISC0] = + trace->body.aca_reg.regs[ACA_REG_IDX__MISC0]; + runtime->reg.reg_dump[RAS_CPER_ACA_REG_CONFIG] = + trace->body.aca_reg.regs[ACA_REG_IDX__CONFG]; + runtime->reg.reg_dump[RAS_CPER_ACA_REG_IPID] = + trace->body.aca_reg.regs[ACA_REG_IDX__IPID]; + runtime->reg.reg_dump[RAS_CPER_ACA_REG_SYND] = + trace->body.aca_reg.regs[ACA_REG_IDX__SYND]; return 0; } @@ -177,12 +184,13 @@ static int fill_section_runtime(struct ras_core_context *ras_core, static int fill_section_boot(struct ras_core_context *ras_core, struct cper_section_boot *boot, struct ras_log_info *log) { - struct ras_boot_err_ctx *ctx = &log->boot_err_ctx; + struct ras_boot_err_ctx *ctx = &log->body.boot_err_ctx; struct crashdump_boot *data = &boot->data; data->reg_ctx_type = ctx->reg_ctx_type; data->reg_arr_size = ctx->reg_arr_size; - memcpy(data->msg, ctx->regs, min(boot->data.reg_arr_size, sizeof(data->msg))); + memcpy(data->msg, ctx->regs, + min(boot->data.reg_arr_size, sizeof(data->msg))); return 0; } @@ -249,11 +257,12 @@ static int cper_generate_boot_record(struct ras_core_context *ras_core, u8 *buff return -ENOMEM; for (i = 0; i < arr_num; i++) { - u32 severity = trace_arr[i].boot_err_ctx.error_severity; + u32 severity = trace_arr[i].body.boot_err_ctx.error_severity; struct ras_cper_guid section_type; - memcpy(§ion_type, &trace_arr[i].boot_err_ctx.section_type, - min(sizeof(section_type), sizeof(trace_arr[i].boot_err_ctx.section_type))); + memcpy(§ion_type, &trace_arr[i].body.boot_err_ctx.section_type, + min(sizeof(section_type), + sizeof(trace_arr[i].body.boot_err_ctx.section_type))); fill_section_hdr(ras_core, &record->hdr, RAS_CPER_TYPE_BOOT, severity, &trace_arr[i]); @@ -351,7 +360,7 @@ int ras_cper_generate_cper(struct ras_core_context *ras_core, struct aca_bank_reg bank = { 0 }; /* MCE is encoded as 1 record each */ - memcpy(&bank.regs, &trace_list[0].aca_reg.regs, sizeof(bank.regs)); + memcpy(&bank.regs, &trace_list[0].body.aca_reg.regs, sizeof(bank.regs)); trace_list[0].event = cper_mce_parse_err_type(ras_core, &bank); } diff --git a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_sys.c b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_sys.c index b9ecb7d966b41..a45fb22f7462f 100644 --- a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_sys.c +++ b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_sys.c @@ -136,7 +136,7 @@ static int amdgpu_ras_sys_event_notifier(struct ras_core_context *ras_core, ret = amdgpu_dpm_send_hbm_bad_channel_flag(ras_core->dev, *(uint32_t *)data); break; case RAS_EVENT_ID__DEVICE_RMA: - ras_log_ring_add_log_event(ras_core, RAS_LOG_EVENT_RMA, NULL, NULL); + ras_log_ring_add_log_event(ras_core, RAS_LOG_EVENT_RMA, NULL, 0, NULL); if (!ras_fw_eeprom_supported(ras_core)) ret = amdgpu_dpm_send_rma_reason(ras_core->dev); break; -- 2.55.0