diff mbox series

[v6,07/29] spira: fix endian conversions in spira data structures

Message ID 20191106121047.14389-8-npiggin@gmail.com
State Changes Requested
Headers show
Series little endian skiboot | expand

Checks

Context Check Description
snowpatch_ozlabs/apply_patch success Successfully applied on branch master (d75e82dbfbb9443efeb3f9a5921ac23605aab469)
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot fail Test snowpatch/job/snowpatch-skiboot on branch master
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot-dco success Signed-off-by present

Commit Message

Nicholas Piggin Nov. 6, 2019, 12:10 p.m. UTC
Labels can't be used for static initialisers that require endian
conversion. Use constants for these.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 hdata/spira.c | 55 ++++++++++++++++++++++++++++++++-------------------
 1 file changed, 35 insertions(+), 20 deletions(-)

Comments

Vasant Hegde Nov. 8, 2019, 9:07 a.m. UTC | #1
On 11/6/19 5:40 PM, Nicholas Piggin wrote:
> Labels can't be used for static initialisers that require endian
> conversion. Use constants for these.
> 
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>

This breaks `make check` (hdat tests).

Can you please fix udpate update_spirah_addr() as well?


-Vasant
diff mbox series

Patch

diff --git a/hdata/spira.c b/hdata/spira.c
index 5e73b7d44..f1ce25dff 100644
--- a/hdata/spira.c
+++ b/hdata/spira.c
@@ -33,41 +33,61 @@  __section(".procin.data") struct proc_init_data proc_init_data = {
 	.regs_ptr = HDIF_IDATA_PTR(offsetof(struct proc_init_data, regs), 0x10),
 	.regs = {
 		.nia = CPU_TO_BE64(0x180),
-		.msr = CPU_TO_BE64(0x9000000000000000ULL), /* SF | HV */
+		.msr = CPU_TO_BE64(MSR_SF | MSR_HV),
 	},
 };
 
+extern struct cpu_ctl_init_data cpu_ctl_init_data;
 extern struct sp_addr_table cpu_ctl_spat_area;
-__section(".cpuctrl.data") struct sp_addr_table cpu_ctl_spat_area;
-__section(".cpuctrl.data") struct sp_attn_area cpu_ctl_sp_attn_area1;
-__section(".cpuctrl.data") struct sp_attn_area cpu_ctl_sp_attn_area2;
+extern struct sp_attn_area cpu_ctl_sp_attn_area1;
+extern struct sp_attn_area cpu_ctl_sp_attn_area2;
 extern struct hsr_data_area cpu_ctl_hsr_area;
+
+/*
+ * cpuctrl.data begins at CPU_CTL_OFF	- cpu_ctl_init_data is located there.
+ * + sizeof(struct cpu_ctl_init_data)	- cpu_ctl_spat_area
+ * + sizeof(struct sp_addr_table)	- cpu_ctl_sp_attn_area1
+ * + sizeof(struct sp_attn_area)	- cpu_ctl_sp_attn_area2
+ * + sizeof(struct sp_attn_area)	- cpu_ctl_hsr_area
+ *
+ * Can't use CPU_TO_BE64 directly on the labels as a constant initialiser.
+ *
+ * CPU_CTL_INIT_DATA_OFF is offset from 0, the others are addressed from the
+ * relocated address (+SKIBOOT_BASE)
+ */
+#define CPU_CTL_INIT_DATA_OFF		(CPU_CTL_OFF)
+#define CPU_CTL_SPAT_AREA_OFF		(CPU_CTL_INIT_DATA_OFF + sizeof(struct cpu_ctl_init_data) + SKIBOOT_BASE)
+#define CPU_CTL_SP_ATTN_AREA1_OFF	(CPU_CTL_SPAT_AREA_OFF + sizeof(struct sp_addr_table))
+#define CPU_CTL_SP_ATTN_AREA2_OFF	(CPU_CTL_SP_ATTN_AREA1_OFF + sizeof(struct sp_attn_area))
+#define CPU_CTL_HSR_AREA_OFF		(CPU_CTL_SP_ATTN_AREA2_OFF + sizeof(struct sp_attn_area))
+
 __section(".cpuctrl.data") struct hsr_data_area cpu_ctl_hsr_area;
