@@ -67,6 +67,21 @@ int __init device_init(struct dt_device_node *dev, enum device_type type,
return -EBADF;
}
+enum device_type device_get_type(const struct dt_device_node *dev)
+{
+ const struct device_desc *desc;
+
+ ASSERT(dev != NULL);
+
+ for ( desc = _sdevice; desc != _edevice; desc++ )
+ {
+ if ( device_is_compatible(desc, dev) )
+ return desc->type;
+ }
+
+ return DEVICE_UNKNOWN;
+}
+
/*
* Local variables:
* mode: C
@@ -11,6 +11,7 @@
#include <xen/device_tree.h>
#include <xen/libfdt/libfdt.h>
#include <xen/guest_access.h>
+#include <asm/device.h>
#include <asm/setup.h>
#include <asm/platform.h>
#include <asm/psci.h>
@@ -823,6 +824,15 @@ static int handle_node(struct domain *d, struct kernel_info *kinfo,
return 0;
}
+ /* Even if the IOMMU device is not used by Xen, it should not be
+ * passthrough to DOM0
+ */
+ if ( device_get_type(node) == DEVICE_IOMMU )
+ {
+ DPRINT(" IOMMU, skip it\n");
+ return 0;
+ }
+
/*
* Some device doesn't need to be mapped in Xen:
* - Memory: the guest will see a different view of memory. It will
@@ -8,6 +8,8 @@ enum device_type
{
DEVICE_SERIAL,
DEVICE_IOMMU,
+ /* Use for error */
+ DEVICE_UNKNOWN,
};
struct device_desc {
@@ -32,6 +34,14 @@ struct device_desc {
int __init device_init(struct dt_device_node *dev, enum device_type type,
const void *data);
+/**
+ * device_get_type - Get the type of the device
+ * @dev: device to match
+ *
+ * Return the device type on success or DEVICE_ANY on failure
+ */
+enum device_type device_get_type(const struct dt_device_node *dev);
+
#define DT_DEVICE_START(_name, _namestr, _type) \
static const struct device_desc __dev_desc_##_name __used \
__attribute__((__section__(".dev.info"))) = { \
When iommu={disable,off,no,false} is given to Xen command line, the IOMMU framework won't specify that the device shouldn't be passthrough to DOM0. Signed-off-by: Julien Grall <julien.grall@linaro.org> --- Changes in v2: - Patch added --- xen/arch/arm/device.c | 15 +++++++++++++++ xen/arch/arm/domain_build.c | 10 ++++++++++ xen/include/asm-arm/device.h | 10 ++++++++++ 3 files changed, 35 insertions(+)