Patchwork [06/31] dt: add helper for empty dt creation

login
register
mail settings
Submitter Alexander Graf
Date June 5, 2012, 11:52 p.m.
Message ID <1338940402-28502-7-git-send-email-agraf@suse.de>
Download mbox | patch
Permalink /patch/163229/
State New
Headers show

Comments

Alexander Graf - June 5, 2012, 11:52 p.m.
We want to get rid of the concept of loading an external device tree and instead
generate our own. However, to do this we need to also create a device tree
template programatically.

This patch adds a helper to create an empty device tree in memory.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 device_tree.c |   37 +++++++++++++++++++++++++++++++++++++
 device_tree.h |    1 +
 2 files changed, 38 insertions(+), 0 deletions(-)
Peter A. G. Crosthwaite - June 6, 2012, 5:34 a.m.
On Wed, 2012-06-06 at 01:52 +0200, Alexander Graf wrote:
> We want to get rid of the concept of loading an external device tree and instead
> generate our own. However, to do this we need to also create a device tree
> template programatically.
> 
> This patch adds a helper to create an empty device tree in memory.
> 
> Signed-off-by: Alexander Graf <agraf@suse.de>

Reviewed-by: Peter Crosthwaite <peter.crosthwaite@petalogix.com>

> ---
>  device_tree.c |   37 +++++++++++++++++++++++++++++++++++++
>  device_tree.h |    1 +
>  2 files changed, 38 insertions(+), 0 deletions(-)
> 
> diff --git a/device_tree.c b/device_tree.c
> index 6745d17..d4f1f0a 100644
> --- a/device_tree.c
> +++ b/device_tree.c
> @@ -25,6 +25,43 @@
>  
>  #include <libfdt.h>
>  
> +#define FDT_MAX_SIZE  0x10000
> +
> +void *create_device_tree(int *sizep)
> +{
> +    void *fdt;
> +    int ret;
> +
> +    *sizep = FDT_MAX_SIZE;
> +    fdt = g_malloc0(FDT_MAX_SIZE);
> +    ret = fdt_create(fdt, FDT_MAX_SIZE);
> +    if (ret < 0) {
> +        goto fail;
> +    }
> +    ret = fdt_begin_node(fdt, "");
> +    if (ret < 0) {
> +        goto fail;
> +    }
> +    ret = fdt_end_node(fdt);
> +    if (ret < 0) {
> +        goto fail;
> +    }
> +    ret = fdt_finish(fdt);
> +    if (ret < 0) {
> +        goto fail;
> +    }
> +    ret = fdt_open_into(fdt, fdt, *sizep);
> +    if (ret) {
> +        fprintf(stderr, "Unable to copy device tree in memory\n");
> +        exit(1);
> +    }
> +
> +    return fdt;
> +fail:
> +    fprintf(stderr, "%s Couldn't create dt: %s\n", __func__, fdt_strerror(ret));
> +    exit(1);
> +}
> +
>  void *load_device_tree(const char *filename_path, int *sizep)
>  {
>      int dt_size;
> diff --git a/device_tree.h b/device_tree.h
> index 376287a..5464dc7 100644
> --- a/device_tree.h
> +++ b/device_tree.h
> @@ -14,6 +14,7 @@
>  #ifndef __DEVICE_TREE_H__
>  #define __DEVICE_TREE_H__
>  
> +void *create_device_tree(int *sizep);
>  void *load_device_tree(const char *filename_path, int *sizep);
>  
>  int qemu_devtree_setprop(void *fdt, const char *node_path,

Patch

diff --git a/device_tree.c b/device_tree.c
index 6745d17..d4f1f0a 100644
--- a/device_tree.c
+++ b/device_tree.c
@@ -25,6 +25,43 @@ 
 
 #include <libfdt.h>
 
+#define FDT_MAX_SIZE  0x10000
+
+void *create_device_tree(int *sizep)
+{
+    void *fdt;
+    int ret;
+
+    *sizep = FDT_MAX_SIZE;
+    fdt = g_malloc0(FDT_MAX_SIZE);
+    ret = fdt_create(fdt, FDT_MAX_SIZE);
+    if (ret < 0) {
+        goto fail;
+    }
+    ret = fdt_begin_node(fdt, "");
+    if (ret < 0) {
+        goto fail;
+    }
+    ret = fdt_end_node(fdt);
+    if (ret < 0) {
+        goto fail;
+    }
+    ret = fdt_finish(fdt);
+    if (ret < 0) {
+        goto fail;
+    }
+    ret = fdt_open_into(fdt, fdt, *sizep);
+    if (ret) {
+        fprintf(stderr, "Unable to copy device tree in memory\n");
+        exit(1);
+    }
+
+    return fdt;
+fail:
+    fprintf(stderr, "%s Couldn't create dt: %s\n", __func__, fdt_strerror(ret));
+    exit(1);
+}
+
 void *load_device_tree(const char *filename_path, int *sizep)
 {
     int dt_size;
diff --git a/device_tree.h b/device_tree.h
index 376287a..5464dc7 100644
--- a/device_tree.h
+++ b/device_tree.h
@@ -14,6 +14,7 @@ 
 #ifndef __DEVICE_TREE_H__
 #define __DEVICE_TREE_H__
 
+void *create_device_tree(int *sizep);
 void *load_device_tree(const char *filename_path, int *sizep);
 
 int qemu_devtree_setprop(void *fdt, const char *node_path,