[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(&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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.