[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [RFC for-4.8 v2 5/7] xen/arm: domain_build: Plumb for different mapping attributes



From: "Edgar E. Iglesias" <edgar.iglesias@xxxxxxxxxx>

Add plumbing for passing around mapping attributes. This
is in preparation to allow us to differentiate the attributes
for specific device nodes.

We still use the same DEVICE mappings for all nodes so this
patch has no functional change.

Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xxxxxxxxxx>
---
 xen/arch/arm/domain_build.c | 57 +++++++++++++++++++++++++++++++++------------
 1 file changed, 42 insertions(+), 15 deletions(-)

diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index e4fed4b..064feb3 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -42,6 +42,18 @@ static void __init parse_dom0_mem(const char *s)
 }
 custom_param("dom0_mem", parse_dom0_mem);
 
+struct map_attr
+{
+    unsigned int memattr;
+    p2m_access_t access;
+};
+
+struct map_range_data
+{
+    struct domain *d;
+    const struct map_attr *attr;
+};
+
 //#define DEBUG_DT
 
 #ifdef DEBUG_DT
@@ -1024,7 +1036,8 @@ static int map_range_to_domain(const struct 
dt_device_node *dev,
                                u64 addr, u64 len,
                                void *data)
 {
-    struct domain *d = data;
+    struct map_range_data *mr_data = data;
+    struct domain *d = mr_data->d;
     bool_t need_mapping = !dt_device_for_passthrough(dev);
     int res;
 
@@ -1041,10 +1054,13 @@ static int map_range_to_domain(const struct 
dt_device_node *dev,
 
     if ( need_mapping )
     {
-        res = map_mmio_regions(d,
-                               paddr_to_pfn(addr),
-                               DIV_ROUND_UP(len, PAGE_SIZE),
-                               paddr_to_pfn(addr));
+        res = map_regions(d,
+                          paddr_to_pfn(addr),
+                          DIV_ROUND_UP(len, PAGE_SIZE),
+                          paddr_to_pfn(addr),
+                          mr_data->attr->memattr,
+                          mr_data->attr->access);
+
         if ( res < 0 )
         {
             printk(XENLOG_ERR "Unable to map 0x%"PRIx64
@@ -1055,7 +1071,8 @@ static int map_range_to_domain(const struct 
dt_device_node *dev,
         }
     }
 
-    DPRINT("  - MMIO: %010"PRIx64" - %010"PRIx64"\n", addr, addr + len);
+    DPRINT("  - MMIO: %010"PRIx64" - %010"PRIx64" MemAttr=%x\n",
+           addr, addr + len, mr_data->attr->memattr);
 
     return 0;
 }
@@ -1066,8 +1083,10 @@ static int map_range_to_domain(const struct 
dt_device_node *dev,
  * the child resources available to domain 0.
  */
 static int map_device_children(struct domain *d,
-                               const struct dt_device_node *dev)
+                               const struct dt_device_node *dev,
+                               const struct map_attr *attr)
 {
+    struct map_range_data mr_data = { .d = d, .attr = attr };
     int ret;
 
     if ( dt_device_type_is_equal(dev, "pci") )
@@ -1078,7 +1097,7 @@ static int map_device_children(struct domain *d,
         if ( ret < 0 )
             return ret;
 
-        ret = dt_for_each_range(dev, &map_range_to_domain, d);
+        ret = dt_for_each_range(dev, &map_range_to_domain, &mr_data);
         if ( ret < 0 )
             return ret;
     }
@@ -1094,7 +1113,8 @@ static int map_device_children(struct domain *d,
  *  - Assign the device to the guest if it's protected by an IOMMU
  *  - Map the IRQs and iomem regions to DOM0
  */
-static int handle_device(struct domain *d, struct dt_device_node *dev)
+static int handle_device(struct domain *d, struct dt_device_node *dev,
+                         const struct map_attr *attr)
 {
     unsigned int nirq;
     unsigned int naddr;
@@ -1160,6 +1180,7 @@ static int handle_device(struct domain *d, struct 
dt_device_node *dev)
     /* Give permission and map MMIOs */
     for ( i = 0; i < naddr; i++ )
     {
+        struct map_range_data mr_data = { .d = d, attr = attr };
         res = dt_device_get_address(dev, i, &addr, &size);
         if ( res )
         {
@@ -1168,12 +1189,12 @@ static int handle_device(struct domain *d, struct 
dt_device_node *dev)
             return res;
         }
 
-        res = map_range_to_domain(dev, addr, size, d);
+        res = map_range_to_domain(dev, addr, size, &mr_data);
         if ( res )
             return res;
     }
 
-    res = map_device_children(d, dev);
+    res = map_device_children(d, dev, attr);
     if ( res )
         return res;
 
@@ -1181,7 +1202,8 @@ static int handle_device(struct domain *d, struct 
dt_device_node *dev)
 }
 
 static int handle_node(struct domain *d, struct kernel_info *kinfo,
-                       struct dt_device_node *node)
+                       struct dt_device_node *node,
+                       const struct map_attr *attr)
 {
     static const struct dt_device_match skip_matches[] __initconst =
     {
@@ -1268,7 +1290,7 @@ 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);
+    res = handle_device(d, node, attr);
     if ( res)
         return res;
 
@@ -1290,7 +1312,7 @@ static int handle_node(struct domain *d, struct 
kernel_info *kinfo,
 
     for ( child = node->child; child != NULL; child = child->sibling )
     {
-        res = handle_node(d, kinfo, child);
+        res = handle_node(d, kinfo, child, attr);
         if ( res )
             return res;
     }
@@ -1322,6 +1344,11 @@ static int handle_node(struct domain *d, struct 
kernel_info *kinfo,
 
 static int prepare_dtb(struct domain *d, struct kernel_info *kinfo)
 {
+    const struct map_attr default_attr =
+    {
+        .memattr = MATTR_DEV,
+        .access = d->arch.p2m.default_access,
+    };
     const void *fdt;
     int new_size;
     int ret;
@@ -1341,7 +1368,7 @@ static int prepare_dtb(struct domain *d, struct 
kernel_info *kinfo)
 
     fdt_finish_reservemap(kinfo->fdt);
 
-    ret = handle_node(d, kinfo, dt_host);
+    ret = handle_node(d, kinfo, dt_host, &default_attr);
     if ( ret )
         goto err;
 
-- 
2.5.0


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.