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(&section_type, &trace_arr[i].boot_err_ctx.section_type,
-                      min(sizeof(section_type), 
sizeof(trace_arr[i].boot_err_ctx.section_type)));
+               memcpy(&section_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

Reply via email to