[Skiboot] [PATCH v3 2/4] ast-bmc: Use the mbox driver
Cyril Bur
cyril.bur at au1.ibm.com
Tue Feb 7 11:02:01 AEDT 2017
On Mon, 2017-02-06 at 16:55 +1100, Suraj Jitindar Singh wrote:
> On Thu, 2017-02-02 at 17:54 +1100, Cyril Bur wrote:
> > The mbox registers are accessed via superIO, these need to be
> > initialised.
> > The mbox device node won't be present in the device tree hostboot
> > passes
> > us, so fixup the device tree.
> >
> > Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
> > ---
> > hw/ast-bmc/ast-io.c | 19 +++++++++++++++++++
> > include/ast.h | 3 +++
> > platforms/astbmc/common.c | 38
> > ++++++++++++++++++++++++++++++++++++++
> > 3 files changed, 60 insertions(+)
> >
> > diff --git a/hw/ast-bmc/ast-io.c b/hw/ast-bmc/ast-io.c
> > index a3c5c9f7..41234fbb 100644
> > --- a/hw/ast-bmc/ast-io.c
> > +++ b/hw/ast-bmc/ast-io.c
> > @@ -469,3 +469,22 @@ void ast_disable_sio_uart1(void)
> >
> > bmc_sio_put(true);
> > }
> > +
> > +void ast_setup_sio_mbox(uint16_t io_base, uint8_t irq)
> > +{
> > + bmc_sio_get(BMC_SIO_DEV_MBOX);
> > +
> > + /* Disable for configuration */
> > + bmc_sio_outb(0x00, 0x30);
> > +
> > + bmc_sio_outb(io_base >> 8, 0x60);
> > + bmc_sio_outb(io_base & 0xff, 0x61);
>
> Technically the lower 5 bits of this are reserved. I assume you only
> have down to 32 byte granularity then.
> io_base & 0xE0?
Looks like you've read the SuperIO better than I did[n't]. *cracks open
the docs*
> > + bmc_sio_outb(irq, 0x70);
>
> Again, not sure if it matters but "irq & 0x0F"?
> > + bmc_sio_outb(0x01, 0x71); /* level low */
> > +
> > + /* Enable MailBox */
> > + bmc_sio_outb(0x01, 0x30);
> > +
> > + bmc_sio_put(true);
> > +}
> > +
> > diff --git a/include/ast.h b/include/ast.h
> > index c7bf0cb3..43c5989f 100644
> > --- a/include/ast.h
> > +++ b/include/ast.h
> > @@ -85,6 +85,9 @@ void ast_disable_sio_uart1(void);
> > /* BT configuration */
> > void ast_setup_ibt(uint16_t io_base, uint8_t irq);
> >
> > +/* MBOX configuration */
> > +void ast_setup_sio_mbox(uint16_t io_base, uint8_t irq);
> > +
> > #endif /* __SKIBOOT__ */
> >
> > /*
> > diff --git a/platforms/astbmc/common.c b/platforms/astbmc/common.c
> > index e78b5fa3..5cd72de9 100644
> > --- a/platforms/astbmc/common.c
> > +++ b/platforms/astbmc/common.c
> > @@ -39,6 +39,11 @@
> > #define BT_IO_COUNT 3
> > #define BT_LPC_IRQ 10
> >
> > +/* MBOX config */
> > +#define MBOX_IO_BASE 0x1000
> > +#define MBOX_IO_COUNT 6
> > +#define MBOX_LPC_IRQ 9
> > +
> > void astbmc_ext_irq_serirq_cpld(unsigned int chip_id)
> > {
> > lpc_all_interrupts(chip_id);
> > @@ -191,6 +196,32 @@ static void astbmc_fixup_dt_bt(struct dt_node
> > *lpc)
> > dt_add_property_cells(bt, "interrupt-parent", lpc->phandle);
> > }
> >
> > +static void astbmc_fixup_dt_mbox(struct dt_node *lpc)
> > +{
> > + struct dt_node *mbox;
> > + char namebuf[32];
> > +
> > + /* First check if the mbox interface is already there */
> > + dt_for_each_child(lpc, mbox) {
> > + if (dt_node_is_compatible(mbox, "mbox"))
> > + return;
> > + }
> > +
> > + snprintf(namebuf, sizeof(namebuf), "mbox at i%x",
> > MBOX_IO_BASE);
> > + mbox = dt_new(lpc, namebuf);
> > +
> > + dt_add_property_cells(mbox, "reg",
> > + 1, /* IO space */
> > + MBOX_IO_BASE, MBOX_IO_COUNT);
> > + dt_add_property_strings(mbox, "compatible", "mbox");
> > +
> > + /* Mark it as reserved to avoid Linux trying to claim it */
> > + dt_add_property_strings(mbox, "status", "reserved");
> > +
> > + dt_add_property_cells(mbox, "interrupts", MBOX_LPC_IRQ);
> > + dt_add_property_cells(mbox, "interrupt-parent", lpc-
> > > phandle);
> >
> > +}
> > +
> > static void astbmc_fixup_dt_uart(struct dt_node *lpc)
> > {
> > /*
> > @@ -288,6 +319,9 @@ static void astbmc_fixup_dt(void)
> > /* BT is not in HB either */
> > astbmc_fixup_dt_bt(primary_lpc);
> >
> > + /* MBOX is not in HB */
> > + astbmc_fixup_dt_mbox(primary_lpc);
> > +
> > /* The pel logging code needs a system-id property to work
> > so
> > make sure we have one. */
> > astbmc_fixup_dt_system_id();
> > @@ -357,9 +391,13 @@ void astbmc_early_init(void)
> > /* Similarly, some BMCs don't configure the BT interrupt
> > properly */
> > ast_setup_ibt(BT_IO_BASE, BT_LPC_IRQ);
> >
> > + ast_setup_sio_mbox(MBOX_IO_BASE, MBOX_LPC_IRQ);
> > +
> > /* Setup UART and use it as console */
> > uart_init();
> >
> > + mbox_init();
> > +
> > prd_init();
> > }
> >
>
> Everything else looks good.
>
> Reviewed-by: Suraj Jitindar Singh <sjitindarsingh at gmail.com>
>
More information about the Skiboot
mailing list