Indeed, this header is generated from the Broadcom's Linux drivers headers,
with a Perl script.

On Tue, Dec 22, 2015 at 12:33 AM, Peter Crosthwaite <
crosthwaitepe...@gmail.com> wrote:

> On Mon, Dec 21, 2015 at 3:15 PM, Andrew Baumann
> <andrew.baum...@microsoft.com> wrote:
> > Hi Peter,
> >
> > Thanks for the review!
> >
> >> From: Peter Crosthwaite [mailto:crosthwaitepe...@gmail.com]
> >> Sent: Monday, 21 December 2015 14:49
> >> On Thu, Dec 3, 2015 at 10:01 PM, Andrew Baumann
> >> <andrew.baum...@microsoft.com> wrote:
> >> > This adds the system mailboxes which are used to communicate with a
> >> > number of GPU peripherals on Pi/Pi2.
> >> >
> >> > Signed-off-by: Andrew Baumann <andrew.baum...@microsoft.com>
> >> > ---
> >> >  default-configs/arm-softmmu.mak      |   1 +
> >> >  hw/misc/Makefile.objs                |   1 +
> >> >  hw/misc/bcm2835_sbm.c                | 280 ++++++++++++++++++++
> >>
> >> >  include/hw/arm/bcm2835_arm_control.h | 481
> >> +++++++++++++++++++++++++++++++++++
> >>
> >> Do we need this file as of this patch?
> >
> > Yes, for ARM_MC_IHAVEDATAIRQEN and other related defines.
> >
> > [...]
> >> > +static void bcm2835_sbm_update(BCM2835SbmState *s)
> >>
> >> What does Sbm stand for? If it is acronym is should be all caps in
> camel case.
> >
> > I'm not sure -- it comes from Gregory's code; maybe he can comment?
> Where this device gets instantiated, there is a comment of
> >
> > /* Semaphores / Doorbells / Mailboxes */
> >
> > ... but only mailboxes are implemented here. I'm guessing maybe it's
> intended as "system mailboxes". I can rename it.
> >
> >
> >> > +{
> >> > +    int set;
> >>
> >> bool.
> >>
> >> > +    int done, n;
> >> > +    uint32_t value;
> >> > +
> >> > +    /* Avoid unwanted recursive calls */
> >> > +    s->mbox_irq_disabled = 1;
> >> > +
> >> > +    /* Get pending responses and put them in the vc->arm mbox */
> >> > +    done = 0;
> >> > +    while (!done) {
> >> > +        done = 1;
> >> > +        if (s->mbox[0].status & ARM_MS_FULL) {
> >> > +            /* vc->arm mbox full, exit */
> >>
> >> break here.
> >>
> >> > +        } else {
> >>
> >> so you can drop the else and get back a level of indent.
> >>
> >> > +            for (n = 0; n < MBOX_CHAN_COUNT; n++) {
> >> > +                if (s->available[n]) {
> >> > +                    value = ldl_phys(&s->mbox_as, n<<4);
> >> > +                    if (value != MBOX_INVALID_DATA) {
> >> > +                        mbox_push(&s->mbox[0], value);
> >> > +                    } else {
> >> > +                        /* Hmmm... */
> >>
> >> Needs more comment :)
> >
> > Gregory -- help! :)
> >
> > [...]
> >> > +    s->available[irq] = level;
> >> > +    if (!s->mbox_irq_disabled) {
> >>
> >> I don't think you need this. IO devices are not thread safe and
> >> core-code knows it. So you don't need to worry about interruption and
> >> re-entry of your IRQ handler.
> >
> > I will have to put a debugger on this to confirm, but I think the issue
> is that we are using a private memory region and GPIOs to route mailbox
> data and interrupts to the relevant sub peripherals. The ldl_phys invokes
> another device emulation (such as bcm2835_property.c in this series), which
> may cause it to signal an interrupt back to us via qemu_set_irq which will
> recursively run our handler. We want that IRQ to be recorded but "squashed".
> >
> > [...]
> >> > +
> >> > +    switch (offset) {
> >> > +    case 0x80:  /* MAIL0_READ */
> >> > +    case 0x84:
> >> > +    case 0x88:
> >> > +    case 0x8c:
> >>
> >> case 0x80..0x8c
> >
> > Woah! Is that standard C?
> >
>
> Yes, its probably one of the more recent language standards though.
> QEMU does use to more modern features liberally.
>
> > [...]
> >> > --- /dev/null
> >> > +++ b/include/hw/arm/bcm2835_arm_control.h
> >> > @@ -0,0 +1,481 @@
> >> > +/*
> >> > + *  linux/arch/arm/mach-bcm2708/arm_control.h
> > [...]
> >> When you have a regular structure like this, you should collapse it
> >> down using some arithmatic:
> >
> > Notice that this file comes from Linux. I know it's not pretty, but can
> we please keep it as-is, for comparison purposes? I'm not sure there's much
> value in cleaning it up locally...
> >
>
> It looks very autogenerated and seems pretty nasty on the repetition.
>
> As implementers of the hardware, it is much rarer to need these
> repetitious defs than the software users on the other side. "Do
> something specific with CPU#3's Mbox#5" is going to appear in
> software, but hardware implementers generally don't have a choice to
> implement things specifically and it usually ends up being looped and
> the exploded defs are never used. If there are only a handful of
> genuinely single defs needed, can they be fished out?
>
> Regards,
> Peter
>
> >> > --- /dev/null
> >> > +++ b/include/hw/misc/bcm2835_sbm.h
> >> > @@ -0,0 +1,37 @@
> >> > +/*
> >> > + * Raspberry Pi emulation (c) 2012 Gregory Estrade
> >> > + * This code is licensed under the GNU GPLv2 and later.
> >> > + */
> >> > +
> >> > +#ifndef BCM2835_SBM_H
> >> > +#define BCM2835_SBM_H
> >> > +
> >> > +#include "hw/sysbus.h"
> >> > +#include "exec/address-spaces.h"
> >> > +#include "hw/arm/bcm2835_mbox.h"
> >> > +
> >> > +#define TYPE_BCM2835_SBM "bcm2835_sbm"
> >> > +#define BCM2835_SBM(obj) \
> >> > +        OBJECT_CHECK(BCM2835SbmState, (obj), TYPE_BCM2835_SBM)
> >> > +
> >> > +typedef struct {
> >> > +    MemoryRegion *mbox_mr;
> >> > +    AddressSpace mbox_as;
> >>
> >> I can't see where these two fields are used. A quick scan shows that
> >> the SbmState's copy is uses for all DMA ops. If these are needed,
> >> mbox_init should pass a pointer to the the SbmState then this saves
> >> the pointer and navigates as needed back to the container structure to
> >> get the AS.
> >
> > You're right. They're uninitialised/unused detritus from a previous
> refactor. I'll remove them.
> >
> > Thanks,
> > Andrew
>

Reply via email to