diff options
Diffstat (limited to 'platforms/astbmc/pnor.c')
-rw-r--r-- | platforms/astbmc/pnor.c | 54 |
1 files changed, 30 insertions, 24 deletions
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; |