Skip to content

Commit 96a5624

Browse files
dmarionotroan
authored andcommitted
vppinfra: devicetree improvements
Type: improvement Change-Id: If20ae74658702399f626b1af7bd3519e05a5d422 Signed-off-by: Damjan Marion <[email protected]>
1 parent cda500b commit 96a5624

File tree

3 files changed

+63
-6
lines changed

3 files changed

+63
-6
lines changed

.clang-format

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ ForEachMacros:
3535
- 'foreach_vnet_dev_port'
3636
- 'foreach_vnet_dev_args'
3737
- 'foreach_vnet_dev_port_args'
38+
- 'foreach_clib_dt_tree_node'
39+
- 'foreach_clib_dt_child_node'
3840

3941
StatementMacros:
4042
- 'CLIB_MULTIARCH_FN'

src/vppinfra/devicetree.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,16 @@ clib_dt_read_from_sysfs (clib_dt_main_t *dm)
192192
}
193193
#endif
194194

195-
clib_dt_node_t *
196-
clib_dt_get_child_node (clib_dt_node_t *n, char *name)
195+
__clib_export clib_dt_node_t *
196+
clib_dt_get_child_node (clib_dt_node_t *n, char *fmt, ...)
197197
{
198+
u8 *s;
199+
va_list va;
200+
va_start (va, fmt);
201+
s = va_format (0, fmt, &va);
202+
va_end (va);
203+
vec_add1 (s, 0);
204+
198205
vec_foreach_pointer (cn, n->child_nodes)
199206
{
200207
u8 *p = cn->path + vec_len (cn->path) - 1;
@@ -206,15 +213,17 @@ clib_dt_get_child_node (clib_dt_node_t *n, char *name)
206213
if (p[-1] != '/')
207214
continue;
208215

209-
while (p[i] == name[i] && name[i] != 0)
216+
while (p[i] == s[i] && s[i] != 0)
210217
i++;
211218

212-
if (name[i] != 0)
219+
if (s[i] != 0)
213220
continue;
214221

222+
vec_free (s);
215223
return cn;
216224
}
217225

226+
vec_free (s);
218227
return 0;
219228
}
220229

src/vppinfra/devicetree.h

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ typedef struct clib_dt_main
4242
uword *node_by_phandle;
4343
} clib_dt_main_t;
4444

45+
__clib_export clib_dt_node_t *clib_dt_get_child_node (clib_dt_node_t *n,
46+
char *fmt, ...);
4547
clib_dt_node_t *clib_dt_get_node_with_path (clib_dt_main_t *dm, char *fmt,
4648
...);
4749
clib_dt_property_t *clib_dt_get_node_property_by_name (clib_dt_node_t *,
@@ -56,17 +58,61 @@ format_function_t format_clib_dt_desc;
5658
format_function_t format_clib_dt_property_data;
5759

5860
static_always_inline int
59-
clib_dt_proprerty_is_u32 (clib_dt_property_t *p)
61+
clib_dt_property_is_u32 (clib_dt_property_t *p)
6062
{
6163
if (p == 0 || p->size != 4)
6264
return 0;
6365
return 1;
6466
}
6567

6668
static_always_inline u32
67-
clib_dt_proprerty_get_u32 (clib_dt_property_t *p)
69+
clib_dt_property_get_u32 (clib_dt_property_t *p)
6870
{
6971
return clib_net_to_host_u32 (*(u32u *) p->data);
7072
}
7173

74+
static_always_inline char *
75+
clib_dt_property_get_string (clib_dt_property_t *p)
76+
{
77+
return (char *) p->data;
78+
}
79+
80+
static_always_inline clib_dt_node_t *
81+
clib_dt_get_root_node (clib_dt_node_t *n)
82+
{
83+
return n->dt_main->root;
84+
}
85+
86+
static_always_inline clib_dt_node_t *
87+
foreach_clib_dt_tree_node_helper (clib_dt_node_t *first, clib_dt_node_t **prev,
88+
clib_dt_node_t *n)
89+
{
90+
clib_dt_node_t *next;
91+
92+
again:
93+
if ((!*prev || (*prev)->parent != n) && vec_len (n->child_nodes) > 0)
94+
next = n->child_nodes[0];
95+
else if (n->next)
96+
next = n->next;
97+
else
98+
{
99+
next = n->parent;
100+
*prev = n;
101+
n = next;
102+
if (n == first)
103+
return 0;
104+
goto again;
105+
}
106+
107+
*prev = n;
108+
return next == first ? 0 : next;
109+
}
110+
111+
#define foreach_clib_dt_child_node(_cn, _n) \
112+
vec_foreach_pointer (_cn, (_n)->child_nodes)
113+
114+
#define foreach_clib_dt_tree_node(_n, _first) \
115+
for (clib_dt_node_t *__last = 0, *(_n) = _first; _n; \
116+
_n = foreach_clib_dt_tree_node_helper (_first, &__last, _n))
117+
72118
#endif /* CLIB_DEVICETREE_H_ */

0 commit comments

Comments
 (0)