diff mbox

[RFC,for-4.8,2/6] xen/arm: Add an optional map function to the device descriptor

Message ID 1463759488-11900-3-git-send-email-edgar.iglesias@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Edgar E. Iglesias May 20, 2016, 3:51 p.m. UTC
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>

Add an optional map function to the device descriptor. If
registered, the map function will be called to do custom
device specific mappings of the device. If not registered,
the generic DT version (handle_device) will be used.

This is in preparation for adding support for "mmio-sram"
memory that needs to be mapped as MEMORY and not DEVICE.

Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
---
 xen/arch/arm/domain_build.c  | 13 ++++++++++++-
 xen/include/asm-arm/device.h | 10 ++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)
diff mbox

Patch

diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 00dc07a..15b6dbe 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -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;
 
diff --git a/xen/include/asm-arm/device.h b/xen/include/asm-arm/device.h
index 1a40a02..98b9fe1 100644
--- a/xen/include/asm-arm/device.h
+++ b/xen/include/asm-arm/device.h
@@ -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 {