xen/arm, doc: Add a DT property to specify IOMMU for Dom0less domUs

There are some use cases in which the dom0less domUs need to have
the XEN_DOMCTL_CDF_iommu set at the domain construction time. For
example, the dynamic dtbo feature allows the domain to be assigned
a device that is behind the IOMMU at runtime. For these use cases,
we need to have a way to specify the domain will need the IOMMU
mapping at domain construction time.

Introduce a "passthrough" DT property for Dom0less DomUs following
the same entry as the xl.cfg. Currently only provide two options,
i.e. "enable" and "disable". Set the XEN_DOMCTL_CDF_iommu at domain
construction time based on the property.

Signed-off-by: Henry Wang <xin.wang2@amd.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
This commit is contained in:
Henry Wang authored and Stefano Stabellini committed 2024-05-24 16:26:22 -07:00
1 parent c8cbc5eb1c
commit 1d2b4f3049
2 files changed
+25 -2

No files matched your search

+16
View File
@@ -260,6 +260,22 @@ with the following properties:
value specified by Xen command line parameter gnttab_max_maptrack_frames
(or its default value if unspecified, i.e. 1024) is used.
- passthrough
A string property specifying whether IOMMU mappings are enabled for the
domain and hence whether it will be enabled for passthrough hardware.
Possible property values are:
- "enabled"
IOMMU mappings are enabled for the domain. Note that this option is the
default if the user provides the device partial passthrough device tree
for the domain.
- "disabled"
IOMMU mappings are disabled for the domain and so hardware may not be
passed through. This option is the default if this property is missing
and the user does not provide the device partial device tree for the domain.
Under the "xen,domain" compatible node, one or more sub-nodes are present
for the DomU kernel and ramdisk.
+9 -2
View File
@@ -848,6 +848,8 @@ static int __init construct_domU(struct domain *d,
void __init create_domUs(void)
{
struct dt_device_node *node;
const char *dom0less_iommu;
bool iommu = false;
const struct dt_device_node *cpupool_node,
*chosen = dt_find_node_by_path("/chosen");
@@ -895,8 +897,13 @@ void __init create_domUs(void)
panic("Missing property 'cpus' for domain %s\n",
dt_node_name(node));
if ( dt_find_compatible_node(node, NULL, "multiboot,device-tree") &&
iommu_enabled )
if ( !dt_property_read_string(node, "passthrough", &dom0less_iommu) &&
!strcmp(dom0less_iommu, "enabled") )
iommu = true;
if ( iommu_enabled &&
(iommu || dt_find_compatible_node(node, NULL,
"multiboot,device-tree")) )
d_cfg.flags |= XEN_DOMCTL_CDF_iommu;
if ( !dt_property_read_u32(node, "nr_spis", &d_cfg.arch.nr_spis) )
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.