Skip to content

Commit

Permalink
astbmc/pnor: Use mbox-flash for flash accesses
Browse files Browse the repository at this point in the history
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@au1.ibm.com>
Signed-off-by: Michael Neuling <mikey@neuling.org>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
  • Loading branch information
cyrilbur-ibm authored and stewartsmith committed Feb 23, 2017
1 parent 23fe769 commit 6d1028f
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 17 deletions.
6 changes: 6 additions & 0 deletions hw/ast-bmc/ast-io.c
Expand Up @@ -88,6 +88,7 @@
#include <skiboot.h>
#include <lpc.h>
#include <lock.h>
#include <device.h>

#include "ast.h"

Expand Down Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions include/ast.h
Expand Up @@ -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 */

Expand Down
48 changes: 31 additions & 17 deletions platforms/astbmc/pnor.c
Expand Up @@ -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>
Expand All @@ -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;
Expand All @@ -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);

Expand Down

0 comments on commit 6d1028f

Please sign in to comment.