Blame view
libfdt/fdt_wip.c
2.92 KB
35748177c
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
/* * libfdt - Flat Device Tree manipulation * Copyright (C) 2006 David Gibson, IBM Corporation. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "libfdt_env.h" #include <fdt.h> #include <libfdt.h> #include "libfdt_internal.h" int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name, const void *val, int len) { void *propval; int proplen; propval = fdt_getprop(fdt, nodeoffset, name, &proplen); if (! propval) return proplen; if (proplen != len) return -FDT_ERR_NOSPACE; memcpy(propval, val, len); return 0; } static void nop_region(void *start, int len) { uint32_t *p; for (p = start; (void *)p < (start + len); p++) *p = cpu_to_fdt32(FDT_NOP); } int fdt_nop_property(void *fdt, int nodeoffset, const char *name) { struct fdt_property *prop; int len; prop = fdt_get_property(fdt, nodeoffset, name, &len); if (! prop) return len; nop_region(prop, len + sizeof(*prop)); return 0; } int _fdt_node_end_offset(void *fdt, int nodeoffset) { int level = 0; uint32_t tag; int offset, nextoffset; |
3af0d587d
|
70 |
tag = fdt_next_tag(fdt, nodeoffset, &nextoffset, NULL); |
35748177c
|
71 72 73 74 |
if (tag != FDT_BEGIN_NODE) return -FDT_ERR_BADOFFSET; do { offset = nextoffset; |
3af0d587d
|
75 |
tag = fdt_next_tag(fdt, offset, &nextoffset, NULL); |
35748177c
|
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
switch (tag) { case FDT_END: return offset; case FDT_BEGIN_NODE: level++; break; case FDT_END_NODE: level--; break; case FDT_PROP: case FDT_NOP: break; default: return -FDT_ERR_BADSTRUCTURE; } } while (level >= 0); return nextoffset; } int fdt_nop_node(void *fdt, int nodeoffset) { int endoffset; endoffset = _fdt_node_end_offset(fdt, nodeoffset); if (endoffset < 0) return endoffset; nop_region(fdt_offset_ptr(fdt, nodeoffset, 0), endoffset - nodeoffset); return 0; } |
3f9f08cf9
|
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
/* * Replace a reserve map entry in the nth slot. */ int fdt_replace_reservemap_entry(void *fdt, int n, uint64_t addr, uint64_t size) { struct fdt_reserve_entry *re; int used; int total; int err; err = fdt_num_reservemap(fdt, &used, &total); if (err != 0) return err; if (n >= total) return -FDT_ERR_NOSPACE; re = (struct fdt_reserve_entry *) (fdt + fdt_off_mem_rsvmap(fdt) + (n * sizeof(struct fdt_reserve_entry))); re->address = cpu_to_fdt64(addr); re->size = cpu_to_fdt64(size); return 0; } |