From 222c87e75c747e4fb100a08910c5f870c473449d Mon Sep 17 00:00:00 2001
From: Jerry Wang <Jerry.Wang4@arm.com>
Date: Mon, 16 Dec 2024 15:08:18 +0000
Subject: [PATCH] fix(rdv3): add console name to checksum calculation on RD-V3

The name field of console_info structure was missed in
checksum calculation. This is corrected by adding a new
helper checksum_calc() which computes the checksum in a
field agnostic manner.

Change-Id: I98d35d53e1faccf1221e8eddb122558ae359a2d5
Signed-off-by: Jerry Wang <Jerry.Wang4@arm.com>
---
 .../neoverse_rd/platform/rdv3/rdv3_common.c   | 31 ++++++++++++++-----
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/plat/arm/board/neoverse_rd/platform/rdv3/rdv3_common.c b/plat/arm/board/neoverse_rd/platform/rdv3/rdv3_common.c
index 10fe666be..dba83abef 100644
--- a/plat/arm/board/neoverse_rd/platform/rdv3/rdv3_common.c
+++ b/plat/arm/board/neoverse_rd/platform/rdv3/rdv3_common.c
@@ -44,6 +44,23 @@ size_t plat_rmmd_get_el3_rmm_shared_mem(uintptr_t *shared)
 	return (size_t)RMM_SHARED_SIZE;
 }
 
+/*
+ * Calculate checksum of 64-bit words @buffer with @size length
+ */
+static uint64_t checksum_calc(uint64_t *buffer, size_t size)
+{
+	uint64_t sum = 0UL;
+
+	assert(((uintptr_t)buffer & (sizeof(uint64_t) - 1UL)) == 0UL);
+	assert((size & (sizeof(uint64_t) - 1UL)) == 0UL);
+
+	for (unsigned long i = 0UL; i < (size / sizeof(uint64_t)); i++) {
+		sum += buffer[i];
+	}
+
+	return sum;
+}
+
 int plat_rmmd_load_manifest(struct rmm_manifest *manifest)
 {
 	uint64_t checksum, num_banks, num_consoles;
@@ -138,8 +155,8 @@ int plat_rmmd_load_manifest(struct rmm_manifest *manifest)
 	bank_ptr[1].size = ARM_DRAM2_SIZE;
 
 	/* Update checksum */
-	checksum += bank_ptr[0].base + bank_ptr[0].size + bank_ptr[1].base +
-		bank_ptr[1].size;
+	checksum += checksum_calc((uint64_t *)bank_ptr,
+		sizeof(struct ns_dram_bank) * num_banks);
 
 	/* Checksum must be 0 */
 	manifest->plat_dram.checksum = ~checksum + 1UL;
@@ -148,20 +165,20 @@ int plat_rmmd_load_manifest(struct rmm_manifest *manifest)
 	checksum = num_consoles + (uint64_t)console_ptr;
 
 	/* Zero out the console info struct */
-	memset((void *)console_ptr, '\0',
+	(void)memset((void *)console_ptr, '\0',
 		sizeof(struct console_info) * num_consoles);
 
-	console_ptr[0].map_pages = 1;
+	console_ptr[0].map_pages = 1UL;
 	console_ptr[0].base = NRD_CSS_RMM_CONSOLE_BASE;
 	console_ptr[0].clk_in_hz = NRD_CSS_RMM_CONSOLE_CLK_IN_HZ;
 	console_ptr[0].baud_rate = NRD_CSS_RMM_CONSOLE_BAUD;
 
-	strlcpy(console_ptr[0].name, NRD_CSS_RMM_CONSOLE_NAME,
+	(void)strlcpy(console_ptr[0].name, NRD_CSS_RMM_CONSOLE_NAME,
 		sizeof(console_ptr[0].name));
 
 	/* Update checksum */
-	checksum += console_ptr[0].base + console_ptr[0].map_pages +
-		console_ptr[0].clk_in_hz + console_ptr[0].baud_rate;
+	checksum += checksum_calc((uint64_t *)console_ptr,
+		sizeof(struct console_info) * num_consoles);
 
 	/* Checksum must be 0 */
 	manifest->plat_console.checksum = ~checksum + 1UL;