Device mmio set of registers

Sebastian Sumpf Sebastian.Sumpf at
Thu Sep 2 18:42:00 CEST 2021

Hi Stefan,

On 9/2/21 3:28 PM, Stefan Thöni wrote:
> Hello Genodians
> What's the best way to handle multiple sets of identical registers on a
> hardware device?
> In my current use case the device offers multiple DMA engines each of
> which has a complex set of registers to set up. Each register is located
> at base device address + base engine address + register offset so
> uniform handling should be easy.
> I handle the device itself and the shared registers using
> Platform::Device::Mmio.
> For the registers associated with each DMA engine I have tried:
> a) A template class providing a base offset as the template parameter.
> This is unsatisfactory however, as there is no common base class
> providing access to the registers for the software to be agnostic to
> which engine it handles.
> b) A separate class derived from Genode::Mmio. This looks promising, but
> the Platform::Device::Mmio unfortunatly offers no public accessor to the
> device base address so I cannot provide the base device address + base
> engine address to my engine mmio class.
> Any suggestions?

When using (b) you can use the. Platform::Device::Mmio::local_addr<>
template to pass the address of the locally mapped device resources to a
class derived from Genode::Mmio as a base address.

So something like:

!   struct Dma_engine : Genode::Mmio
!  {
!     Dma_engine(addr_t const base) : Mmio(base) { }
!    /* from here you only deal with offsets */
!  };
!  Platform::Device              _dev { <Platform connection>, <Type> };
!  Platform::Device::Mmio   _io_mem { _dev };
!  Dma_engine                   _engine
!    { (addr_t)_io_mem.local_addr<addr_t>(); }

should do the trick.


Sebastian Sumpf
Genode Labs ·

Genode Labs GmbH · Amtsgericht Dresden · HRB 28424 · Sitz Dresden
Geschäftsführer: Dr.-Ing. Norman Feske, Christian Helmuth

More information about the users mailing list