[Skiboot] [PATCH v7 16/22] fadump: Send OPAL relocated base address to SBE

Michael Neuling mikey at neuling.org
Thu May 9 13:51:08 AEST 2019


On Sat, 2019-04-13 at 14:45 +0530, Vasant Hegde wrote:
> OPAL relocates itself during boot. During memory preserving IPL hostboot needs
> to access relocated OPAL base address to get MDST, MDDT tables. Hence send
> relocated base address to SBE via 'stash MPIPL config' chip-op. During next
> IPL SBE will send stashed data to hostboot... so that hostboot can access
> these data.
> 
> Signed-off-by: Vasant Hegde <hegdevasant at linux.vnet.ibm.com>
> ---
>  core/opal-dump.c |  4 ++++
>  hw/sbe-p9.c      | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
>  include/sbe-p9.h |  8 +++++++-
>  3 files changed, 59 insertions(+), 1 deletion(-)
> 
> diff --git a/core/opal-dump.c b/core/opal-dump.c
> index 6400cbdb1..8e042083c 100644
> --- a/core/opal-dump.c
> +++ b/core/opal-dump.c
> @@ -23,6 +23,7 @@
>  #include <opal.h>
>  #include <opal-dump.h>
>  #include <opal-internal.h>
> +#include <sbe-p9.h>
>  #include <skiboot.h>
>  
>  #include <ccan/endian/endian.h>
> @@ -363,6 +364,9 @@ void opal_dump_init(void)
>  
>  	adjust_opal_dump_size(dump_node);
>  
> +	/* Send OPAL relocated base address to SBE */
> +	p9_sbe_send_relocated_base(SKIBOOT_BASE);
> +
>  	/* OPAL interface */
>  	opal_register(OPAL_FADUMP_MANAGE, opal_fadump_manage, 3);
>  }
> diff --git a/hw/sbe-p9.c b/hw/sbe-p9.c
> index c28dbb9d6..ba7691f50 100644
> --- a/hw/sbe-p9.c
> +++ b/hw/sbe-p9.c
> @@ -861,6 +861,54 @@ bool p9_sbe_timer_ok(void)
>  	return sbe_has_timer;
>  }
>  
> +static void p9_sbe_stash_chipop_resp(struct p9_sbe_msg *msg)
> +{
> +	int rc = p9_sbe_get_primary_rc(msg->resp);
> +	struct p9_sbe *sbe = (void *)msg->user_data;
> +
> +	if (rc == SBE_STATUS_PRI_SUCCESS) {
> +		prlog(PR_DEBUG, "Sent stash MPIPL config [chip id =0x%x]\n",
> +		      sbe->chip_id);
> +	} else {
> +		prlog(PR_ERR, "Failed to send stash MPIPL config "
> +		      "[chip id = 0x%x, rc = %d]\n", sbe->chip_id, rc);
> +	}
> +
> +	p9_sbe_freemsg(msg);
> +}
> +
> +static void __p9_sbe_send_relocated_base(struct p9_sbe *sbe, u64 reloc_base)
> +{
> +	u8 key = SBE_STASH_KEY_SKIBOOT_BASE;
> +	u16 cmd = SBE_CMD_STASH_MPIPL_CONFIG;
> +	u16 flag = SBE_CMD_CTRL_RESP_REQ;
> +	struct p9_sbe_msg *msg;
> +
> +	msg = p9_sbe_mkmsg(cmd, flag, key, reloc_base, 0);
> +	if (!msg) {
> +		prlog(PR_DEBUG, "Message allocation failed\n");

PR_ERR



> +		return;
> +	}
> +
> +	msg->user_data = (void *)sbe;
> +	if (p9_sbe_queue_msg(sbe->chip_id, msg, p9_sbe_stash_chipop_resp)) {
> +		prlog(PR_ERR, "Failed to queue stash MPIPL config message\n");
> +	}
> +}
> +
> +/* Send relocated skiboot base address to all SBE */
> +void p9_sbe_send_relocated_base(uint64_t reloc_base)

Just call this "all" and the __ version "one" like we do with smp_call_function
in the kernel.

> +{
> +	struct proc_chip *chip;
> +
> +	for_each_chip(chip) {
> +		if (chip->sbe == NULL)
> +			continue;
> +
> +		__p9_sbe_send_relocated_base(chip->sbe, reloc_base);
> +	}
> +}
> +
>  void p9_sbe_init(void)
>  {
>  	struct dt_node *xn;
> diff --git a/include/sbe-p9.h b/include/sbe-p9.h
> index 4b839d8ba..ac1ec219b 100644
> --- a/include/sbe-p9.h
> +++ b/include/sbe-p9.h
> @@ -1,4 +1,4 @@
> -/* Copyright 2017-2018 IBM Corp.
> +/* Copyright 2017-2019 IBM Corp.
>   *
>   * Licensed under the Apache License, Version 2.0 (the "License");
>   * you may not use this file except in compliance with the License.
> @@ -159,6 +159,9 @@
>  #define CONTROL_TIMER_START		0x0001
>  #define CONTROL_TIMER_STOP		0x0002
>  
> +/* Stash MPIPL config */
> +#define SBE_STASH_KEY_SKIBOOT_BASE	0x03
> +
>  /* SBE message state */
>  enum p9_sbe_msg_state {
>  	sbe_msg_unused = 0,	/* Free */
> @@ -237,4 +240,7 @@ extern bool p9_sbe_timer_ok(void);
>  /* Update SBE timer expiry */
>  extern void p9_sbe_update_timer_expiry(uint64_t new_target);
>  
> +/* Send skiboot relocated base address to SBE */
> +extern void p9_sbe_send_relocated_base(uint64_t reloc_base);
> +
>  #endif	/* __SBE_P9_H */



More information about the Skiboot mailing list