diff --git a/hw/ast-bmc/ast-io.c b/hw/ast-bmc/ast-io.c index 41234fbb2394..1e826fcca6d0 100644 --- a/hw/ast-bmc/ast-io.c +++ b/hw/ast-bmc/ast-io.c @@ -88,6 +88,7 @@ #include #include #include +#include #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 43c5989f5d42..40225e9a72ed 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 de4cafaf1ba4..e663055c6ab9 100644 --- a/platforms/astbmc/pnor.c +++ b/platforms/astbmc/pnor.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -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);