qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 5/9] FDT: Add additional access methods for array ty


From: crwulff
Subject: [Qemu-devel] [PATCH 5/9] FDT: Add additional access methods for array types and walking children.
Date: Sun, 9 Sep 2012 20:20:03 -0400

From: Chris Wulff <address@hidden>

Signed-off-by: Chris Wulff <address@hidden>
---
 device_tree.c |   88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 device_tree.h |   18 ++++++++++++
 2 files changed, 106 insertions(+)

diff --git a/device_tree.c b/device_tree.c
index d7a9b6b..7fa7646 100644
--- a/device_tree.c
+++ b/device_tree.c
@@ -27,6 +27,14 @@
 
 #include <libfdt.h>
 
+#define CHECK_HEADER(fdt) \
+    { \
+        int err = fdt_check_header(fdt); \
+        if (err != 0) { \
+            return err; \
+        } \
+    }
+
 #define FDT_MAX_SIZE  0x10000
 
 void *create_device_tree(int *sizep)
@@ -304,3 +312,83 @@ int qemu_devtree_add_subnode(void *fdt, const char *name)
     g_free(dupname);
     return retval;
 }
+
+int qemu_devtree_node_offset(void *fdt, const char *node_path)
+{
+    return fdt_path_offset(fdt, node_path);
+}
+
+int qemu_devtree_subnode_offset_namelen(void *fdt, int parentoffset,
+                                        const char *name, int namelen)
+{
+    return fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen);
+}
+
+int qemu_devtree_next_child_offset(void *fdt, int parentoffset, int 
childoffset)
+{
+    int level = 0;
+    uint32_t tag;
+    int offset, nextoffset;
+
+    CHECK_HEADER(fdt);
+    tag = fdt_next_tag(fdt, parentoffset, &nextoffset);
+    if (tag != FDT_BEGIN_NODE) {
+        return -FDT_ERR_BADOFFSET;
+    }
+
+    do {
+        offset = nextoffset;
+        tag = fdt_next_tag(fdt, offset, &nextoffset);
+
+        switch (tag) {
+        case FDT_END:
+            return -FDT_ERR_TRUNCATED;
+
+        case FDT_BEGIN_NODE:
+            level++;
+            if (level != 1) {
+                continue;
+            }
+            if (offset > childoffset) {
+                return offset;
+            }
+            break;
+
+        case FDT_END_NODE:
+            level--;
+            break;
+
+        case FDT_PROP:
+        case FDT_NOP:
+            break;
+
+        default:
+            return -FDT_ERR_BADSTRUCTURE;
+        }
+    } while (level >= 0);
+
+    return -FDT_ERR_NOTFOUND;
+}
+
+const char *qemu_devtree_get_name(const void *fdt, int nodeoffset, int *lenp)
+{
+    return fdt_get_name(fdt, nodeoffset, lenp);
+}
+
+const void *qemu_devtree_getprop_offset(const void *fdt, int nodeoffset,
+                                        const char *name, int *lenp)
+{
+    return fdt_getprop(fdt, nodeoffset, name, lenp);
+}
+
+uint32_t qemu_devtree_int_array_index(const void *propval, unsigned int index)
+{
+    return be32_to_cpu(((uint32_t *)propval)[index]);
+}
+
+int qemu_devtree_node_check_compatible(const void *fdt, int nodeoffset,
+                                       const char *compatible)
+{
+    return fdt_node_check_compatible(fdt, nodeoffset, compatible);
+}
+
diff --git a/device_tree.h b/device_tree.h
index f7a3e6c..e01b460 100644
--- a/device_tree.h
+++ b/device_tree.h
@@ -49,4 +49,22 @@ int qemu_devtree_add_subnode(void *fdt, const char *name);
                              sizeof(qdt_tmp));                                \
     } while (0)
 
+int qemu_devtree_node_offset(void *fdt, const char *node_path);
+
+int qemu_devtree_subnode_offset_namelen(void *fdt, int parentoffset,
+                                        const char *name, int namelen);
+
+int qemu_devtree_next_child_offset(void *fdt, int parentoffset,
+                                   int childoffset);
+
+const char *qemu_devtree_get_name(const void *fdt, int nodeoffset, int *lenp);
+
+const void *qemu_devtree_getprop_offset(const void *fdt, int nodeoffset,
+                                        const char *name, int *lenp);
+
+uint32_t qemu_devtree_int_array_index(const void *propval, unsigned int index);
+
+int qemu_devtree_node_check_compatible(const void *fdt, int nodeoffset,
+                                       const char *compatible);
+
 #endif /* __DEVICE_TREE_H__ */
-- 
1.7.9.5




reply via email to

[Prev in Thread] Current Thread [Next in Thread]