# Device Tree Overlays support in Xen

Xen experimentally supports dynamic device assignment to running
domains, i.e. adding/removing nodes (using .dtbo) to/from Xen device
tree, and attaching them to a running domain with given $domid.

Dynamic node assignment works in two steps:

## Add/Remove device tree overlay to/from Xen device tree

1. Xen tools check the dtbo given and parse all other user provided arguments
2. Xen tools pass the dtbo to Xen hypervisor via hypercall.
3. Xen hypervisor applies/removes the dtbo to/from Xen device tree.

## Attach device from the DT overlay to domain

1. Xen tools check the dtbo given and parse all other user provided arguments
2. Xen tools pass the dtbo to Xen hypervisor via hypercall.
3. Xen hypervisor attach the device to the user-provided $domid by
   mapping node resources in the DT overlay.

# Examples

Here are a few examples on how to use it.

## Dom0 device add

For assigning a device tree overlay to Dom0, user should firstly properly
prepare the DT overlay. More information about device tree overlays can be
found in [1]. Then, in Dom0, enter the following:

    (dom0) xl dt-overlay add overlay.dtbo

This will allocate the devices mentioned in overlay.dtbo to Xen device tree.

To assign the newly added device from the dtbo to Dom0:

    (dom0) xl dt-overlay attach overlay.dtbo 0

Next, if the user wants to add the same device tree overlay to dom0
Linux, execute the following:

    (dom0) mkdir -p /sys/kernel/config/device-tree/overlays/new_overlay
    (dom0) cat overlay.dtbo > /sys/kernel/config/device-tree/overlays/new_overlay/dtbo

Finally if needed, the relevant Linux kernel drive can be loaded using:

    (dom0) modprobe module_name.ko

## DomU device add/remove

All the nodes in dtbo will be assigned to one domain. The user will need
to prepare a different dtbo for the domU. For example, the
`interrupt-parent` property of the DomU overlay should be changed to the
Xen hardcoded value `0xfde8` and the xen,reg property should be added to
specify the address mappings. If the domain is not 1:1 mapped, xen,reg
must be present. See the xen,reg format description in
docs/misc/arm/passthrough.txt. Below assumes the properly written DomU
dtbo is `overlay_domu.dtbo`.

The user needs to set the `passthrough` property in the xl config file
if you plan to use DT overlay and devices requiring an IOMMU.

User will also need to modprobe the relevant drivers. For already
running domains, the user can use the xl dt-overlay attach command,
example:

    (dom0) xl dt-overlay add overlay.dtbo            # If not executed before
    (dom0) xl dt-overlay attach overlay_domu.dtbo $domid
    (dom0) xl console $domid                         # To access $domid console

Next, if the user needs to modify/prepare the overlay.dtbo suitable for
the domU:

    (domU) mkdir -p /sys/kernel/config/device-tree/overlays/new_overlay
    (domU) cat overlay_domu.dtbo > /sys/kernel/config/device-tree/overlays/new_overlay/dtbo

Finally, if needed, the relevant Linux kernel drive can be probed:

    (domU) modprobe module_name.ko

[1] https://www.kernel.org/doc/Documentation/devicetree/overlay-notes.txt
