Hi Oleksandr,
On 13/09/2019 16:35, Oleksandr Tyshchenko wrote:
diff --git a/xen/drivers/passthrough/arm/iommu.c
b/xen/drivers/passthrough/arm/iommu.c
index f219de9..555acfc 100644
--- a/xen/drivers/passthrough/arm/iommu.c
+++ b/xen/drivers/passthrough/arm/iommu.c
@@ -20,6 +20,12 @@
#include <xen/device_tree.h>
#include <asm/device.h>
+/*
+ * Deferred probe list is used to keep track of devices for which driver
+ * requested deferred probing (returned -EAGAIN).
+ */
+static __initdata LIST_HEAD(deferred_probe_list);
+
static const struct iommu_ops *iommu_ops;
const struct iommu_ops *iommu_get_ops(void)
@@ -42,7 +48,7 @@ void __init iommu_set_ops(const struct iommu_ops *ops)
int __init iommu_hardware_setup(void)
{
- struct dt_device_node *np;
+ struct dt_device_node *np, *tmp;
int rc;
unsigned int num_iommus = 0;
@@ -51,6 +57,21 @@ int __init iommu_hardware_setup(void)
rc = device_init(np, DEVICE_IOMMU, NULL);
if ( !rc )
num_iommus++;
+ else if ( rc == -EAGAIN )
+ {
+ /*
+ * We expect nobody uses device's domain_list at such early stage,
NIT: s/We expect nobody uses/Nobody should use/
+ * so we can re-use it to link the device in the deferred list to
+ * avoid introducing extra list_head field in struct
dt_device_node.
+ */
+ ASSERT(list_empty(&np->domain_list));
[...]
void __hwdom_init arch_iommu_check_autotranslated_hwdom(struct domain *d)
diff --git a/xen/include/asm-arm/device.h b/xen/include/asm-arm/device.h
index 63a0f36..ee1c3bc 100644
--- a/xen/include/asm-arm/device.h
+++ b/xen/include/asm-arm/device.h
@@ -44,7 +44,11 @@ struct device_desc {
enum device_class class;
/* List of devices supported by this driver */
const struct dt_device_match *dt_match;
- /* Device initialization */
+ /*
+ * Device initialization.
+ *
+ * -EAGAIN is used to indicate that device probing is deferred.
+ */
int (*init)(struct dt_device_node *dev, const void *data);
};
diff --git a/xen/include/xen/device_tree.h b/xen/include/xen/device_tree.h
index 9a7a8f2..3702e9b 100644
--- a/xen/include/xen/device_tree.h
+++ b/xen/include/xen/device_tree.h
@@ -92,6 +92,13 @@ struct dt_device_node {
/* IOMMU specific fields */
bool is_protected;
+ /*
+ * The main purpose of this list node is to link the structure in the list
s/node//?
+ * of devices assigned to domain.
+ *
+ * Boot code (iommu_hardware_setup) re-uses this list to link the structure
+ * in the list of devices for which driver requested deferred probing.
+ */
struct list_head domain_list;
struct device dev;
With the two above addressed and pending the patch it depends on [1] is acked:
Reviewed-by: Julien Grall <julien.gr...@arm.com>
Cheers,
[1] https://lists.xenproject.org/archives/html/xen-devel/2019-08/msg01924.html
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel