Annotation of qemu/device_tree.c, revision 1.1.1.3

1.1       root        1: /*
                      2:  * Functions to help device tree manipulation using libfdt.
                      3:  * It also provides functions to read entries from device tree proc
                      4:  * interface.
                      5:  *
                      6:  * Copyright 2008 IBM Corporation.
                      7:  * Authors: Jerone Young <jyoung5@us.ibm.com>
                      8:  *          Hollis Blanchard <hollisb@us.ibm.com>
                      9:  *
                     10:  * This work is licensed under the GNU GPL license version 2 or later.
                     11:  *
                     12:  */
                     13: 
                     14: #include <stdio.h>
                     15: #include <sys/types.h>
                     16: #include <sys/stat.h>
                     17: #include <fcntl.h>
                     18: #include <unistd.h>
                     19: #include <stdlib.h>
                     20: 
                     21: #include "config.h"
                     22: #include "qemu-common.h"
                     23: #include "sysemu.h"
                     24: #include "device_tree.h"
1.1.1.3 ! root       25: #include "hw/loader.h"
1.1       root       26: 
                     27: #include <libfdt.h>
                     28: 
1.1.1.2   root       29: void *load_device_tree(const char *filename_path, int *sizep)
1.1       root       30: {
1.1.1.2   root       31:     int dt_size;
1.1       root       32:     int dt_file_load_size;
                     33:     int ret;
1.1.1.2   root       34:     void *fdt = NULL;
1.1       root       35: 
1.1.1.2   root       36:     *sizep = 0;
                     37:     dt_size = get_image_size(filename_path);
                     38:     if (dt_size < 0) {
1.1       root       39:         printf("Unable to get size of device tree file '%s'\n",
                     40:             filename_path);
                     41:         goto fail;
                     42:     }
                     43: 
1.1.1.2   root       44:     /* Expand to 2x size to give enough room for manipulation.  */
                     45:     dt_size *= 2;
1.1       root       46:     /* First allocate space in qemu for device tree */
1.1.1.2   root       47:     fdt = qemu_mallocz(dt_size);
1.1       root       48: 
1.1.1.2   root       49:     dt_file_load_size = load_image(filename_path, fdt);
                     50:     if (dt_file_load_size < 0) {
                     51:         printf("Unable to open device tree file '%s'\n",
                     52:                filename_path);
                     53:         goto fail;
                     54:     }
1.1       root       55: 
1.1.1.2   root       56:     ret = fdt_open_into(fdt, fdt, dt_size);
1.1       root       57:     if (ret) {
                     58:         printf("Unable to copy device tree in memory\n");
                     59:         goto fail;
                     60:     }
                     61: 
                     62:     /* Check sanity of device tree */
                     63:     if (fdt_check_header(fdt)) {
                     64:         printf ("Device tree file loaded into memory is invalid: %s\n",
                     65:             filename_path);
                     66:         goto fail;
                     67:     }
1.1.1.2   root       68:     *sizep = dt_size;
1.1       root       69:     return fdt;
                     70: 
                     71: fail:
1.1.1.2   root       72:     qemu_free(fdt);
1.1       root       73:     return NULL;
                     74: }
                     75: 
                     76: int qemu_devtree_setprop(void *fdt, const char *node_path,
                     77:                          const char *property, uint32_t *val_array, int size)
                     78: {
                     79:     int offset;
                     80: 
                     81:     offset = fdt_path_offset(fdt, node_path);
                     82:     if (offset < 0)
                     83:         return offset;
                     84: 
                     85:     return fdt_setprop(fdt, offset, property, val_array, size);
                     86: }
                     87: 
                     88: int qemu_devtree_setprop_cell(void *fdt, const char *node_path,
                     89:                               const char *property, uint32_t val)
                     90: {
                     91:     int offset;
                     92: 
                     93:     offset = fdt_path_offset(fdt, node_path);
                     94:     if (offset < 0)
                     95:         return offset;
                     96: 
                     97:     return fdt_setprop_cell(fdt, offset, property, val);
                     98: }
                     99: 
                    100: int qemu_devtree_setprop_string(void *fdt, const char *node_path,
                    101:                                 const char *property, const char *string)
                    102: {
                    103:     int offset;
                    104: 
                    105:     offset = fdt_path_offset(fdt, node_path);
                    106:     if (offset < 0)
                    107:         return offset;
                    108: 
                    109:     return fdt_setprop_string(fdt, offset, property, string);
                    110: }

unix.superglobalmegacorp.com