aboutsummaryrefslogtreecommitdiff
path: root/platforms/astbmc/pnor.c
diff options
context:
space:
mode:
Diffstat (limited to 'platforms/astbmc/pnor.c')
-rw-r--r--platforms/astbmc/pnor.c54
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;