+__section(".cpuctrl.data") struct sp_attn_area cpu_ctl_sp_attn_area2;
+__section(".cpuctrl.data") struct sp_attn_area cpu_ctl_sp_attn_area1;
+__section(".cpuctrl.data") struct sp_addr_table cpu_ctl_spat_area;
 
-extern struct cpu_ctl_init_data cpu_ctl_init_data;
 __section(".cpuctrl.data") struct cpu_ctl_init_data cpu_ctl_init_data = {
 	.hdr = HDIF_SIMPLE_HDR(CPU_CTL_HDIF_SIG, 2, struct cpu_ctl_init_data),
-	.cpu_ctl = HDIF_IDATA_PTR(offsetof(struct cpu_ctl_init_data, cpu_ctl_lt), sizeof(struct cpu_ctl_legacy_table)),
-#if !defined(TEST)
+	.cpu_ctl = HDIF_IDATA_PTR(offsetof(struct cpu_ctl_init_data, cpu_ctl_lt),
+					sizeof(struct cpu_ctl_legacy_table)),
 	.cpu_ctl_lt = {
 		.spat = {
-			.addr = CPU_TO_BE64((unsigned long)&(cpu_ctl_spat_area) + SKIBOOT_BASE),
+			.addr = CPU_TO_BE64(CPU_CTL_SPAT_AREA_OFF),
 			.size = CPU_TO_BE64(sizeof(struct sp_addr_table)),
 		},
 		.sp_attn_area1 = {
-			.addr = CPU_TO_BE64((unsigned long)&(cpu_ctl_sp_attn_area1) + SKIBOOT_BASE),
+			.addr = CPU_TO_BE64(CPU_CTL_SP_ATTN_AREA1_OFF),
 			.size = CPU_TO_BE64(sizeof(struct sp_attn_area)),
 		},
 		.sp_attn_area2 = {
-			.addr = CPU_TO_BE64((unsigned long)&(cpu_ctl_sp_attn_area2) + SKIBOOT_BASE),
+			.addr = CPU_TO_BE64(CPU_CTL_SP_ATTN_AREA2_OFF),
 			.size = CPU_TO_BE64(sizeof(struct sp_attn_area)),
 		},
 		.hsr_area = {
-			.addr = CPU_TO_BE64((unsigned long)&(cpu_ctl_hsr_area) + SKIBOOT_BASE),
+			.addr = CPU_TO_BE64(CPU_CTL_HSR_AREA_OFF),
 			.size = CPU_TO_BE64(sizeof(struct hsr_data_area)),
 		},
 	},
-#endif
 };
 
 /* Populate MDST table
@@ -131,15 +151,12 @@  __section(".spira.data") struct spira spira = {
 			.alloc_len	=
 				CPU_TO_BE32(sizeof(init_mdst_table)),
 		},
-#if !defined(TEST)
 		.cpu_ctrl = {
-			.addr		= CPU_TO_BE64((unsigned long)&cpu_ctl_init_data),
+			.addr		= CPU_TO_BE64(CPU_CTL_INIT_DATA_OFF),
 			.alloc_cnt	= CPU_TO_BE16(1),
 			.act_cnt	= CPU_TO_BE16(1),
-			.alloc_len	=
-					CPU_TO_BE32(sizeof(cpu_ctl_init_data)),
+			.alloc_len	= CPU_TO_BE32(sizeof(cpu_ctl_init_data)),
 		},
-#endif
 	},
 };
 
@@ -170,15 +187,13 @@  __section(".spirah.data") struct spirah spirah = {
 			.alloc_len
 			= CPU_TO_BE32(sizeof(struct proc_init_data)),
 		},
-#if !defined(TEST)
 		.cpu_ctrl = {
-			.addr		= CPU_TO_BE64((unsigned long)&cpu_ctl_init_data),
+			.addr		= CPU_TO_BE64(CPU_CTL_INIT_DATA_OFF),
 			.alloc_cnt	= CPU_TO_BE16(1),
 			.act_cnt	= CPU_TO_BE16(1),
 			.alloc_len	=
 					CPU_TO_BE32(sizeof(cpu_ctl_init_data)),
 		},
-#endif
 		.mdump_src = {
 			.addr		= CPU_TO_BE64(MDST_TABLE_OFF),
 			.alloc_cnt	= CPU_TO_BE16(MDST_TABLE_SIZE / sizeof(struct mdst_table)),