Blame libfdt/fdt_wip.c

Packit Service 0ee8e1
// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
Packit 2ad57b
/*
Packit 2ad57b
 * libfdt - Flat Device Tree manipulation
Packit 2ad57b
 * Copyright (C) 2006 David Gibson, IBM Corporation.
Packit 2ad57b
 */
Packit 2ad57b
#include "libfdt_env.h"
Packit 2ad57b
Packit 2ad57b
#include <fdt.h>
Packit 2ad57b
#include <libfdt.h>
Packit 2ad57b
Packit 2ad57b
#include "libfdt_internal.h"
Packit 2ad57b
Packit 2ad57b
int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,
Packit 2ad57b
					const char *name, int namelen,
Packit 2ad57b
					uint32_t idx, const void *val,
Packit 2ad57b
					int len)
Packit 2ad57b
{
Packit 2ad57b
	void *propval;
Packit 2ad57b
	int proplen;
Packit 2ad57b
Packit 2ad57b
	propval = fdt_getprop_namelen_w(fdt, nodeoffset, name, namelen,
Packit 2ad57b
					&proplen);
Packit 2ad57b
	if (!propval)
Packit 2ad57b
		return proplen;
Packit 2ad57b
Packit 2ad57b
	if (proplen < (len + idx))
Packit 2ad57b
		return -FDT_ERR_NOSPACE;
Packit 2ad57b
Packit 2ad57b
	memcpy((char *)propval + idx, val, len);
Packit 2ad57b
	return 0;
Packit 2ad57b
}
Packit 2ad57b
Packit 2ad57b
int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
Packit 2ad57b
			const void *val, int len)
Packit 2ad57b
{
Packit 2ad57b
	const void *propval;
Packit 2ad57b
	int proplen;
Packit 2ad57b
Packit 2ad57b
	propval = fdt_getprop(fdt, nodeoffset, name, &proplen);
Packit 2ad57b
	if (!propval)
Packit 2ad57b
		return proplen;
Packit 2ad57b
Packit 2ad57b
	if (proplen != len)
Packit 2ad57b
		return -FDT_ERR_NOSPACE;
Packit 2ad57b
Packit 2ad57b
	return fdt_setprop_inplace_namelen_partial(fdt, nodeoffset, name,
Packit 2ad57b
						   strlen(name), 0,
Packit 2ad57b
						   val, len);
Packit 2ad57b
}
Packit 2ad57b
Packit 2ad57b
static void fdt_nop_region_(void *start, int len)
Packit 2ad57b
{
Packit 2ad57b
	fdt32_t *p;
Packit 2ad57b
Packit 2ad57b
	for (p = start; (char *)p < ((char *)start + len); p++)
Packit 2ad57b
		*p = cpu_to_fdt32(FDT_NOP);
Packit 2ad57b
}
Packit 2ad57b
Packit 2ad57b
int fdt_nop_property(void *fdt, int nodeoffset, const char *name)
Packit 2ad57b
{
Packit 2ad57b
	struct fdt_property *prop;
Packit 2ad57b
	int len;
Packit 2ad57b
Packit 2ad57b
	prop = fdt_get_property_w(fdt, nodeoffset, name, &len;;
Packit 2ad57b
	if (!prop)
Packit 2ad57b
		return len;
Packit 2ad57b
Packit 2ad57b
	fdt_nop_region_(prop, len + sizeof(*prop));
Packit 2ad57b
Packit 2ad57b
	return 0;
Packit 2ad57b
}
Packit 2ad57b
Packit 2ad57b
int fdt_node_end_offset_(void *fdt, int offset)
Packit 2ad57b
{
Packit 2ad57b
	int depth = 0;
Packit 2ad57b
Packit 2ad57b
	while ((offset >= 0) && (depth >= 0))
Packit 2ad57b
		offset = fdt_next_node(fdt, offset, &depth);
Packit 2ad57b
Packit 2ad57b
	return offset;
Packit 2ad57b
}
Packit 2ad57b
Packit 2ad57b
int fdt_nop_node(void *fdt, int nodeoffset)
Packit 2ad57b
{
Packit 2ad57b
	int endoffset;
Packit 2ad57b
Packit 2ad57b
	endoffset = fdt_node_end_offset_(fdt, nodeoffset);
Packit 2ad57b
	if (endoffset < 0)
Packit 2ad57b
		return endoffset;
Packit 2ad57b
Packit 2ad57b
	fdt_nop_region_(fdt_offset_ptr_w(fdt, nodeoffset, 0),
Packit 2ad57b
			endoffset - nodeoffset);
Packit 2ad57b
	return 0;
Packit 2ad57b
}