TianoCore EDK2 master
Loading...
Searching...
No Matches
fdt_wip.c
1/*
2 * libfdt - Flat Device Tree manipulation
3 * Copyright (C) 2006 David Gibson, IBM Corporation.
4 *
5 * libfdt is dual licensed: you can use it either under the terms of
6 * the GPL, or the BSD license, at your option.
7 *
8 * a) This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this library; if not, write to the Free
20 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
21 * MA 02110-1301 USA
22 *
23 * Alternatively,
24 *
25 * b) Redistribution and use in source and binary forms, with or
26 * without modification, are permitted provided that the following
27 * conditions are met:
28 *
29 * 1. Redistributions of source code must retain the above
30 * copyright notice, this list of conditions and the following
31 * disclaimer.
32 * 2. Redistributions in binary form must reproduce the above
33 * copyright notice, this list of conditions and the following
34 * disclaimer in the documentation and/or other materials
35 * provided with the distribution.
36 *
37 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
38 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
39 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
40 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
41 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
42 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
47 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
48 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
49 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
50 */
51#include "libfdt_env.h"
52
53#include <fdt.h>
54#include <libfdt.h>
55
56#include "libfdt_internal.h"
57
58int
59fdt_setprop_inplace_namelen_partial (
60 void *fdt,
61 int nodeoffset,
62 const char *name,
63 int namelen,
64 uint32_t idx,
65 const void *val,
66 int len
67 )
68{
69 void *propval;
70 int proplen;
71
72 propval = fdt_getprop_namelen_w (
73 fdt,
74 nodeoffset,
75 name,
76 namelen,
77 &proplen
78 );
79 if (!propval) {
80 return proplen;
81 }
82
83 if (proplen < (len + idx)) {
84 return -FDT_ERR_NOSPACE;
85 }
86
87 memcpy ((char *)propval + idx, val, len);
88 return 0;
89}
90
91int
92fdt_setprop_inplace (
93 void *fdt,
94 int nodeoffset,
95 const char *name,
96 const void *val,
97 int len
98 )
99{
100 const void *propval;
101 int proplen;
102
103 propval = fdt_getprop (fdt, nodeoffset, name, &proplen);
104 if (!propval) {
105 return proplen;
106 }
107
108 if (proplen != len) {
109 return -FDT_ERR_NOSPACE;
110 }
111
112 return fdt_setprop_inplace_namelen_partial (
113 fdt,
114 nodeoffset,
115 name,
116 strlen (name),
117 0,
118 val,
119 len
120 );
121}
122
123static void
124_fdt_nop_region (
125 void *start,
126 int len
127 )
128{
129 fdt32_t *p;
130
131 for (p = start; (char *)p < ((char *)start + len); p++) {
132 *p = cpu_to_fdt32 (FDT_NOP);
133 }
134}
135
136int
137fdt_nop_property (
138 void *fdt,
139 int nodeoffset,
140 const char *name
141 )
142{
143 struct fdt_property *prop;
144 int len;
145
146 prop = fdt_get_property_w (fdt, nodeoffset, name, &len);
147 if (!prop) {
148 return len;
149 }
150
151 _fdt_nop_region (prop, len + sizeof (*prop));
152
153 return 0;
154}
155
156int
157_fdt_node_end_offset (
158 void *fdt,
159 int offset
160 )
161{
162 int depth = 0;
163
164 while ((offset >= 0) && (depth >= 0)) {
165 offset = fdt_next_node (fdt, offset, &depth);
166 }
167
168 return offset;
169}
170
171int
172fdt_nop_node (
173 void *fdt,
174 int nodeoffset
175 )
176{
177 int endoffset;
178
179 endoffset = _fdt_node_end_offset (fdt, nodeoffset);
180 if (endoffset < 0) {
181 return endoffset;
182 }
183
184 _fdt_nop_region (
185 fdt_offset_ptr_w (fdt, nodeoffset, 0),
186 endoffset - nodeoffset
187 );
188 return 0;
189}