MMIO service implementation with MMIO bundle interfaces. Should be
relatively easy to adapt to physical interfaces by wrapping the wires to
channels then bundles. Allows the implementation to be shared and (hopefully)
platform independent.
Whether or not to support unaligned accesses is up to the clients. The header
and manifest do not support unaligned accesses and throw away the lower three
bits.
Only allows for one outstanding request at a time. If a client doesn't return
a response, the MMIO service will hang. TODO: add some kind of timeout.
Implementation-defined MMIO layout:
- 0x0: 0 constant
- 0x8: Magic number (0x207D98E5_E5100E51)
- 0x12: ESI version number (0)
- 0x18: Location of the manifest ROM (absolute address)
- 0x400: Start of MMIO space for requests. Mapping is contained in the
manifest so can be dynamically queried.
- addr(Manifest ROM) + 0: Size of compressed manifest
- addr(Manifest ROM) + 8: Start of compressed manifest
This layout _should_ be pretty standard, but different BSPs may have various
different restrictions. Any BSP which uses this service implementation will
have this layout, possibly with an offset or address window.
Definition at line 319 of file common.py.