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