1*cd60bc56SAndroid Build Coastguard Worker // SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
2*cd60bc56SAndroid Build Coastguard Worker /*
3*cd60bc56SAndroid Build Coastguard Worker * libfdt - Flat Device Tree manipulation
4*cd60bc56SAndroid Build Coastguard Worker * Copyright (C) 2006 David Gibson, IBM Corporation.
5*cd60bc56SAndroid Build Coastguard Worker */
6*cd60bc56SAndroid Build Coastguard Worker #include "libfdt_env.h"
7*cd60bc56SAndroid Build Coastguard Worker
8*cd60bc56SAndroid Build Coastguard Worker #include <fdt.h>
9*cd60bc56SAndroid Build Coastguard Worker #include <libfdt.h>
10*cd60bc56SAndroid Build Coastguard Worker
11*cd60bc56SAndroid Build Coastguard Worker #include "libfdt_internal.h"
12*cd60bc56SAndroid Build Coastguard Worker
fdt_setprop_inplace_namelen_partial(void * fdt,int nodeoffset,const char * name,int namelen,uint32_t idx,const void * val,int len)13*cd60bc56SAndroid Build Coastguard Worker int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,
14*cd60bc56SAndroid Build Coastguard Worker const char *name, int namelen,
15*cd60bc56SAndroid Build Coastguard Worker uint32_t idx, const void *val,
16*cd60bc56SAndroid Build Coastguard Worker int len)
17*cd60bc56SAndroid Build Coastguard Worker {
18*cd60bc56SAndroid Build Coastguard Worker void *propval;
19*cd60bc56SAndroid Build Coastguard Worker int proplen;
20*cd60bc56SAndroid Build Coastguard Worker
21*cd60bc56SAndroid Build Coastguard Worker propval = fdt_getprop_namelen_w(fdt, nodeoffset, name, namelen,
22*cd60bc56SAndroid Build Coastguard Worker &proplen);
23*cd60bc56SAndroid Build Coastguard Worker if (!propval)
24*cd60bc56SAndroid Build Coastguard Worker return proplen;
25*cd60bc56SAndroid Build Coastguard Worker
26*cd60bc56SAndroid Build Coastguard Worker if ((unsigned)proplen < (len + idx))
27*cd60bc56SAndroid Build Coastguard Worker return -FDT_ERR_NOSPACE;
28*cd60bc56SAndroid Build Coastguard Worker
29*cd60bc56SAndroid Build Coastguard Worker memcpy((char *)propval + idx, val, len);
30*cd60bc56SAndroid Build Coastguard Worker return 0;
31*cd60bc56SAndroid Build Coastguard Worker }
32*cd60bc56SAndroid Build Coastguard Worker
fdt_setprop_inplace(void * fdt,int nodeoffset,const char * name,const void * val,int len)33*cd60bc56SAndroid Build Coastguard Worker int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
34*cd60bc56SAndroid Build Coastguard Worker const void *val, int len)
35*cd60bc56SAndroid Build Coastguard Worker {
36*cd60bc56SAndroid Build Coastguard Worker const void *propval;
37*cd60bc56SAndroid Build Coastguard Worker int proplen;
38*cd60bc56SAndroid Build Coastguard Worker
39*cd60bc56SAndroid Build Coastguard Worker propval = fdt_getprop(fdt, nodeoffset, name, &proplen);
40*cd60bc56SAndroid Build Coastguard Worker if (!propval)
41*cd60bc56SAndroid Build Coastguard Worker return proplen;
42*cd60bc56SAndroid Build Coastguard Worker
43*cd60bc56SAndroid Build Coastguard Worker if (proplen != len)
44*cd60bc56SAndroid Build Coastguard Worker return -FDT_ERR_NOSPACE;
45*cd60bc56SAndroid Build Coastguard Worker
46*cd60bc56SAndroid Build Coastguard Worker return fdt_setprop_inplace_namelen_partial(fdt, nodeoffset, name,
47*cd60bc56SAndroid Build Coastguard Worker strlen(name), 0,
48*cd60bc56SAndroid Build Coastguard Worker val, len);
49*cd60bc56SAndroid Build Coastguard Worker }
50*cd60bc56SAndroid Build Coastguard Worker
fdt_nop_region_(void * start,int len)51*cd60bc56SAndroid Build Coastguard Worker static void fdt_nop_region_(void *start, int len)
52*cd60bc56SAndroid Build Coastguard Worker {
53*cd60bc56SAndroid Build Coastguard Worker fdt32_t *p;
54*cd60bc56SAndroid Build Coastguard Worker
55*cd60bc56SAndroid Build Coastguard Worker for (p = start; (char *)p < ((char *)start + len); p++)
56*cd60bc56SAndroid Build Coastguard Worker *p = cpu_to_fdt32(FDT_NOP);
57*cd60bc56SAndroid Build Coastguard Worker }
58*cd60bc56SAndroid Build Coastguard Worker
fdt_nop_property(void * fdt,int nodeoffset,const char * name)59*cd60bc56SAndroid Build Coastguard Worker int fdt_nop_property(void *fdt, int nodeoffset, const char *name)
60*cd60bc56SAndroid Build Coastguard Worker {
61*cd60bc56SAndroid Build Coastguard Worker struct fdt_property *prop;
62*cd60bc56SAndroid Build Coastguard Worker int len;
63*cd60bc56SAndroid Build Coastguard Worker
64*cd60bc56SAndroid Build Coastguard Worker prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
65*cd60bc56SAndroid Build Coastguard Worker if (!prop)
66*cd60bc56SAndroid Build Coastguard Worker return len;
67*cd60bc56SAndroid Build Coastguard Worker
68*cd60bc56SAndroid Build Coastguard Worker fdt_nop_region_(prop, len + sizeof(*prop));
69*cd60bc56SAndroid Build Coastguard Worker
70*cd60bc56SAndroid Build Coastguard Worker return 0;
71*cd60bc56SAndroid Build Coastguard Worker }
72*cd60bc56SAndroid Build Coastguard Worker
fdt_node_end_offset_(void * fdt,int offset)73*cd60bc56SAndroid Build Coastguard Worker int fdt_node_end_offset_(void *fdt, int offset)
74*cd60bc56SAndroid Build Coastguard Worker {
75*cd60bc56SAndroid Build Coastguard Worker int depth = 0;
76*cd60bc56SAndroid Build Coastguard Worker
77*cd60bc56SAndroid Build Coastguard Worker while ((offset >= 0) && (depth >= 0))
78*cd60bc56SAndroid Build Coastguard Worker offset = fdt_next_node(fdt, offset, &depth);
79*cd60bc56SAndroid Build Coastguard Worker
80*cd60bc56SAndroid Build Coastguard Worker return offset;
81*cd60bc56SAndroid Build Coastguard Worker }
82*cd60bc56SAndroid Build Coastguard Worker
fdt_nop_node(void * fdt,int nodeoffset)83*cd60bc56SAndroid Build Coastguard Worker int fdt_nop_node(void *fdt, int nodeoffset)
84*cd60bc56SAndroid Build Coastguard Worker {
85*cd60bc56SAndroid Build Coastguard Worker int endoffset;
86*cd60bc56SAndroid Build Coastguard Worker
87*cd60bc56SAndroid Build Coastguard Worker endoffset = fdt_node_end_offset_(fdt, nodeoffset);
88*cd60bc56SAndroid Build Coastguard Worker if (endoffset < 0)
89*cd60bc56SAndroid Build Coastguard Worker return endoffset;
90*cd60bc56SAndroid Build Coastguard Worker
91*cd60bc56SAndroid Build Coastguard Worker fdt_nop_region_(fdt_offset_ptr_w(fdt, nodeoffset, 0),
92*cd60bc56SAndroid Build Coastguard Worker endoffset - nodeoffset);
93*cd60bc56SAndroid Build Coastguard Worker return 0;
94*cd60bc56SAndroid Build Coastguard Worker }
95