[Skiboot] [RFC PATCH 1/2] naca: move naca definition from asm to C
Nicholas Piggin
npiggin at gmail.com
Wed Sep 25 11:24:53 AEST 2019
XXX: this does not include the lid load table offset or the hv release
data offset, or the hdat_entry entry points at the end of the structure.
Required for FSP?
---
asm/asm-offsets.c | 2 --
asm/head.S | 50 ----------------------------------------------
hdata/Makefile.inc | 2 +-
hdata/naca.c | 20 +++++++++++++++++++
hdata/naca.h | 37 ++++++++++++++++++++++++++++++++++
hdata/spira.c | 11 ++++------
hdata/spira.h | 2 ++
include/mem-map.h | 2 ++
skiboot.lds.S | 5 +++++
9 files changed, 71 insertions(+), 60 deletions(-)
create mode 100644 hdata/naca.c
create mode 100644 hdata/naca.h
diff --git a/asm/asm-offsets.c b/asm/asm-offsets.c
index e4584059c..61a25cab3 100644
--- a/asm/asm-offsets.c
+++ b/asm/asm-offsets.c
@@ -25,8 +25,6 @@ int main(void);
int main(void)
{
- OFFSET(SPIRA_ACTUAL_SIZE, spira, reserved);
-
OFFSET(CPUTHREAD_PIR, cpu_thread, pir);
OFFSET(CPUTHREAD_SAVE_R1, cpu_thread, save_r1);
OFFSET(CPUTHREAD_STATE, cpu_thread, state);
diff --git a/asm/head.S b/asm/head.S
index 58f9aea97..af691da41 100644
--- a/asm/head.S
+++ b/asm/head.S
@@ -806,56 +806,6 @@ enter_nap:
bne 1b
nap
b .
-/*
- *
- * NACA structure, accessed by the FPS to find the SPIRA
- *
- */
- . = 0x4000
-.global naca
-naca:
- .llong spirah /* 0x0000 : SPIRA-H */
- .llong 0 /* 0x0008 : Reserved */
- .llong 0 /* 0x0010 : Reserved */
- .llong hv_release_data /* 0x0018 : HV release data */
- .llong 0 /* 0x0020 : Reserved */
- .llong 0 /* 0x0028 : Reserved */
- .llong spira /* 0x0030 : SP Interface Root */
- .llong hv_lid_load_table /* 0x0038 : LID load table */
- .llong 0 /* 0x0040 : Reserved */
- .space 68
- .long 0 /* 0x008c : Reserved */
- .space 16
- .long SPIRA_ACTUAL_SIZE /* 0x00a0 : Actual size of SPIRA */
- .space 28
- .llong 0 /* 0x00c0 : resident module loadmap */
- .space 136
- .llong 0 /* 0x0150 : reserved */
- .space 40
- .llong 0 /* 0x0180 : reserved */
- .space 36
- .long 0 /* 0x01ac : control flags */
- .byte 0 /* 0x01b0 : reserved */
- .space 4
- .byte 0 /* 0x01b5 : default state for SW attn */
- .space 1
- .byte 0x01 /* 0x01b7 : PCIA format */
- .llong hdat_entry /* 0x01b8 : Primary thread entry */
- .llong hdat_entry /* 0x01c0 : Secondary thread entry */
- .space 0xe38
-
- .balign 0x10
-hv_release_data:
- .space 58
- .llong 0x666 /* VRM ? */
-
- .balign 0x10
-hv_lid_load_table:
- .long 0x10
- .long 0x10
- .long 0
- .long 0
-
/* The FSP seems to ignore our primary/secondary entry
* points and instead copy that bit down to 0x180 and
diff --git a/hdata/Makefile.inc b/hdata/Makefile.inc
index 6f47314d4..67f809bc1 100644
--- a/hdata/Makefile.inc
+++ b/hdata/Makefile.inc
@@ -1,7 +1,7 @@
# -*-Makefile-*-
SUBDIRS += hdata
-HDATA_OBJS = spira.o paca.o pcia.o hdif.o memory.o fsp.o iohub.o vpd.o slca.o
+HDATA_OBJS = naca.o spira.o paca.o pcia.o hdif.o memory.o fsp.o iohub.o vpd.o slca.o
HDATA_OBJS += cpu-common.o vpd-common.o hostservices.o i2c.o tpmrel.o
DEVSRC_OBJ = hdata/built-in.a
diff --git a/hdata/naca.c b/hdata/naca.c
new file mode 100644
index 000000000..e64f3db17
--- /dev/null
+++ b/hdata/naca.c
@@ -0,0 +1,20 @@
+#include <compiler.h>
+#include <mem-map.h>
+#include <types.h>
+
+#include "naca.h"
+#include "spira.h"
+
+__section(".naca.data") struct naca naca = {
+ .spirah_addr = CPU_TO_BE64(SPIRAH_OFF),
+ .secondary_thread_entry = 0,
+ .primary_lid_load_addr = 0,
+ .hv_release_data_addr = 0,
+ .opal_copy_code_addr = 0,
+ .spira_addr = CPU_TO_BE64(SPIRA_OFF),
+ .lid_table_addr = 0,
+ .spira_size = CPU_TO_BE32(SPIRA_ACTUAL_SIZE),
+ .hv_load_map_addr = 0,
+ .attn_enabled = 0,
+ .pcia_supported = 1,
+};
diff --git a/hdata/naca.h b/hdata/naca.h
new file mode 100644
index 000000000..228aa9894
--- /dev/null
+++ b/hdata/naca.h
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: Apache-2.0
+/* Copyright 2019 IBM Corp. */
+
+#ifndef __NACA_H
+#define __NACA_H
+
+#include <compiler.h>
+#include <inttypes.h>
+#include <types.h>
+
+/*
+ * NACA structure, accessed by the FPS to find the SPIRA
+ */
+struct naca {
+ __be64 spirah_addr;
+ __be64 secondary_thread_entry;
+ __be64 primary_lid_load_addr;
+ __be64 hv_release_data_addr;
+ __be64 opal_copy_code_addr;
+ uint8_t reserved_0x28[0x8];
+ __be64 spira_addr;
+ __be64 lid_table_addr;
+ uint8_t reserved_0x40[0x60];
+ __be32 spira_size;
+ uint8_t reserved_0xa4[0x1c];
+ __be64 hv_load_map_addr;
+ uint8_t reserved_0xc8[0xe4];
+ uint8_t flags[4];
+ uint8_t reserved_0x1b0[0x5];
+ uint8_t attn_enabled;
+ uint8_t reserved_0x1b6[0x1];
+ uint8_t pcia_supported;
+} __packed;
+
+extern struct naca naca;
+
+#endif
diff --git a/hdata/spira.c b/hdata/spira.c
index 40524e87e..846165f02 100644
--- a/hdata/spira.c
+++ b/hdata/spira.c
@@ -3,7 +3,6 @@
#include <inttypes.h>
#include <device.h>
-#include "spira.h"
#include <cpu.h>
#include <vpd.h>
#include <interrupts.h>
@@ -15,6 +14,8 @@
#include "hdata.h"
#include "hostservices.h"
+#include "naca.h"
+#include "spira.h"
/* Processor Initialization structure, contains
* the initial NIA and MSR values for the entry
@@ -1695,15 +1696,11 @@ static void fixup_spira(void)
static void update_spirah_addr(void)
{
#if !defined(TEST)
- extern uint32_t naca;
- uint64_t *spirah_offset = (uint64_t *)&naca;
- uint64_t *spira_offset = (uint64_t *)((u64)(&naca) + 0x30);
-
if (proc_gen < proc_gen_p9)
return;
- *spirah_offset = SPIRAH_OFF;
- *spira_offset = SPIRA_OFF;
+ naca->spirah_addr = CPU_TO_BE64(SPIRAH_OFF);
+ naca->spira_addr = 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
diff --git a/hdata/spira.h b/hdata/spira.h
index eb5d1ea1b..14fbc5f59 100644
--- a/hdata/spira.h
+++ b/hdata/spira.h
@@ -80,6 +80,8 @@ struct spira {
u8 reserved[0x60];
} __packed __align(0x100);
+#define SPIRA_ACTUAL_SIZE (sizeof(struct spira) - 0x60)
+
extern struct spira spira;
/* SPIRA-H signature */
diff --git a/include/mem-map.h b/include/mem-map.h
index 991465190..90529df22 100644
--- a/include/mem-map.h
+++ b/include/mem-map.h
@@ -21,6 +21,8 @@
*/
#define EXCEPTION_VECTORS_END 0x2000
+#define NACA_OFF 0x4000
+
/* The NACA and other stuff in head.S need to be at the start: we
* give it 64k before placing the SPIRA and related data.
*/
diff --git a/skiboot.lds.S b/skiboot.lds.S
index 8890d69aa..3f90c25eb 100644
--- a/skiboot.lds.S
+++ b/skiboot.lds.S
@@ -59,6 +59,11 @@ SECTIONS
KEEP(*(.head))
}
+ . = NACA_OFF;
+ .naca : {
+ KEEP(*(.naca.data))
+ }
+
. = SPIRA_OFF;
.spira : {
KEEP(*(.spira.data))
--
2.23.0
More information about the Skiboot
mailing list