@@ -1212,6 +1212,7 @@ static int handle_node(struct domain *d, struct kernel_info *kinfo,
DT_MATCH_PATH("/hypervisor"),
{ /* sentinel */ },
};
+ const struct device_desc *desc;
struct dt_device_node *child;
int res;
const char *name;
@@ -1233,6 +1234,8 @@ static int handle_node(struct domain *d, struct kernel_info *kinfo,
return 0;
}
+ desc = device_get_desc(node);
+
/*
* Replace these nodes with our own. Note that the original may be
* used_by DOMID_XEN so this check comes first.
@@ -1268,7 +1271,15 @@ static int handle_node(struct domain *d, struct kernel_info *kinfo,
"WARNING: Path %s is reserved, skip the node as we may re-use the path.\n",
path);
- res = handle_device(d, node);
+ if ( desc && desc->map )
+ {
+ res = desc->map(d, node);
+ }
+ else
+ {
+ res = handle_device(d, node);
+ }
+
if ( res)
return res;
@@ -48,6 +48,16 @@ struct device_desc {
const struct dt_device_match *dt_match;
/* Device initialization */
int (*init)(struct dt_device_node *dev, const void *data);
+
+ /**
+ * map - Custom map function to map a devices memory regions and IRQs
+ * @d: Domain to map device into
+ * @dev: Device tree node representing the device
+ *
+ * OPTIONAL: If not set the generic DT code will take care of creating
+ * the mappings.
+ */
+ int (*map)(struct domain *d, struct dt_device_node *dev);
};
struct acpi_device_desc {