.. _mmio-device-passthrough:

MMIO Device Passthrough
########################

The ACRN Hypervisor supports both PCI and MMIO device passthrough.
However there are some constraints on and hypervisor assumptions about
MMIO devices: there can be no DMA access to the MMIO device and the MMIO
device may not use IRQs.

Here is how ACRN supports MMIO device passthrough:

* For a pre-launched VM, the VM configuration tells the ACRN hypervisor
  the addresses of the physical MMIO device's regions and where they are
  mapped to in the pre-launched VM.  The hypervisor then removes these
  MMIO regions from the Service VM and fills the vACPI table for this MMIO
  device based on the device's physical ACPI table.

* For a post-launched VM, the same actions are done as in a
  pre-launched VM, plus we use the command line to tell which MMIO
  device we want to pass through to the post-launched VM.

  If the MMIO device has ACPI Tables, use ``--acpidev_pt HID[,UID]`` and
  if not, use ``--mmiodev_pt MMIO_regions``.

.. note::
   The vTPM and PT TPM in the ACRN-DM have the same HID so we
   can't support them both at the same time. The VM will fail to boot if
   both are used.

These issues remain to be implemented:

* Save the MMIO regions in a field of the VM structure in order to
  release the resources when the post-launched VM shuts down abnormally.
* Allocate the guest MMIO regions for the MMIO device in a guest-reserved
  MMIO region instead of being hard-coded. With this, we could add more
  passthrough MMIO devices.
* De-assign the MMIO device from the Service VM first before passing
  through it to the post-launched VM and not only removing the MMIO
  regions from the Service VM.
