[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