[Skiboot] [PATCH v3 4/4] astbmc/pnor: Use mbox-flash for flash accesses

Suraj Jitindar Singh sjitindarsingh at gmail.com
Mon Feb 6 18:50:14 AEDT 2017


On Thu, 2017-02-02 at 17:54 +1100, Cyril Bur wrote:
> If the BMC is MBOX protocol aware, request flash reads/writes over
> the
> MBOX regs. This inits the blocklevel for pnor access with mbox-flash.
> 
> Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
> ---
>  hw/ast-bmc/ast-io.c     |  6 ++++++
>  include/ast.h           |  1 +
>  platforms/astbmc/pnor.c | 48 +++++++++++++++++++++++++++++++------
> -----------
>  3 files changed, 38 insertions(+), 17 deletions(-)
> 
> diff --git a/hw/ast-bmc/ast-io.c b/hw/ast-bmc/ast-io.c
> index 41234fbb..1e826fcc 100644
> --- a/hw/ast-bmc/ast-io.c
> +++ b/hw/ast-bmc/ast-io.c
> @@ -88,6 +88,7 @@
>  #include <skiboot.h>
>  #include <lpc.h>
>  #include <lock.h>
> +#include <device.h>
>  
>  #include "ast.h"
>  
> @@ -388,6 +389,11 @@ void ast_io_init(void)
>  	ast_setup_sio_irq_polarity();
>  }
>  
> +bool ast_is_mbox_pnor(void)
> +{
> +	return dt_find_compatible_node(dt_root, NULL, "mbox");
> +}
> +
>  bool ast_is_ahb_lpc_pnor(void)
>  {
>  	uint8_t boot_version;
> diff --git a/include/ast.h b/include/ast.h
> index 43c5989f..40225e9a 100644
> --- a/include/ast.h
> +++ b/include/ast.h
> @@ -74,6 +74,7 @@ int ast_copy_from_ahb(void *dst, uint32_t reg,
> uint32_t len);
>  
>  void ast_io_init(void);
>  bool ast_is_ahb_lpc_pnor(void);
> +bool ast_is_mbox_pnor(void);
>  
>  /* UART configuration */
>  
> diff --git a/platforms/astbmc/pnor.c b/platforms/astbmc/pnor.c
> index de4cafaf..e663055c 100644
> --- a/platforms/astbmc/pnor.c
> +++ b/platforms/astbmc/pnor.c
> @@ -18,6 +18,7 @@
>  #include <device.h>
>  #include <console.h>
>  #include <opal.h>
> +#include <libflash/mbox-flash.h>
>  #include <libflash/libflash.h>
>  #include <libflash/libffs.h>
>  #include <libflash/blocklevel.h>
> @@ -27,26 +28,35 @@
>  
>  int pnor_init(void)
>  {
> -	struct spi_flash_ctrl *pnor_ctrl;
> +	struct spi_flash_ctrl *pnor_ctrl = NULL;
>  	struct blocklevel_device *bl = NULL;
>  	int rc;
> +	bool do_mbox;
>  
> -	/* 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_is_ahb_lpc_pnor())
> -		rc = ast_sf_open(AST_SF_TYPE_PNOR, &pnor_ctrl);
> -	else {
> -		printf("PLAT: Memboot detected\n");
> -		rc = ast_sf_open(AST_SF_TYPE_MEM, &pnor_ctrl);
> -	}
> -	if (rc) {
> -		prerror("PLAT: Failed to open PNOR flash
> controller\n");
> -		goto fail;
> +	do_mbox = ast_is_mbox_pnor();
> +	if (do_mbox) {
> +		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_is_ahb_lpc_pnor())
> +			rc = ast_sf_open(AST_SF_TYPE_PNOR,
> &pnor_ctrl);
> +		else {
> +			printf("PLAT: Memboot detected\n");
> +			rc = ast_sf_open(AST_SF_TYPE_MEM,
> &pnor_ctrl);
> +		}
> +		if (rc) {
> +			prerror("PLAT: Failed to open PNOR flash
> controller\n");
> +			goto fail;
> +		}
> +
> +		rc = flash_init(pnor_ctrl, &bl, NULL);
>  	}
>  
> -	rc = flash_init(pnor_ctrl, &bl, NULL);
>  	if (rc) {
>  		prerror("PLAT: Failed to open init PNOR driver\n");
>  		goto fail;
> @@ -57,8 +67,12 @@ int pnor_init(void)
>  		return 0;
>  
>   fail:
> -	if (bl)
> -		flash_exit(bl);
> +	if (bl) {
> +		if (do_mbox)
> +			mbox_flash_exit(bl);
> +		else
> +			flash_exit(bl);
> +	}
>  	if (pnor_ctrl)
>  		ast_sf_close(pnor_ctrl);
>  
FWIW

Reviewed-by: Suraj Jitindar Singh <sjitindarsingh at gmail.com>


More information about the Skiboot mailing list