@@ -1628,6 +1628,7 @@ static int __init handle_node(struct domain *d, struct kernel_info *kinfo,
DT_MATCH_PATH("/hypervisor"),
{ /* sentinel */ },
};
+ static __initdata bool res_mem_node_found = false;
struct dt_device_node *child;
int res, i, nirq, irq_id;
const char *name;
@@ -1722,6 +1723,19 @@ static int __init handle_node(struct domain *d, struct kernel_info *kinfo,
if ( res )
return res;
+ if ( dt_node_path_is_equal(node, "/reserved-memory") )
+ {
+ res_mem_node_found = true;
+ /*
+ * Avoid duplicate /reserved-memory nodes in Device Tree, so add the
+ * static shared memory nodes there.
+ */
+ res = make_shm_resv_memory_node(kinfo, dt_n_addr_cells(node),
+ dt_n_size_cells(node));
+ if ( res )
+ return res;
+ }
+
for ( child = node->child; child != NULL; child = child->sibling )
{
res = handle_node(d, kinfo, child, p2mt);
@@ -1774,9 +1788,12 @@ static int __init handle_node(struct domain *d, struct kernel_info *kinfo,
return res;
}
- res = make_resv_memory_node(kinfo, addrcells, sizecells);
- if ( res )
- return res;
+ if ( !res_mem_node_found )
+ {
+ res = make_resv_memory_node(kinfo, addrcells, sizecells);
+ if ( res )
+ return res;
+ }
}
res = fdt_end_node(kinfo->fdt);
@@ -34,6 +34,9 @@ int remove_shm_from_rangeset(const struct kernel_info *kinfo,
int remove_shm_holes_for_domU(const struct kernel_info *kinfo,
struct membanks *ext_regions);
+int make_shm_resv_memory_node(const struct kernel_info *kinfo, int addrcells,
+ int sizecells);
+
#else /* !CONFIG_STATIC_SHM */
static inline int make_resv_memory_node(const struct kernel_info *kinfo,
@@ -77,6 +80,12 @@ static inline int remove_shm_holes_for_domU(const struct kernel_info *kinfo,
return 0;
}
+static inline int make_shm_resv_memory_node(const struct kernel_info *kinfo,
+ int addrcells, int sizecells)
+{
+ return 0;
+}
+
#endif /* CONFIG_STATIC_SHM */
#endif /* __ASM_STATIC_SHMEM_H_ */
@@ -297,8 +297,8 @@ int __init process_shm(struct domain *d, struct kernel_info *kinfo,
return 0;
}
-static int __init make_shm_memory_node(const struct kernel_info *kinfo,
- int addrcells, int sizecells)
+int __init make_shm_resv_memory_node(const struct kernel_info *kinfo,
+ int addrcells, int sizecells)
{
const struct membanks *mem = &kinfo->shm_mem.common;
void *fdt = kinfo->fdt;
@@ -306,7 +306,7 @@ static int __init make_shm_memory_node(const struct kernel_info *kinfo,
int res = 0;
if ( mem->nr_banks == 0 )
- return -ENOENT;
+ return 0;
/*
* For each shared memory region, a range is exposed under
@@ -544,7 +544,7 @@ int __init make_resv_memory_node(const struct kernel_info *kinfo, int addrcells,
if ( res )
return res;
- res = make_shm_memory_node(kinfo, addrcells, sizecells);
+ res = make_shm_resv_memory_node(kinfo, addrcells, sizecells);
if ( res )
return res;