Home | History | Annotate | Line # | Download | only in dist
      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