qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Avi Kivity <avi@redhat.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: QEMU Developers <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] modelling omap_gpmc with the hierarchical memory API
Date: Tue, 02 Aug 2011 21:05:09 +0300	[thread overview]
Message-ID: <4E383C55.5050703@redhat.com> (raw)
In-Reply-To: <CAFEAcA9djGhDKE_S4cQg+Jtj6Spy3p+7uUMNeJDE4ijzoYWxzA@mail.gmail.com>

On 08/02/2011 08:21 PM, Peter Maydell wrote:
> On 2 August 2011 16:58, Avi Kivity<avi@redhat.com>  wrote:
> >  On 08/02/2011 06:47 PM, Peter Maydell wrote:
> >>  This kind of "I want to manage the memory layout of a pile of other
> >>  things" seems like what the hierarchical memory API should provide,
> >>  but there's a bit of a difficulty here in that sysbus MMIOs aren't
> >>  necessarily MemoryRegions (and sysbus doesn't provide a "MemoryRegion*
> >>  sysbus_get_memoryregion(SysBusDevice dev, int regionnumber)"
> >>  anyway). How are we planning to move forward here? Will all sysbus
> >>  MMIOs eventually be converted to MemoryRegions?
> >
> >  Yes.
>
> Cool. I guess this means struct SysBusDevice's struct { ... } mmio[]
> will turn into a MemoryRegion* mmio[] ?
>

Not all.  Some use a single mmio region to map multiple subregions at 
unrelated addresses, so we have to use a callback.  If someone takes the 
time to split them into multiple regions, we can remove the callbacks (I 
think there are two or three users).  However, it has to be done by 
someone who understands the implications; I limited myself to mechanical 
transformations.

It's particularly annoying as the mmio regions are magically mapped to a 
vararg constructor function, or something.

> >>  Secondly, I'm not sure how to implement the gpmc size registers with
> >>  the memory API: memory_region_add_subregion() lets you specify the
> >>  offset you want to put the subregion at, but doesn't provide any way
> >>  to say "limit the size of the mapping to this many bytes, regardless
> >>  of how big the underlying device thinks it is".
> >
> >  You can interpose you own container region:
> >
> >
> >    system_memory
> >       |
> >       +--- cs_region-0
> >               |
> >               +--- device-connected-to-that-region
> >
> >  cs-region-0 will clip anything under it.
>
> OK, and when we change the size of CS0 we delete the container
> region, create a new one of the new size and reconnect the
> device-region to the new container? That's a bit clumsy but it
> will work.

Yes.  I plan to introduce more general dynamic clipping, but only after 
the dust settles.

> >>  So maybe I'm approaching the problem wrong -- how should I be doing
> >>  this?
> >
> >  I don't think those devices should be connected to the sysbus (since they
> >  aren't on real hardware).  Connect them to your gpmc instead.  If the
> >  devices are already designed for sysbus, maybe we can dual-bus them, or make
> >  gpmc have eight sysbuses hanging off it.
>
> Actually I think in an ideal world omap_gpmc_attach() would
> simply take a MemoryRegion* :
>   void omap_gpmc_attach(DeviceState *gpmc, int cs,
>                         MemoryRegion *subdevice)

Yup.

> (for "NOR-like" devices, with a second separate one for NAND-like
> devices:
>   void omap_gpmc_attach_nand(DeviceState *gpmc, int cs,
>                              DeviceState *nanddevice)
> ...because for a NAND like device we need to do nand_setpins(),
> nand_setio(), etc, but for a NOR-like device we just need to map
> its memory.)
>
> So I think we just need a sysbus_mmio_get_memoryregion()
> (and convert the devices I need to attach to use memory
> regions, and live with not being able to attach unconverted
> devices).

I don't follow - why do we need get_memoryregion? who would call it?

> Then in some future new-qemu-object-model world when devices
> just directly expose their MemoryRegions it will be easy to
> just pass mydevice->registers to omap_gpmc_attach().
>
> [That is, the only reason I'm passing SysBus objects around
> is that at the moment that is the only useful abstraction we
> have for saying "I'm an arbitrary device object and I provide
> some GPIO pins and some memory mappable regions". MemoryRegion*
> allows me to pass around a memory mappable region in a more
> direct way than having to pass a (SysBus*, mmio_index) tuple.]

I think I see.  Perhaps you're describing qdev/MemoryRegion integration.

(vote starts now for renaming MemoryRegion -> Memory; or perhaps Aspace 
for Address Space).

-- 
error compiling committee.c: too many arguments to function

  reply	other threads:[~2011-08-02 18:05 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-02 15:47 [Qemu-devel] modelling omap_gpmc with the hierarchical memory API Peter Maydell
2011-08-02 15:58 ` Avi Kivity
2011-08-02 17:21   ` Peter Maydell
2011-08-02 18:05     ` Avi Kivity [this message]
2011-08-02 18:21       ` Peter Maydell
2011-08-02 19:11         ` Avi Kivity
2011-08-02 19:38           ` Peter Maydell
2011-08-02 21:00             ` Anthony Liguori
2011-08-02 21:25             ` Avi Kivity
2011-08-02 20:56         ` Anthony Liguori
2011-08-02 21:28           ` Peter Maydell
2011-08-02 21:48             ` Avi Kivity
2011-08-02 22:04               ` Peter Maydell
2011-08-03  2:26               ` Anthony Liguori
2011-08-03  6:50                 ` Avi Kivity
2011-08-03  2:25             ` Anthony Liguori
2011-08-03  9:10               ` Peter Maydell
2011-08-03  9:23                 ` Avi Kivity
2011-08-02 18:07     ` Jan Kiszka
2011-08-02 19:15       ` Avi Kivity
2011-08-02 21:06       ` Anthony Liguori
2011-08-02 21:29         ` Avi Kivity
2011-08-03  2:33           ` Anthony Liguori
2011-08-03  6:56             ` Avi Kivity

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4E383C55.5050703@redhat.com \
    --to=avi@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).