Skip to content

Commit

Permalink
naca: move naca definition from asm to C
Browse files Browse the repository at this point in the history
This results in the same layout and location of the naca and hv data
structures.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
  • Loading branch information
npiggin authored and oohal committed Dec 16, 2019
1 parent 8d49ff5 commit 0d12f0c
Show file tree
Hide file tree
Showing 10 changed files with 99 additions and 61 deletions.
2 changes: 0 additions & 2 deletions asm/asm-offsets.c
Expand Up @@ -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);
Expand Down
50 changes: 0 additions & 50 deletions asm/head.S
Expand Up @@ -810,56 +810,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


/*
*
Expand Down
2 changes: 1 addition & 1 deletion hdata/Makefile.inc
@@ -1,7 +1,7 @@
# -*-Makefile-*-

SUBDIRS += hdata
HDATA_OBJS = spira.o pcia.o hdif.o memory.o fsp.o iohub.o vpd.o slca.o
HDATA_OBJS = naca.o spira.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

Expand Down
2 changes: 2 additions & 0 deletions hdata/hdata.h
Expand Up @@ -5,6 +5,8 @@
#define __HDATA_H

#include <processor.h>
#include "hdif.h"
#include "spira.h"

struct dt_node;

Expand Down
26 changes: 26 additions & 0 deletions hdata/naca.c
@@ -0,0 +1,26 @@
#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),
.hv_release_data_addr = CPU_TO_BE64(NACA_OFF + offsetof(struct naca, hv_release_data)),
.spira_addr = CPU_TO_BE64(SPIRA_OFF),
.lid_table_addr = CPU_TO_BE64(NACA_OFF + offsetof(struct naca, hv_lid_load_table)),
.spira_size = CPU_TO_BE32(SPIRA_ACTUAL_SIZE),
.hv_load_map_addr = 0,
.attn_enabled = 0,
.pcia_supported = 1,
.__primary_thread_entry = CPU_TO_BE64(0x180),
.__secondary_thread_entry = CPU_TO_BE64(0x180),
.hv_release_data = {
.vrm = CPU_TO_BE64(0x666), /* ? */
},
.hv_lid_load_table = {
.w0 = CPU_TO_BE32(0x10),
.w1 = CPU_TO_BE32(0x10),
},
};
54 changes: 54 additions & 0 deletions hdata/naca.h
@@ -0,0 +1,54 @@
// 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>

struct hv_release_data {
uint8_t reserved_0x0[58];
__be64 vrm;
} __packed __attribute__((aligned(0x10)));

struct hv_lid_load_table {
__be32 w0;
__be32 w1;
__be32 w2;
__be32 w3;
} __packed __attribute__((aligned(0x10)));

/*
* NACA structure, accessed by the FSP to find the SPIRA
*/
struct naca {
__be64 spirah_addr; /* 0x0000 */
uint8_t reserved_0x8[0x10];
__be64 hv_release_data_addr; /* 0x0018 */
uint8_t reserved_0x20[0x10];
__be64 spira_addr; /* 0x0030 */
__be64 lid_table_addr; /* 0x0038 */
uint8_t reserved_0x40[0x60];
__be32 spira_size; /* 0x00a0 */
uint8_t reserved_0xa4[0x1c];
__be64 hv_load_map_addr; /* 0x00c0 */
uint8_t reserved_0xc8[0xe4];
uint8_t flags[4]; /* 0x01ac */
uint8_t reserved_0x1b0[0x5];
uint8_t attn_enabled; /* 0x01b5 */
uint8_t reserved_0x1b6[0x1];
uint8_t pcia_supported; /* 0x01b7 */
__be64 __primary_thread_entry; /* 0x01b8 */
__be64 __secondary_thread_entry; /* 0x01c0 */
uint8_t reserved_0x1d0[0xe38];

/* Not part of the naca but it's convenient to put them here */
struct hv_release_data hv_release_data;
struct hv_lid_load_table hv_lid_load_table;
} __packed __attribute((aligned(0x10)));

extern struct naca naca;

#endif
11 changes: 4 additions & 7 deletions hdata/spira.c
Expand Up @@ -3,7 +3,6 @@

#include <inttypes.h>
#include <device.h>
#include "spira.h"
#include <cpu.h>
#include <vpd.h>
#include <interrupts.h>
Expand All @@ -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
Expand Down Expand Up @@ -1703,15 +1704,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 = CPU_TO_BE64(SPIRAH_OFF);
*spira_offset = CPU_TO_BE64(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
Expand Down
6 changes: 5 additions & 1 deletion hdata/spira.h
Expand Up @@ -66,6 +66,8 @@ struct spira_ntuples {
struct spira_ntuple proc_dump_area; /* 0x400 */
};

#define SPIRA_RESERVED_BYTES 0x60

struct spira {
struct HDIF_common_hdr hdr;
struct HDIF_idata_ptr ntuples_ptr;
Expand All @@ -77,9 +79,11 @@ struct spira {
*
* According to FSP engineers, this is an okay thing to do.
*/
u8 reserved[0x60];
u8 reserved[SPIRA_RESERVED_BYTES];
} __packed __align(0x100);

#define SPIRA_ACTUAL_SIZE (sizeof(struct spira) - SPIRA_RESERVED_BYTES)

extern struct spira spira;

/* SPIRA-H signature */
Expand Down
2 changes: 2 additions & 0 deletions include/mem-map.h
Expand Up @@ -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.
*/
Expand Down
5 changes: 5 additions & 0 deletions skiboot.lds.S
Expand Up @@ -59,6 +59,11 @@ SECTIONS
KEEP(*(.head))
}

. = NACA_OFF;
.naca : {
KEEP(*(.naca.data))
}

. = SPIRA_OFF;
.spira : {
KEEP(*(.spira.data))
Expand Down

0 comments on commit 0d12f0c

Please sign in to comment.