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

[Minios-devel] [UNIKRAFT PATCH RFC 1/7] plat/drivers/ofw: Introduce fdt_get_last_node_by_compatible



This patch provides a helper for fdt to get the last node in dts
by the name of compatible matching

Signed-off-by: Jia He <justin.he@xxxxxxx>
---
 plat/drivers/include/ofw/fdt.h | 20 ++++++++++++++++++++
 plat/drivers/ofw/fdt.c         | 27 +++++++++++++++++++++++++++
 2 files changed, 47 insertions(+)

diff --git a/plat/drivers/include/ofw/fdt.h b/plat/drivers/include/ofw/fdt.h
index 6f80a27..b2fb27d 100644
--- a/plat/drivers/include/ofw/fdt.h
+++ b/plat/drivers/include/ofw/fdt.h
@@ -137,4 +137,24 @@ int fdt_node_offset_by_compatible_list(const void *fdt, 
int startoffset,
  */
 int fdt_get_interrupt(const void *fdt, int nodeoffset,
                                uint32_t index, int *size, fdt32_t **prop);
+
+/**
+ * fdt_get_last_node_by_compatible - get the last compatible node in fdt
+ * @fdt: pointer to the device tree blob
+ * @endoffset: end offset of the node to find the address for
+ * @compatibles: a list of 'compatible' string to match, should be ended
+ * with NULL string.
+ * If endoffset is -1, no limitation
+ * Else try to get he last node by compatible between [0, endoffset)
+ * returns:
+ *     0 on success , < 0 on failed > 0 the found offset
+ *     -FDT_ERR_NOTFOUND, if the given node has no 'compatible' property
+ *     -FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag
+ *     -FDT_ERR_BADMAGIC,
+ *     -FDT_ERR_BADVERSION,
+ *     -FDT_ERR_BADSTATE,
+ *     -FDT_ERR_BADSTRUCTURE, standard meanings
+ */
+int fdt_get_last_node_by_compatible(const void *fdt, int endoffset,
+                                   const char * const compatible);
 #endif
diff --git a/plat/drivers/ofw/fdt.c b/plat/drivers/ofw/fdt.c
index 76f8ff3..a8fe18f 100644
--- a/plat/drivers/ofw/fdt.c
+++ b/plat/drivers/ofw/fdt.c
@@ -288,3 +288,30 @@ int fdt_get_interrupt(const void *fdt, int nodeoffset,
 
        return 0;
 }
+
+/*
+ * get the last compatible node in fdt
+ * If endoffset is -1, no limitation
+ * Else try to get he last node by compatible between [0, endoffset)
+ */
+int fdt_get_last_node_by_compatible(const void *fdt, int endoffset,
+                                   const char * const compatible)
+{
+       int offset, err;
+       int lastoffset = -FDT_ERR_NOTFOUND;
+
+       for (offset = fdt_next_node(fdt, -1, NULL); offset >= 0;
+                               offset = fdt_next_node(fdt, offset, NULL)) {
+               err = fdt_node_check_compatible(fdt, offset, compatible);
+               if ((err < 0) && (err != -FDT_ERR_NOTFOUND))
+                       return err;
+               else if (err == 0) /* found */ {
+                       if (endoffset != -1 && offset >= endoffset)
+                               return lastoffset;
+
+                       lastoffset = offset;
+               }
+       }
+
+       return lastoffset; /* last node offset */
+}
-- 
2.17.1


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

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