On Fri, Oct 26, 2012 at 05:03:04PM +1000, Peter Crosthwaite wrote:
> In my recent USB series Avi mentioned he wanted to do some work with
> the memory API and encourage devices to use the memory API to do
> fine-grained register decoding, i.e. each register is its own
> MemoryRegion. This has the advantage of getting rid of the symmetric
> switch statements in the read and write handlers. The big drawback I
> am seeing is however is indexing into the register file. For example
> in a device i'm working on ATM I have this read handler for my device
> registers:
>
> static uint64_t devcfg_read (void *opaque, hwaddr addr,
> unsigned size)
> {
> struct XilinxDevcfg *s = opaque;
> uint32_t ret;
>
> addr >>= 2;
> switch (addr)
> {
> //TODO: implement any read side effects
> }
> ret = s->regs[addr];
> DB_PRINT("addr=" TARGET_FMT_plx " = %x\n", addr * 4, ret);
> return ret;
> }
Hi,
If well designed, most hw has a well designed symtery between regs
that makes things simpler if you can just opencode the decding.
IMO, an mr per reg would just add a massive overhead for no win.
And also, hw implemented decoders look very much like
switch cases in qemu which make things easy to map.
What is the win?
Cheers,
Edgar