[Skiboot] [PATCH 1/2] Revert "Revert "astbmc: Try IPMI HIOMAP for P8""

Andrew Jeffery andrew at aj.id.au
Mon Feb 18 17:27:32 AEDT 2019


On Mon, 18 Feb 2019, at 16:56, Lei YU wrote:
> This reverts commit 23470f10d0b1e120dc2d2f1606444fb6fc07b506.

NAK - it might work for Palmetto with OpenBMC, but it broke a bunch of
AMI machines. I need to sort out what I did wrong.

> ---
>  hw/ast-bmc/ast-io.c       |  7 +++++-
>  include/ast.h             |  3 ++-
>  platforms/astbmc/common.c | 36 +++++++++++++++++++++++++------
>  platforms/astbmc/pnor.c   | 54 ++++++++++++++++++++++++++---------------------
>  4 files changed, 67 insertions(+), 33 deletions(-)
> 
> diff --git a/hw/ast-bmc/ast-io.c b/hw/ast-bmc/ast-io.c
> index 38ca86c..11cc084 100644
> --- a/hw/ast-bmc/ast-io.c
> +++ b/hw/ast-bmc/ast-io.c
> @@ -360,7 +360,12 @@ bool ast_io_init(void)
>  	return ast_io_is_rw();
>  }
>  
> -bool ast_lpc_fw_needs_hiomap(void)
> +bool ast_lpc_fw_ipmi_hiomap(void)
> +{
> +	return platform.bmc->sw->ipmi_oem_hiomap_cmd != 0;
> +}
> +
> +bool ast_lpc_fw_mbox_hiomap(void)
>  {
>  	struct dt_node *n;
>  
> diff --git a/include/ast.h b/include/ast.h
> index c6684fc..5c46cf2 100644
> --- a/include/ast.h
> +++ b/include/ast.h
> @@ -86,7 +86,8 @@ bool ast_sio_init(void);
>  bool ast_io_init(void);
>  bool ast_io_is_rw(void);
>  bool ast_lpc_fw_maps_flash(void);
> -bool ast_lpc_fw_needs_hiomap(void);
> +bool ast_lpc_fw_ipmi_hiomap(void);
> +bool ast_lpc_fw_mbox_hiomap(void);
>  bool ast_scratch_reg_is_mbox(void);
>  
>  /* UART configuration */
> diff --git a/platforms/astbmc/common.c b/platforms/astbmc/common.c
> index 210b3ec..bc0e58f 100644
> --- a/platforms/astbmc/common.c
> +++ b/platforms/astbmc/common.c
> @@ -208,8 +208,15 @@ static void astbmc_fixup_dt_mbox(struct dt_node *lpc)
>  	struct dt_node *mbox;
>  	char namebuf[32];
>  
> -	/* All P9 machines use mbox. P8 machines can indicate they support
> -	 * it using the scratch register */
> +	if (!lpc)
> +		return;
> +
> +	/*
> +	 * P9 machines always use hiomap, either by ipmi or mbox. P8 machines
> +	 * can indicate they support mbox using the scratch register, or ipmi
> +	 * by configuring the hiomap ipmi command. If neither are configured
> +	 * for P8 then skiboot will drive the flash controller directly.
> +	 */
>  	if (proc_gen != proc_gen_p9 && !ast_scratch_reg_is_mbox())
>  		return;
>  
> @@ -310,7 +317,7 @@ static void astbmc_fixup_bmc_sensors(void)
>  	}
>  }
>  
> -static void astbmc_fixup_dt(void)
> +static struct dt_node *dt_find_primary_lpc(void)
>  {
>  	struct dt_node *n, *primary_lpc = NULL;
>  
> @@ -328,6 +335,15 @@ static void astbmc_fixup_dt(void)
>  			break;
>  	}
>  
> +	return primary_lpc;
> +}
> +
> +static void astbmc_fixup_dt(void)
> +{
> +	struct dt_node *primary_lpc;
> +
> +	primary_lpc = dt_find_primary_lpc();
> +
>  	if (!primary_lpc)
>  		return;
>  
> @@ -337,9 +353,6 @@ static void astbmc_fixup_dt(void)
>  	/* BT is not in HB either */
>  	astbmc_fixup_dt_bt(primary_lpc);
>  
> -	/* MBOX is not in HB */
> -	astbmc_fixup_dt_mbox(primary_lpc);
> -
>  	/* The pel logging code needs a system-id property to work so
>  	   make sure we have one. */
>  	astbmc_fixup_dt_system_id();
> @@ -412,7 +425,16 @@ void astbmc_early_init(void)
>  		} else
>  			prerror("PLAT: AST IO initialisation failed!\n");
>  
> -		ast_setup_sio_mbox(MBOX_IO_BASE, MBOX_LPC_IRQ);
> +		/*
> +		 * P9 prefers IPMI for HIOMAP but will use MBOX if IPMI is not
> +		 * supported. P8 either uses IPMI HIOMAP or direct IO, and
> +		 * never MBOX. Thus only populate the MBOX node on P9 to allow
> +		 * fallback.
> +		 */
> +		if (proc_gen == proc_gen_p9) {
> +			astbmc_fixup_dt_mbox(dt_find_primary_lpc());
> +			ast_setup_sio_mbox(MBOX_IO_BASE, MBOX_LPC_IRQ);
> +		}
>  	} else {
>  		/*
>  		 * This may or may not be an error depending on if we set up
> diff --git a/platforms/astbmc/pnor.c b/platforms/astbmc/pnor.c
> index d269476..1c36435 100644
> --- a/platforms/astbmc/pnor.c
> +++ b/platforms/astbmc/pnor.c
> @@ -34,48 +34,54 @@ enum ast_flash_style {
>      mbox_hiomap,
>  };
>  
> +static enum ast_flash_style ast_flash_get_fallback_style(void)
> +{
> +    if (ast_lpc_fw_mbox_hiomap())
> +	return mbox_hiomap;
> +
> +    if (ast_lpc_fw_maps_flash())
> +	return raw_flash;
> +
> +    return raw_mem;
> +}
> +
>  int pnor_init(void)
>  {
>  	struct spi_flash_ctrl *pnor_ctrl = NULL;
>  	struct blocklevel_device *bl = NULL;
>  	enum ast_flash_style style;
> -	int rc;
> +	int rc = 0;
>  
> -	if (ast_lpc_fw_needs_hiomap()) {
> +	if (ast_lpc_fw_ipmi_hiomap()) {
>  		style = ipmi_hiomap;
>  		rc = ipmi_hiomap_init(&bl);
> -		if (rc) {
> -			style = mbox_hiomap;
> -			rc = mbox_flash_init(&bl);
> -		}
> -	} else {
> -		/* Open controller and flash. If the LPC->AHB doesn't point to
> -		 * the PNOR flash base we assume we're booting from BMC system
> -		 * memory (or some other place setup by the BMC to support LPC
> -		 * FW reads & writes).
> -		 */
> +	}
> +
> +	if (!ast_lpc_fw_ipmi_hiomap() || rc) {
> +		if (!ast_sio_is_enabled())
> +			return -ENODEV;
>  
> -		if (ast_lpc_fw_maps_flash()) {
> -			style = raw_flash;
> +		style = ast_flash_get_fallback_style();
> +		if (style == mbox_hiomap)
> +			rc = mbox_flash_init(&bl);
> +		else if (style == raw_flash)
>  			rc = ast_sf_open(AST_SF_TYPE_PNOR, &pnor_ctrl);
> -		} else {
> -			printf("PLAT: Memboot detected\n");
> -			style = raw_mem;
> +		else if (style == raw_mem)
>  			rc = ast_sf_open(AST_SF_TYPE_MEM, &pnor_ctrl);
> +		else {
> +			prerror("Unhandled flash mode: %d\n", style);
> +			return -ENODEV;
>  		}
> -		if (rc) {
> -			prerror("PLAT: Failed to open PNOR flash controller\n");
> -			goto fail;
> -		}
> -
> -		rc = flash_init(pnor_ctrl, &bl, NULL);
>  	}
>  
>  	if (rc) {
> -		prerror("PLAT: Failed to open init PNOR driver\n");
> +		prerror("PLAT: Failed to init PNOR driver\n");
>  		goto fail;
>  	}
>  
> +	if (style == raw_flash || style == raw_mem)
> +	    rc = flash_init(pnor_ctrl, &bl, NULL);
> +
>  	rc = flash_register(bl);
>  	if (!rc)
>  		return 0;
> -- 
> 2.7.4
> 
>


More information about the Skiboot mailing list