Message ID | 20180228061610.30856-3-joel@jms.id.au |
---|---|
State | Accepted |
Headers | show |
Series | Use mbox scratch register for p8 | expand |
On Wed, Feb 28, 2018 at 4:46 PM, Joel Stanley <joel@jms.id.au> wrote: > P8 boxes can opt in for mbox pnor support if they set the scratch > register bit to indicate it is supported. > > Signed-off-by: Joel Stanley <joel@jms.id.au> > --- I've tested this with the following configurations: P8 test platform is Palmetto, and P9 test platform is Romulus. mbox aware BMC, scatch reg set: P9, P8 mbox aware BMC, scratch reg unset: P8, P9 mbox unaware BMC, scratch reg unset: P8 All systems booted using the expected flash access mechanism. For "fun", you can chose to set/unset the scratch register between boots and have your host firmware change behaviour. Cheers, Joel > hw/ast-bmc/ast-io.c | 14 ++++++++++++++ > include/ast.h | 1 + > platforms/astbmc/common.c | 5 +++-- > 3 files changed, 18 insertions(+), 2 deletions(-) > > diff --git a/hw/ast-bmc/ast-io.c b/hw/ast-bmc/ast-io.c > index cd1aba2a177a..964d41513379 100644 > --- a/hw/ast-bmc/ast-io.c > +++ b/hw/ast-bmc/ast-io.c > @@ -116,6 +116,7 @@ > */ > > #define BMC_SIO_SCR29 0x29 > +#define BMC_SIO_SCR29_MBOX 0x08 > #define BMC_SIO_SCR29_MEMBOOT 0x10 > > enum { > @@ -427,6 +428,19 @@ bool ast_is_ahb_lpc_pnor(void) > return !(boot_flags & BMC_SIO_SCR29_MEMBOOT); > } > > +bool ast_scratch_reg_is_mbox(void) > +{ > + uint8_t boot_version; > + uint8_t boot_flags; > + > + boot_version = bmc_sio_inb(BMC_SIO_SCR28); > + if (boot_version != BOOT_FLAGS_VERSION) > + return false; > + > + boot_flags = bmc_sio_inb(BMC_SIO_SCR29); > + return boot_flags & BMC_SIO_SCR29_MBOX; > +} > + > void ast_setup_ibt(uint16_t io_base, uint8_t irq) > { > uint32_t v; > diff --git a/include/ast.h b/include/ast.h > index 414ff6a3d39a..2c1336b2a79b 100644 > --- a/include/ast.h > +++ b/include/ast.h > @@ -82,6 +82,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); > +bool ast_scratch_reg_is_mbox(void); > > /* UART configuration */ > > diff --git a/platforms/astbmc/common.c b/platforms/astbmc/common.c > index 243ad9461239..9cf679161e7a 100644 > --- a/platforms/astbmc/common.c > +++ b/platforms/astbmc/common.c > @@ -207,8 +207,9 @@ static void astbmc_fixup_dt_mbox(struct dt_node *lpc) > struct dt_node *mbox; > char namebuf[32]; > > - /* All P9 machines have this and no earlier machines do */ > - if (proc_gen != proc_gen_p9) > + /* All P9 machines use mbox. P8 machines can indicate they support > + * it using the scratch register */ > + if (proc_gen != proc_gen_p9 && !ast_scratch_reg_is_mbox()) > return; > > /* First check if the mbox interface is already there */ > -- > 2.15.1 >
diff --git a/hw/ast-bmc/ast-io.c b/hw/ast-bmc/ast-io.c index cd1aba2a177a..964d41513379 100644 --- a/hw/ast-bmc/ast-io.c +++ b/hw/ast-bmc/ast-io.c @@ -116,6 +116,7 @@ */ #define BMC_SIO_SCR29 0x29 +#define BMC_SIO_SCR29_MBOX 0x08 #define BMC_SIO_SCR29_MEMBOOT 0x10 enum { @@ -427,6 +428,19 @@ bool ast_is_ahb_lpc_pnor(void) return !(boot_flags & BMC_SIO_SCR29_MEMBOOT); } +bool ast_scratch_reg_is_mbox(void) +{ + uint8_t boot_version; + uint8_t boot_flags; + + boot_version = bmc_sio_inb(BMC_SIO_SCR28); + if (boot_version != BOOT_FLAGS_VERSION) + return false; + + boot_flags = bmc_sio_inb(BMC_SIO_SCR29); + return boot_flags & BMC_SIO_SCR29_MBOX; +} + void ast_setup_ibt(uint16_t io_base, uint8_t irq) { uint32_t v; diff --git a/include/ast.h b/include/ast.h index 414ff6a3d39a..2c1336b2a79b 100644 --- a/include/ast.h +++ b/include/ast.h @@ -82,6 +82,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); +bool ast_scratch_reg_is_mbox(void); /* UART configuration */ diff --git a/platforms/astbmc/common.c b/platforms/astbmc/common.c index 243ad9461239..9cf679161e7a 100644 --- a/platforms/astbmc/common.c +++ b/platforms/astbmc/common.c @@ -207,8 +207,9 @@ static void astbmc_fixup_dt_mbox(struct dt_node *lpc) struct dt_node *mbox; char namebuf[32]; - /* All P9 machines have this and no earlier machines do */ - if (proc_gen != proc_gen_p9) + /* All P9 machines use mbox. P8 machines can indicate they support + * it using the scratch register */ + if (proc_gen != proc_gen_p9 && !ast_scratch_reg_is_mbox()) return; /* First check if the mbox interface is already there */
P8 boxes can opt in for mbox pnor support if they set the scratch register bit to indicate it is supported. Signed-off-by: Joel Stanley <joel@jms.id.au> --- hw/ast-bmc/ast-io.c | 14 ++++++++++++++ include/ast.h | 1 + platforms/astbmc/common.c | 5 +++-- 3 files changed, 18 insertions(+), 2 deletions(-)