[Skiboot] [PATCH v6 22/29] opal-dump: MPIPL endan conversions

Nicholas Piggin npiggin at gmail.com
Wed Nov 6 23:10:40 AEDT 2019


Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
---
 core/opal-dump.c   | 80 +++++++++++++++++++++++++---------------------
 include/opal-api.h | 14 ++++----
 2 files changed, 51 insertions(+), 43 deletions(-)

diff --git a/core/opal-dump.c b/core/opal-dump.c
index 3bea1f105..f1f85ef51 100644
--- a/core/opal-dump.c
+++ b/core/opal-dump.c
@@ -68,18 +68,18 @@ static int opal_mpipl_max_tags = MAX_OPAL_MPIPL_TAGS;
 
 static int opal_mpipl_add_entry(u8 region, u64 src, u64 dest, u64 size)
 {
-	int i, max_cnt;
+	int i;
+	int mdst_cnt = be16_to_cpu(ntuple_mdst->act_cnt);
+	int mddt_cnt = be16_to_cpu(ntuple_mddt->act_cnt);
 	struct mdst_table *mdst;
 	struct mddt_table *mddt;
 
-	max_cnt = MDST_TABLE_SIZE / sizeof(struct mdst_table);
-	if (ntuple_mdst->act_cnt >= max_cnt) {
+	if (mdst_cnt >= MDST_TABLE_SIZE / sizeof(struct mdst_table)) {
 		prlog(PR_DEBUG, "MDST table is full\n");
 		return OPAL_RESOURCE;
 	}
 
-	max_cnt = MDDT_TABLE_SIZE / sizeof(struct mddt_table);
-	if (ntuple_mdst->act_cnt >= max_cnt) {
+	if (mddt_cnt >= MDDT_TABLE_SIZE / sizeof(struct mddt_table)) {
 		prlog(PR_DEBUG, "MDDT table is full\n");
 		return OPAL_RESOURCE;
 	}
@@ -89,16 +89,16 @@ static int opal_mpipl_add_entry(u8 region, u64 src, u64 dest, u64 size)
 	mddt = (void *)(MDDT_TABLE_BASE);
 
 	/* Check for duplicate entry */
-	for (i = 0; i < ntuple_mdst->act_cnt; i++) {
-		if (mdst->addr == (src | HRMOR_BIT)) {
+	for (i = 0; i < mdst_cnt; i++) {
+		if (be64_to_cpu(mdst->addr) == (src | HRMOR_BIT)) {
 			prlog(PR_DEBUG,
 			      "Duplicate source address : 0x%llx", src);
 			return OPAL_PARAMETER;
 		}
 		mdst++;
 	}
-	for (i = 0; i < ntuple_mddt->act_cnt; i++) {
-		if (mddt->addr == (dest | HRMOR_BIT)) {
+	for (i = 0; i < mddt_cnt; i++) {
+		if (be64_to_cpu(mddt->addr) == (dest | HRMOR_BIT)) {
 			prlog(PR_DEBUG,
 			      "Duplicate destination address : 0x%llx", dest);
 			return OPAL_PARAMETER;
@@ -107,16 +107,16 @@ static int opal_mpipl_add_entry(u8 region, u64 src, u64 dest, u64 size)
 	}
 
 	/* Add OPAL source address to MDST entry */
-	mdst->addr = src | HRMOR_BIT;
+	mdst->addr = cpu_to_be64(src | HRMOR_BIT);
 	mdst->data_region = region;
-	mdst->size = size;
-	ntuple_mdst->act_cnt++;
+	mdst->size = cpu_to_be32(size);
+	ntuple_mdst->act_cnt = cpu_to_be16(mdst_cnt + 1);
 
 	/* Add OPAL destination address to MDDT entry */
-	mddt->addr = dest | HRMOR_BIT;
+	mddt->addr = cpu_to_be64(dest | HRMOR_BIT);
 	mddt->data_region = region;
-	mddt->size = size;
-	ntuple_mddt->act_cnt++;
+	mddt->size = cpu_to_be32(size);
+	ntuple_mddt->act_cnt = cpu_to_be16(mddt_cnt + 1);
 
 	prlog(PR_TRACE, "Added new entry. src : 0x%llx, dest : 0x%llx,"
 	      " size : 0x%llx\n", src, dest, size);
@@ -128,17 +128,19 @@ static int opal_mpipl_remove_entry_mdst(bool remove_all, u8 region, u64 src)
 {
 	bool found = false;
 	int i, j;
+	int mdst_cnt = be16_to_cpu(ntuple_mdst->act_cnt);
 	struct mdst_table *tmp_mdst;
 	struct mdst_table *mdst = (void *)(MDST_TABLE_BASE);
 
-	for (i = 0; i < ntuple_mdst->act_cnt;) {
+	for (i = 0; i < mdst_cnt;) {
 		if (mdst->data_region != region) {
 			mdst++;
 			i++;
 			continue;
 		}
 
-		if (remove_all != true && mdst->addr != (src | HRMOR_BIT)) {
+		if (remove_all != true &&
+				be64_to_cpu(mdst->addr) != (src | HRMOR_BIT)) {
 			mdst++;
 			i++;
 			continue;
@@ -147,14 +149,14 @@ static int opal_mpipl_remove_entry_mdst(bool remove_all, u8 region, u64 src)
 		tmp_mdst = mdst;
 		memset(tmp_mdst, 0, sizeof(struct mdst_table));
 
-		for (j = i; j < ntuple_mdst->act_cnt - 1; j++) {
+		for (j = i; j < mdst_cnt - 1; j++) {
 			memcpy((void *)tmp_mdst,
 			       (void *)(tmp_mdst + 1), sizeof(struct mdst_table));
 			tmp_mdst++;
 			memset(tmp_mdst, 0, sizeof(struct mdst_table));
 		}
 
-		ntuple_mdst->act_cnt--;
+		mdst_cnt--;
 
 		if (remove_all == false) {
 			found = true;
@@ -162,6 +164,8 @@ static int opal_mpipl_remove_entry_mdst(bool remove_all, u8 region, u64 src)
 		}
 	}  /* end - for loop */
 
+	ntuple_mdst->act_cnt = cpu_to_be16((u16)mdst_cnt);
+
 	if (remove_all == false && found == false) {
 		prlog(PR_DEBUG,
 		      "Source address [0x%llx] not found in MDST table\n", src);
@@ -176,17 +180,19 @@ static int opal_mpipl_remove_entry_mddt(bool remove_all, u8 region, u64 dest)
 {
 	bool found = false;
 	int i, j;
+	int mddt_cnt = be16_to_cpu(ntuple_mddt->act_cnt);
 	struct mddt_table *tmp_mddt;
 	struct mddt_table *mddt = (void *)(MDDT_TABLE_BASE);
 
-	for (i = 0; i < ntuple_mddt->act_cnt;) {
+	for (i = 0; i < mddt_cnt;) {
 		if (mddt->data_region != region) {
 			mddt++;
 			i++;
 			continue;
 		}
 
-		if (remove_all != true && mddt->addr != (dest | HRMOR_BIT)) {
+		if (remove_all != true &&
+				be64_to_cpu(mddt->addr) != (dest | HRMOR_BIT)) {
 			mddt++;
 			i++;
 			continue;
@@ -195,14 +201,14 @@ static int opal_mpipl_remove_entry_mddt(bool remove_all, u8 region, u64 dest)
 		tmp_mddt = mddt;
 		memset(tmp_mddt, 0, sizeof(struct mddt_table));
 
-		for (j = i; j < ntuple_mddt->act_cnt - 1; j++) {
+		for (j = i; j < mddt_cnt - 1; j++) {
 			memcpy((void *)tmp_mddt,
 			       (void *)(tmp_mddt + 1), sizeof(struct mddt_table));
 			tmp_mddt++;
 			memset(tmp_mddt, 0, sizeof(struct mddt_table));
 		}
 
-		ntuple_mddt->act_cnt--;
+		mddt_cnt--;
 
 		if (remove_all == false) {
 			found = true;
@@ -210,6 +216,8 @@ static int opal_mpipl_remove_entry_mddt(bool remove_all, u8 region, u64 dest)
 		}
 	}  /* end - for loop */
 
+	ntuple_mddt->act_cnt = cpu_to_be16((u16)mddt_cnt);
+
 	if (remove_all == false && found == false) {
 		prlog(PR_DEBUG,
 		      "Dest address [0x%llx] not found in MDDT table\n", dest);
@@ -258,8 +266,8 @@ static void opal_mpipl_register(void)
 	/* Reserve memory used to capture architected register state */
 	mem_reserve_fw("ibm,firmware-arch-registers",
 		       arch_regs_dest, arch_regs_size);
-	proc_dump->alloc_addr = arch_regs_dest | HRMOR_BIT;
-	proc_dump->alloc_size = arch_regs_size;
+	proc_dump->alloc_addr = cpu_to_be64(arch_regs_dest | HRMOR_BIT);
+	proc_dump->alloc_size = cpu_to_be32(arch_regs_size);
 	prlog(PR_NOTICE, "Architected register dest addr : 0x%llx, "
 	      "size : 0x%llx\n", arch_regs_dest, arch_regs_size);
 }
@@ -339,7 +347,7 @@ static int64_t opal_mpipl_update(enum opal_mpipl_ops ops,
 		/* Clear MDRT table */
 		memset((void *)MDRT_TABLE_BASE, 0, MDRT_TABLE_SIZE);
 		/* Set MDRT count to max allocated count */
-		ntuple_mdrt->act_cnt = MDRT_TABLE_SIZE / sizeof(struct mdrt_table);
+		ntuple_mdrt->act_cnt = cpu_to_be16(MDRT_TABLE_SIZE / sizeof(struct mdrt_table));
 		rc = OPAL_SUCCESS;
 		prlog(PR_NOTICE, "Payload Invalidated MPIPL\n");
 		break;
@@ -426,13 +434,13 @@ static void post_mpipl_arch_regs_data(void)
 
 	/* Fill CPU register details */
 	opal_mpipl_cpu_data->version = OPAL_MPIPL_VERSION;
-	opal_mpipl_cpu_data->cpu_data_version = proc_dump->version;
+	opal_mpipl_cpu_data->cpu_data_version = cpu_to_be32((u32)proc_dump->version);
 	opal_mpipl_cpu_data->cpu_data_size = proc_dump->thread_size;
 	opal_mpipl_cpu_data->region_cnt = cpu_to_be32(1);
 
-	opal_mpipl_cpu_data->region[0].src  = proc_dump->dest_addr & ~(HRMOR_BIT);
-	opal_mpipl_cpu_data->region[0].dest = proc_dump->dest_addr & ~(HRMOR_BIT);
-	opal_mpipl_cpu_data->region[0].size = proc_dump->act_size;
+	opal_mpipl_cpu_data->region[0].src  = proc_dump->dest_addr & ~(cpu_to_be64(HRMOR_BIT));
+	opal_mpipl_cpu_data->region[0].dest = proc_dump->dest_addr & ~(cpu_to_be64(HRMOR_BIT));
+	opal_mpipl_cpu_data->region[0].size = cpu_to_be64(be32_to_cpu(proc_dump->act_size));
 
 	/* Update tag */
 	opal_mpipl_tags[OPAL_MPIPL_TAG_CPU] = (u64)opal_mpipl_cpu_data;
@@ -442,7 +450,7 @@ static void post_mpipl_get_opal_data(void)
 {
 	struct mdrt_table *mdrt = (void *)(MDRT_TABLE_BASE);
 	int i, j = 0, count = 0;
-	u32 mdrt_cnt = ntuple_mdrt->act_cnt;
+	int mdrt_cnt = be16_to_cpu(ntuple_mdrt->act_cnt);
 	struct opal_mpipl_region *region;
 
 	/* Count OPAL dump regions */
@@ -466,8 +474,8 @@ static void post_mpipl_get_opal_data(void)
 
 	/* Fill OPAL dump details */
 	opal_mpipl_data->version = OPAL_MPIPL_VERSION;
-	opal_mpipl_data->crashing_pir = mpipl_metadata->crashing_pir;
-	opal_mpipl_data->region_cnt = count;
+	opal_mpipl_data->crashing_pir = cpu_to_be32(mpipl_metadata->crashing_pir);
+	opal_mpipl_data->region_cnt = cpu_to_be32(count);
 	region = opal_mpipl_data->region;
 
 	mdrt = (void *)(MDRT_TABLE_BASE);
@@ -477,9 +485,9 @@ static void post_mpipl_get_opal_data(void)
 			continue;
 		}
 
-		region[j].src  = mdrt->src_addr  & ~(HRMOR_BIT);
-		region[j].dest = mdrt->dest_addr & ~(HRMOR_BIT);
-		region[j].size = mdrt->size;
+		region[j].src  = mdrt->src_addr  & ~(cpu_to_be64(HRMOR_BIT));
+		region[j].dest = mdrt->dest_addr & ~(cpu_to_be64(HRMOR_BIT));
+		region[j].size = cpu_to_be64(be32_to_cpu(mdrt->size));
 
 		prlog(PR_NOTICE, "OPAL reserved region %d - src : 0x%llx, "
 		      "dest : 0x%llx, size : 0x%llx\n", j, region[j].src,
diff --git a/include/opal-api.h b/include/opal-api.h
index dd74e662c..0ae91cc5f 100644
--- a/include/opal-api.h
+++ b/include/opal-api.h
@@ -1226,9 +1226,9 @@ enum opal_mpipl_tags {
 
 /* Preserved memory details */
 struct opal_mpipl_region {
-	u64	src;
-	u64	dest;
-	u64	size;
+	__be64	src;
+	__be64	dest;
+	__be64	size;
 };
 
 /* Structure version */
@@ -1237,10 +1237,10 @@ struct opal_mpipl_region {
 struct opal_mpipl_fadump {
 	u8	version;
 	u8	reserved[7];
-	u32	crashing_pir;	/* OPAL crashing CPU PIR */
-	u32	cpu_data_version;
-	u32	cpu_data_size;
-	u32	region_cnt;
+	__be32	crashing_pir;	/* OPAL crashing CPU PIR */
+	__be32	cpu_data_version;
+	__be32	cpu_data_size;
+	__be32	region_cnt;
 	struct	opal_mpipl_region region[];
 };
 
-- 
2.23.0



More information about the Skiboot mailing list