Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8941c0c4 authored by Scott Wood's avatar Scott Wood Committed by Paul Mackerras
Browse files

[POWERPC] bootwrapper: Add ft_find_node_by_prop_value().



ft_find_node_by_prop_value() finds nodes with the specified
property/value pair.

Signed-off-by: default avatarScott Wood <scottwood@freescale.com>
Acked-by: default avatarMark A. Greer <mgreer@mvista.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent a9ec7669
Loading
Loading
Loading
Loading
+65 −0
Original line number Diff line number Diff line
@@ -820,6 +820,71 @@ int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
	return -1;
}

void *__ft_find_node_by_prop_value(struct ft_cxt *cxt, void *prev,
                                   const char *propname, const char *propval,
                                   unsigned int proplen)
{
	struct ft_atom atom;
	char *p = ft_root_node(cxt);
	char *next;
	int past_prev = prev ? 0 : 1;
	int depth = -1;

	while ((next = ft_next(cxt, p, &atom)) != NULL) {
		const void *data;
		unsigned int size;

		switch (atom.tag) {
		case OF_DT_BEGIN_NODE:
			depth++;

			if (prev == p) {
				past_prev = 1;
				break;
			}

			if (!past_prev || depth < 1)
				break;

			data = __ft_get_prop(cxt, p, propname, &size);
			if (!data || size != proplen)
				break;
			if (memcmp(data, propval, size))
				break;

			return p;

		case OF_DT_END_NODE:
			if (depth-- == 0)
				return NULL;

			break;
		}

		p = next;
	}

	return NULL;
}

void *ft_find_node_by_prop_value(struct ft_cxt *cxt, const void *prev,
                                 const char *propname, const char *propval,
                                 int proplen)
{
	void *node = NULL;

	if (prev) {
		node = ft_node_ph2node(cxt, prev);

		if (!node)
			return NULL;
	}

	node = __ft_find_node_by_prop_value(cxt, node, propname,
	                                    propval, proplen);
	return ft_get_phandle(cxt, node);
}

int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
		const void *buf, const unsigned int buflen)
{
+3 −0
Original line number Diff line number Diff line
@@ -105,5 +105,8 @@ int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
		const void *buf, const unsigned int buflen);
void *ft_get_parent(struct ft_cxt *cxt, const void *phandle);
void *ft_find_node_by_prop_value(struct ft_cxt *cxt, const void *prev,
                                 const char *propname, const char *propval,
                                 int proplen);

#endif /* FLATDEVTREE_H */