Skip to content

Commit

Permalink
spira: fix endian conversions in spira data structures
Browse files Browse the repository at this point in the history
Labels can't be used for static initialisers that require endian
conversion. Use constants for these.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Reviewed-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
  • Loading branch information
npiggin authored and oohal committed Dec 16, 2019
1 parent c47b2ff commit 518e554
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 22 deletions.
59 changes: 37 additions & 22 deletions hdata/spira.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
},
};

Expand Down Expand Up @@ -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)),
Expand Down Expand Up @@ -1695,8 +1710,8 @@ static void update_spirah_addr(void)
if (proc_gen < proc_gen_p9)
return;

*spirah_offset = SPIRAH_OFF;
*spira_offset = SPIRA_OFF;
*spirah_offset = CPU_TO_BE64(SPIRAH_OFF);
*spira_offset = CPU_TO_BE64(SPIRA_OFF);
spirah.ntuples.hs_data_area.addr = CPU_TO_BE64(SPIRA_HEAP_BASE - SKIBOOT_BASE);
spirah.ntuples.mdump_res.addr = CPU_TO_BE64(MDRT_TABLE_BASE - SKIBOOT_BASE);
#endif
Expand Down
3 changes: 3 additions & 0 deletions hdata/test/hdata_to_dt.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ unsigned long tb_hz = 512000000;

#define SPR_PVR 0x11f /* RO: Processor version register */

#define MSR_SF 0x8000000000000000ULL
#define MSR_HV 0x1000000000000000ULL

#define __CPU_H
struct cpu_thread {
uint32_t pir;
Expand Down

0 comments on commit 518e554

Please sign in to comment.