Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) /* SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) #ifndef LIBFDT_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3) #define LIBFDT_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  * libfdt - Flat Device Tree manipulation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  * Copyright (C) 2006 David Gibson, IBM Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9) #include "libfdt_env.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10) #include "fdt.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) #ifdef __cplusplus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) extern "C" {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) #define FDT_FIRST_SUPPORTED_VERSION	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) #define FDT_LAST_COMPATIBLE_VERSION 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #define FDT_LAST_SUPPORTED_VERSION	0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) /* Error codes: informative error codes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) #define FDT_ERR_NOTFOUND	1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) 	/* FDT_ERR_NOTFOUND: The requested node or property does not exist */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) #define FDT_ERR_EXISTS		2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) 	/* FDT_ERR_EXISTS: Attempted to create a node or property which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) 	 * already exists */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) #define FDT_ERR_NOSPACE		3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) 	/* FDT_ERR_NOSPACE: Operation needed to expand the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) 	 * tree, but its buffer did not have sufficient space to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) 	 * contain the expanded tree. Use fdt_open_into() to move the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) 	 * device tree to a buffer with more space. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) /* Error codes: codes for bad parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) #define FDT_ERR_BADOFFSET	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) 	/* FDT_ERR_BADOFFSET: Function was passed a structure block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) 	 * offset which is out-of-bounds, or which points to an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) 	 * unsuitable part of the structure for the operation. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) #define FDT_ERR_BADPATH		5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) 	/* FDT_ERR_BADPATH: Function was passed a badly formatted path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) 	 * (e.g. missing a leading / for a function which requires an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) 	 * absolute path) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) #define FDT_ERR_BADPHANDLE	6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) 	/* FDT_ERR_BADPHANDLE: Function was passed an invalid phandle.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) 	 * This can be caused either by an invalid phandle property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) 	 * length, or the phandle value was either 0 or -1, which are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) 	 * not permitted. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) #define FDT_ERR_BADSTATE	7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) 	/* FDT_ERR_BADSTATE: Function was passed an incomplete device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) 	 * tree created by the sequential-write functions, which is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) 	 * not sufficiently complete for the requested operation. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) /* Error codes: codes for bad device tree blobs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) #define FDT_ERR_TRUNCATED	8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) 	/* FDT_ERR_TRUNCATED: FDT or a sub-block is improperly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) 	 * terminated (overflows, goes outside allowed bounds, or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) 	 * isn't properly terminated).  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) #define FDT_ERR_BADMAGIC	9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 	/* FDT_ERR_BADMAGIC: Given "device tree" appears not to be a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) 	 * device tree at all - it is missing the flattened device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 	 * tree magic number. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) #define FDT_ERR_BADVERSION	10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) 	/* FDT_ERR_BADVERSION: Given device tree has a version which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) 	 * can't be handled by the requested operation.  For
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 	 * read-write functions, this may mean that fdt_open_into() is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) 	 * required to convert the tree to the expected version. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) #define FDT_ERR_BADSTRUCTURE	11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) 	/* FDT_ERR_BADSTRUCTURE: Given device tree has a corrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 	 * structure block or other serious error (e.g. misnested
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) 	 * nodes, or subnodes preceding properties). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) #define FDT_ERR_BADLAYOUT	12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) 	/* FDT_ERR_BADLAYOUT: For read-write functions, the given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) 	 * device tree has it's sub-blocks in an order that the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) 	 * function can't handle (memory reserve map, then structure,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) 	 * then strings).  Use fdt_open_into() to reorganize the tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 	 * into a form suitable for the read-write operations. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) /* "Can't happen" error indicating a bug in libfdt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) #define FDT_ERR_INTERNAL	13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 	/* FDT_ERR_INTERNAL: libfdt has failed an internal assertion.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) 	 * Should never be returned, if it is, it indicates a bug in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 	 * libfdt itself. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) /* Errors in device tree content */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) #define FDT_ERR_BADNCELLS	14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) 	/* FDT_ERR_BADNCELLS: Device tree has a #address-cells, #size-cells
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 	 * or similar property with a bad format or value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) #define FDT_ERR_BADVALUE	15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) 	/* FDT_ERR_BADVALUE: Device tree has a property with an unexpected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 	 * value. For example: a property expected to contain a string list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) 	 * is not NUL-terminated within the length of its value. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) #define FDT_ERR_BADOVERLAY	16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) 	/* FDT_ERR_BADOVERLAY: The device tree overlay, while
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) 	 * correctly structured, cannot be applied due to some
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) 	 * unexpected or missing value, property or node. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) #define FDT_ERR_NOPHANDLES	17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) 	/* FDT_ERR_NOPHANDLES: The device tree doesn't have any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) 	 * phandle available anymore without causing an overflow */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) #define FDT_ERR_BADFLAGS	18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) 	/* FDT_ERR_BADFLAGS: The function was passed a flags field that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) 	 * contains invalid flags or an invalid combination of flags. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) #define FDT_ERR_ALIGNMENT	19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) 	/* FDT_ERR_ALIGNMENT: The device tree base address is not 8-byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 	 * aligned. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) #define FDT_ERR_MAX		19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) /* constants */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) #define FDT_MAX_PHANDLE 0xfffffffe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) 	/* Valid values for phandles range from 1 to 2^32-2. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) /* Low-level functions (you probably don't need these)                */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) #ifndef SWIG /* This function is not useful in Python */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int checklen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) 	return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130)  * External helpers to access words from a device tree blob. They're built
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131)  * to work even with unaligned pointers on platforms (such as ARMv5) that don't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132)  * like unaligned loads and stores.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) static inline uint32_t fdt32_ld(const fdt32_t *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) 	const uint8_t *bp = (const uint8_t *)p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 	return ((uint32_t)bp[0] << 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 		| ((uint32_t)bp[1] << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) 		| ((uint32_t)bp[2] << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 		| bp[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) static inline void fdt32_st(void *property, uint32_t value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 	uint8_t *bp = (uint8_t *)property;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 	bp[0] = value >> 24;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 	bp[1] = (value >> 16) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) 	bp[2] = (value >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 	bp[3] = value & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) static inline uint64_t fdt64_ld(const fdt64_t *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 	const uint8_t *bp = (const uint8_t *)p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 	return ((uint64_t)bp[0] << 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 		| ((uint64_t)bp[1] << 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 		| ((uint64_t)bp[2] << 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) 		| ((uint64_t)bp[3] << 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 		| ((uint64_t)bp[4] << 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 		| ((uint64_t)bp[5] << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 		| ((uint64_t)bp[6] << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 		| bp[7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) static inline void fdt64_st(void *property, uint64_t value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 	uint8_t *bp = (uint8_t *)property;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) 	bp[0] = value >> 56;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) 	bp[1] = (value >> 48) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 	bp[2] = (value >> 40) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) 	bp[3] = (value >> 32) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) 	bp[4] = (value >> 24) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) 	bp[5] = (value >> 16) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 	bp[6] = (value >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 	bp[7] = value & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) /* Traversal functions                                                */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) int fdt_next_node(const void *fdt, int offset, int *depth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189)  * fdt_first_subnode() - get offset of first direct subnode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190)  * @fdt:	FDT blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191)  * @offset:	Offset of node to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193)  * Return: offset of first subnode, or -FDT_ERR_NOTFOUND if there is none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) int fdt_first_subnode(const void *fdt, int offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198)  * fdt_next_subnode() - get offset of next direct subnode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199)  * @fdt:	FDT blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200)  * @offset:	Offset of previous subnode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202)  * After first calling fdt_first_subnode(), call this function repeatedly to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203)  * get direct subnodes of a parent node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205)  * Return: offset of next subnode, or -FDT_ERR_NOTFOUND if there are no more
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206)  *         subnodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) int fdt_next_subnode(const void *fdt, int offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211)  * fdt_for_each_subnode - iterate over all subnodes of a parent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213)  * @node:	child node (int, lvalue)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214)  * @fdt:	FDT blob (const void *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215)  * @parent:	parent node (int)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217)  * This is actually a wrapper around a for loop and would be used like so:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219)  *	fdt_for_each_subnode(node, fdt, parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220)  *		Use node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221)  *		...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222)  *	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224)  *	if ((node < 0) && (node != -FDT_ERR_NOTFOUND)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225)  *		Error handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226)  *	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228)  * Note that this is implemented as a macro and @node is used as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229)  * iterator in the loop. The parent variable be constant or even a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230)  * literal.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) #define fdt_for_each_subnode(node, fdt, parent)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 	for (node = fdt_first_subnode(fdt, parent);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 	     node >= 0;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 	     node = fdt_next_subnode(fdt, node))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) /* General functions                                                  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) #define fdt_get_header(fdt, field) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 	(fdt32_ld(&((const struct fdt_header *)(fdt))->field))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) #define fdt_magic(fdt)			(fdt_get_header(fdt, magic))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) #define fdt_totalsize(fdt)		(fdt_get_header(fdt, totalsize))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) #define fdt_off_dt_struct(fdt)		(fdt_get_header(fdt, off_dt_struct))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) #define fdt_off_dt_strings(fdt)		(fdt_get_header(fdt, off_dt_strings))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) #define fdt_off_mem_rsvmap(fdt)		(fdt_get_header(fdt, off_mem_rsvmap))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) #define fdt_version(fdt)		(fdt_get_header(fdt, version))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) #define fdt_last_comp_version(fdt)	(fdt_get_header(fdt, last_comp_version))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) #define fdt_boot_cpuid_phys(fdt)	(fdt_get_header(fdt, boot_cpuid_phys))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) #define fdt_size_dt_strings(fdt)	(fdt_get_header(fdt, size_dt_strings))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) #define fdt_size_dt_struct(fdt)		(fdt_get_header(fdt, size_dt_struct))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) #define fdt_set_hdr_(name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 	static inline void fdt_set_##name(void *fdt, uint32_t val) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	{ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 		struct fdt_header *fdth = (struct fdt_header *)fdt; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 		fdth->name = cpu_to_fdt32(val); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) fdt_set_hdr_(magic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) fdt_set_hdr_(totalsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) fdt_set_hdr_(off_dt_struct);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) fdt_set_hdr_(off_dt_strings);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) fdt_set_hdr_(off_mem_rsvmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) fdt_set_hdr_(version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) fdt_set_hdr_(last_comp_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) fdt_set_hdr_(boot_cpuid_phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) fdt_set_hdr_(size_dt_strings);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) fdt_set_hdr_(size_dt_struct);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) #undef fdt_set_hdr_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272)  * fdt_header_size - return the size of the tree's header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273)  * @fdt: pointer to a flattened device tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275)  * Return: size of DTB header in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) size_t fdt_header_size(const void *fdt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280)  * fdt_header_size_ - internal function to get header size from a version number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281)  * @version: devicetree version number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283)  * Return: size of DTB header in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) size_t fdt_header_size_(uint32_t version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288)  * fdt_check_header - sanity check a device tree header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289)  * @fdt: pointer to data which might be a flattened device tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291)  * fdt_check_header() checks that the given buffer contains what
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292)  * appears to be a flattened device tree, and that the header contains
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293)  * valid information (to the extent that can be determined from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294)  * header alone).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297)  *     0, if the buffer appears to contain a valid device tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298)  *     -FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299)  *     -FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300)  *     -FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301)  *     -FDT_ERR_TRUNCATED, standard meanings, as above
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) int fdt_check_header(const void *fdt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306)  * fdt_move - move a device tree around in memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307)  * @fdt: pointer to the device tree to move
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308)  * @buf: pointer to memory where the device is to be moved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309)  * @bufsize: size of the memory space at buf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311)  * fdt_move() relocates, if possible, the device tree blob located at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312)  * fdt to the buffer at buf of size bufsize.  The buffer may overlap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313)  * with the existing device tree blob at fdt.  Therefore,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314)  *     fdt_move(fdt, fdt, fdt_totalsize(fdt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315)  * should always succeed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318)  *     0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319)  *     -FDT_ERR_NOSPACE, bufsize is insufficient to contain the device tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320)  *     -FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321)  *     -FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322)  *     -FDT_ERR_BADSTATE, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) int fdt_move(const void *fdt, void *buf, int bufsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) /* Read-only functions                                                */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) int fdt_check_full(const void *fdt, size_t bufsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333)  * fdt_get_string - retrieve a string from the strings block of a device tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335)  * @stroffset: offset of the string within the strings block (native endian)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336)  * @lenp: optional pointer to return the string's length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338)  * fdt_get_string() retrieves a pointer to a single string from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339)  * strings block of the device tree blob at fdt, and optionally also
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340)  * returns the string's length in *lenp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343)  *     a pointer to the string, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344)  *     NULL, if stroffset is out of bounds, or doesn't point to a valid string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) const char *fdt_get_string(const void *fdt, int stroffset, int *lenp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349)  * fdt_string - retrieve a string from the strings block of a device tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351)  * @stroffset: offset of the string within the strings block (native endian)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353)  * fdt_string() retrieves a pointer to a single string from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354)  * strings block of the device tree blob at fdt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357)  *     a pointer to the string, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358)  *     NULL, if stroffset is out of bounds, or doesn't point to a valid string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) const char *fdt_string(const void *fdt, int stroffset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363)  * fdt_find_max_phandle - find and return the highest phandle in a tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365)  * @phandle: return location for the highest phandle value found in the tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367)  * fdt_find_max_phandle() finds the highest phandle value in the given device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368)  * tree. The value returned in @phandle is only valid if the function returns
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369)  * success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372)  *     0 on success or a negative error code on failure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) int fdt_find_max_phandle(const void *fdt, uint32_t *phandle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377)  * fdt_get_max_phandle - retrieves the highest phandle in a tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380)  * fdt_get_max_phandle retrieves the highest phandle in the given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381)  * device tree. This will ignore badly formatted phandles, or phandles
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382)  * with a value of 0 or -1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384)  * This function is deprecated in favour of fdt_find_max_phandle().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387)  *      the highest phandle on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388)  *      0, if no phandle was found in the device tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389)  *      -1, if an error occurred
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) static inline uint32_t fdt_get_max_phandle(const void *fdt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 	uint32_t phandle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 	err = fdt_find_max_phandle(fdt, &phandle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 		return (uint32_t)-1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 	return phandle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404)  * fdt_generate_phandle - return a new, unused phandle for a device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406)  * @phandle: return location for the new phandle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408)  * Walks the device tree blob and looks for the highest phandle value. On
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409)  * success, the new, unused phandle value (one higher than the previously
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410)  * highest phandle value in the device tree blob) will be returned in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411)  * @phandle parameter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413)  * Return: 0 on success or a negative error-code on failure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) int fdt_generate_phandle(const void *fdt, uint32_t *phandle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418)  * fdt_num_mem_rsv - retrieve the number of memory reserve map entries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421)  * Returns the number of entries in the device tree blob's memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422)  * reservation map.  This does not include the terminating 0,0 entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423)  * or any other (0,0) entries reserved for expansion.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426)  *     the number of entries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) int fdt_num_mem_rsv(const void *fdt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431)  * fdt_get_mem_rsv - retrieve one memory reserve map entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433)  * @n: index of reserve map entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434)  * @address: pointer to 64-bit variable to hold the start address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435)  * @size: pointer to 64-bit variable to hold the size of the entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437)  * On success, @address and @size will contain the address and size of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438)  * the n-th reserve map entry from the device tree blob, in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439)  * native-endian format.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442)  *     0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443)  *     -FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444)  *     -FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445)  *     -FDT_ERR_BADSTATE, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450)  * fdt_subnode_offset_namelen - find a subnode based on substring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452)  * @parentoffset: structure block offset of a node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453)  * @name: name of the subnode to locate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454)  * @namelen: number of characters of name to consider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456)  * Identical to fdt_subnode_offset(), but only examine the first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457)  * namelen characters of name for matching the subnode name.  This is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458)  * useful for finding subnodes based on a portion of a larger string,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459)  * such as a full path.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461)  * Return: offset of the subnode or -FDT_ERR_NOTFOUND if name not found.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) #ifndef SWIG /* Not available in Python */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 			       const char *name, int namelen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468)  * fdt_subnode_offset - find a subnode of a given node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470)  * @parentoffset: structure block offset of a node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471)  * @name: name of the subnode to locate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473)  * fdt_subnode_offset() finds a subnode of the node at structure block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474)  * offset parentoffset with the given name.  name may include a unit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475)  * address, in which case fdt_subnode_offset() will find the subnode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476)  * with that unit address, or the unit address may be omitted, in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477)  * which case fdt_subnode_offset() will find an arbitrary subnode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478)  * whose name excluding unit address matches the given name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481)  *	structure block offset of the requested subnode (>=0), on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482)  *	-FDT_ERR_NOTFOUND, if the requested subnode does not exist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483)  *	-FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484)  *		tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489)  *	-FDT_ERR_TRUNCATED, standard meanings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494)  * fdt_path_offset_namelen - find a tree node by its full path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496)  * @path: full path of the node to locate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497)  * @namelen: number of characters of path to consider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499)  * Identical to fdt_path_offset(), but only consider the first namelen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500)  * characters of path as the path name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502)  * Return: offset of the node or negative libfdt error value otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) #ifndef SWIG /* Not available in Python */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509)  * fdt_path_offset - find a tree node by its full path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511)  * @path: full path of the node to locate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513)  * fdt_path_offset() finds a node of a given path in the device tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514)  * Each path component may omit the unit address portion, but the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515)  * results of this are undefined if any such path component is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516)  * ambiguous (that is if there are multiple nodes at the relevant
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517)  * level matching the given component, differentiated only by unit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518)  * address).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521)  *	structure block offset of the node with the requested path (>=0), on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522)  *		success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523)  *	-FDT_ERR_BADPATH, given path does not begin with '/' or is invalid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524)  *	-FDT_ERR_NOTFOUND, if the requested node does not exist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525)  *      -FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529)  *	-FDT_ERR_TRUNCATED, standard meanings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) int fdt_path_offset(const void *fdt, const char *path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534)  * fdt_get_name - retrieve the name of a given node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536)  * @nodeoffset: structure block offset of the starting node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537)  * @lenp: pointer to an integer variable (will be overwritten) or NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539)  * fdt_get_name() retrieves the name (including unit address) of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540)  * device tree node at structure block offset nodeoffset.  If lenp is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541)  * non-NULL, the length of this name is also returned, in the integer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542)  * pointed to by lenp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545)  *	pointer to the node's name, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546)  *		If lenp is non-NULL, *lenp contains the length of that name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547)  *			(>=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548)  *	NULL, on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549)  *		if lenp is non-NULL *lenp contains an error code (<0):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550)  *		-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551)  *			tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552)  *		-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553)  *		-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554)  *		-FDT_ERR_BADSTATE, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) const char *fdt_get_name(const void *fdt, int nodeoffset, int *lenp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559)  * fdt_first_property_offset - find the offset of a node's first property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561)  * @nodeoffset: structure block offset of a node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563)  * fdt_first_property_offset() finds the first property of the node at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564)  * the given structure block offset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567)  *	structure block offset of the property (>=0), on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568)  *	-FDT_ERR_NOTFOUND, if the requested node has no properties
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569)  *	-FDT_ERR_BADOFFSET, if nodeoffset did not point to an FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570)  *      -FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574)  *	-FDT_ERR_TRUNCATED, standard meanings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) int fdt_first_property_offset(const void *fdt, int nodeoffset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579)  * fdt_next_property_offset - step through a node's properties
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581)  * @offset: structure block offset of a property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583)  * fdt_next_property_offset() finds the property immediately after the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584)  * one at the given structure block offset.  This will be a property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585)  * of the same node as the given property.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588)  *	structure block offset of the next property (>=0), on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589)  *	-FDT_ERR_NOTFOUND, if the given property is the last in its node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590)  *	-FDT_ERR_BADOFFSET, if nodeoffset did not point to an FDT_PROP tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591)  *      -FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595)  *	-FDT_ERR_TRUNCATED, standard meanings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) int fdt_next_property_offset(const void *fdt, int offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600)  * fdt_for_each_property_offset - iterate over all properties of a node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602)  * @property:	property offset (int, lvalue)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603)  * @fdt:	FDT blob (const void *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604)  * @node:	node offset (int)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606)  * This is actually a wrapper around a for loop and would be used like so:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608)  *	fdt_for_each_property_offset(property, fdt, node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609)  *		Use property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610)  *		...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611)  *	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613)  *	if ((property < 0) && (property != -FDT_ERR_NOTFOUND)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614)  *		Error handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615)  *	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617)  * Note that this is implemented as a macro and property is used as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618)  * iterator in the loop. The node variable can be constant or even a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619)  * literal.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) #define fdt_for_each_property_offset(property, fdt, node)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 	for (property = fdt_first_property_offset(fdt, node);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 	     property >= 0;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 	     property = fdt_next_property_offset(fdt, property))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627)  * fdt_get_property_by_offset - retrieve the property at a given offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629)  * @offset: offset of the property to retrieve
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630)  * @lenp: pointer to an integer variable (will be overwritten) or NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632)  * fdt_get_property_by_offset() retrieves a pointer to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633)  * fdt_property structure within the device tree blob at the given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634)  * offset.  If lenp is non-NULL, the length of the property value is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635)  * also returned, in the integer pointed to by lenp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637)  * Note that this code only works on device tree versions >= 16. fdt_getprop()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638)  * works on all versions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641)  *	pointer to the structure representing the property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642)  *		if lenp is non-NULL, *lenp contains the length of the property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643)  *		value (>=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644)  *	NULL, on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645)  *		if lenp is non-NULL, *lenp contains an error code (<0):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646)  *		-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_PROP tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647)  *		-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648)  *		-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649)  *		-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650)  *		-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651)  *		-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) const struct fdt_property *fdt_get_property_by_offset(const void *fdt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 						      int offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 						      int *lenp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658)  * fdt_get_property_namelen - find a property based on substring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660)  * @nodeoffset: offset of the node whose property to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661)  * @name: name of the property to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662)  * @namelen: number of characters of name to consider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663)  * @lenp: pointer to an integer variable (will be overwritten) or NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665)  * Identical to fdt_get_property(), but only examine the first namelen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666)  * characters of name for matching the property name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668)  * Return: pointer to the structure representing the property, or NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669)  *         if not found
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) #ifndef SWIG /* Not available in Python */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) const struct fdt_property *fdt_get_property_namelen(const void *fdt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 						    int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 						    const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 						    int namelen, int *lenp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679)  * fdt_get_property - find a given property in a given node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681)  * @nodeoffset: offset of the node whose property to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682)  * @name: name of the property to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683)  * @lenp: pointer to an integer variable (will be overwritten) or NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685)  * fdt_get_property() retrieves a pointer to the fdt_property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686)  * structure within the device tree blob corresponding to the property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687)  * named 'name' of the node at offset nodeoffset.  If lenp is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688)  * non-NULL, the length of the property value is also returned, in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689)  * integer pointed to by lenp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692)  *	pointer to the structure representing the property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693)  *		if lenp is non-NULL, *lenp contains the length of the property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694)  *		value (>=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695)  *	NULL, on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696)  *		if lenp is non-NULL, *lenp contains an error code (<0):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697)  *		-FDT_ERR_NOTFOUND, node does not have named property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698)  *		-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699)  *			tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700)  *		-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701)  *		-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702)  *		-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703)  *		-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704)  *		-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) const struct fdt_property *fdt_get_property(const void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 					    const char *name, int *lenp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 						      const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 						      int *lenp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 	return (struct fdt_property *)(uintptr_t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 		fdt_get_property(fdt, nodeoffset, name, lenp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717)  * fdt_getprop_by_offset - retrieve the value of a property at a given offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719)  * @offset: offset of the property to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720)  * @namep: pointer to a string variable (will be overwritten) or NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721)  * @lenp: pointer to an integer variable (will be overwritten) or NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723)  * fdt_getprop_by_offset() retrieves a pointer to the value of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724)  * property at structure block offset 'offset' (this will be a pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725)  * to within the device blob itself, not a copy of the value).  If
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726)  * lenp is non-NULL, the length of the property value is also
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727)  * returned, in the integer pointed to by lenp.  If namep is non-NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728)  * the property's namne will also be returned in the char * pointed to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729)  * by namep (this will be a pointer to within the device tree's string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730)  * block, not a new copy of the name).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733)  *	pointer to the property's value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734)  *		if lenp is non-NULL, *lenp contains the length of the property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735)  *		value (>=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736)  *		if namep is non-NULL *namep contiains a pointer to the property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737)  *		name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738)  *	NULL, on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739)  *		if lenp is non-NULL, *lenp contains an error code (<0):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740)  *		-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_PROP tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741)  *		-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742)  *		-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743)  *		-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744)  *		-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745)  *		-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) #ifndef SWIG /* This function is not useful in Python */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) const void *fdt_getprop_by_offset(const void *fdt, int offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 				  const char **namep, int *lenp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753)  * fdt_getprop_namelen - get property value based on substring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755)  * @nodeoffset: offset of the node whose property to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756)  * @name: name of the property to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757)  * @namelen: number of characters of name to consider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758)  * @lenp: pointer to an integer variable (will be overwritten) or NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760)  * Identical to fdt_getprop(), but only examine the first namelen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761)  * characters of name for matching the property name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763)  * Return: pointer to the property's value or NULL on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) #ifndef SWIG /* Not available in Python */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 				const char *name, int namelen, int *lenp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) static inline void *fdt_getprop_namelen_w(void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 					  const char *name, int namelen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 					  int *lenp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 	return (void *)(uintptr_t)fdt_getprop_namelen(fdt, nodeoffset, name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 						      namelen, lenp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778)  * fdt_getprop - retrieve the value of a given property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780)  * @nodeoffset: offset of the node whose property to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781)  * @name: name of the property to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782)  * @lenp: pointer to an integer variable (will be overwritten) or NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784)  * fdt_getprop() retrieves a pointer to the value of the property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785)  * named @name of the node at offset @nodeoffset (this will be a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786)  * pointer to within the device blob itself, not a copy of the value).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787)  * If @lenp is non-NULL, the length of the property value is also
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788)  * returned, in the integer pointed to by @lenp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791)  *	pointer to the property's value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792)  *		if lenp is non-NULL, *lenp contains the length of the property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793)  *		value (>=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794)  *	NULL, on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795)  *		if lenp is non-NULL, *lenp contains an error code (<0):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796)  *		-FDT_ERR_NOTFOUND, node does not have named property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797)  *		-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798)  *			tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799)  *		-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800)  *		-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801)  *		-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802)  *		-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803)  *		-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) const void *fdt_getprop(const void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 			const char *name, int *lenp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) static inline void *fdt_getprop_w(void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 				  const char *name, int *lenp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 	return (void *)(uintptr_t)fdt_getprop(fdt, nodeoffset, name, lenp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814)  * fdt_get_phandle - retrieve the phandle of a given node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816)  * @nodeoffset: structure block offset of the node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818)  * fdt_get_phandle() retrieves the phandle of the device tree node at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819)  * structure block offset nodeoffset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822)  *	the phandle of the node at nodeoffset, on success (!= 0, != -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823)  *	0, if the node has no phandle, or another error occurs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828)  * fdt_get_alias_namelen - get alias based on substring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830)  * @name: name of the alias th look up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831)  * @namelen: number of characters of name to consider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833)  * Identical to fdt_get_alias(), but only examine the first @namelen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834)  * characters of @name for matching the alias name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836)  * Return: a pointer to the expansion of the alias named @name, if it exists,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837)  *	   NULL otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) #ifndef SWIG /* Not available in Python */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) const char *fdt_get_alias_namelen(const void *fdt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 				  const char *name, int namelen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845)  * fdt_get_alias - retrieve the path referenced by a given alias
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847)  * @name: name of the alias th look up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849)  * fdt_get_alias() retrieves the value of a given alias.  That is, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850)  * value of the property named @name in the node /aliases.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853)  *	a pointer to the expansion of the alias named 'name', if it exists
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854)  *	NULL, if the given alias or the /aliases node does not exist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) const char *fdt_get_alias(const void *fdt, const char *name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859)  * fdt_get_path - determine the full path of a node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861)  * @nodeoffset: offset of the node whose path to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862)  * @buf: character buffer to contain the returned path (will be overwritten)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863)  * @buflen: size of the character buffer at buf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865)  * fdt_get_path() computes the full path of the node at offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866)  * nodeoffset, and records that path in the buffer at buf.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868)  * NOTE: This function is expensive, as it must scan the device tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869)  * structure from the start to nodeoffset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873)  *		buf contains the absolute path of the node at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874)  *		nodeoffset, as a NUL-terminated string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875)  *	-FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876)  *	-FDT_ERR_NOSPACE, the path of the given node is longer than (bufsize-1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877)  *		characters and will not fit in the given buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881)  *	-FDT_ERR_BADSTRUCTURE, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886)  * fdt_supernode_atdepth_offset - find a specific ancestor of a node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888)  * @nodeoffset: offset of the node whose parent to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889)  * @supernodedepth: depth of the ancestor to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890)  * @nodedepth: pointer to an integer variable (will be overwritten) or NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892)  * fdt_supernode_atdepth_offset() finds an ancestor of the given node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893)  * at a specific depth from the root (where the root itself has depth
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894)  * 0, its immediate subnodes depth 1 and so forth).  So
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895)  *	fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896)  * will always return 0, the offset of the root node.  If the node at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897)  * nodeoffset has depth D, then:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898)  *	fdt_supernode_atdepth_offset(fdt, nodeoffset, D, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899)  * will return nodeoffset itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901)  * NOTE: This function is expensive, as it must scan the device tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902)  * structure from the start to nodeoffset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905)  *	structure block offset of the node at node offset's ancestor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906)  *		of depth supernodedepth (>=0), on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907)  *	-FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908)  *	-FDT_ERR_NOTFOUND, supernodedepth was greater than the depth of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909)  *		nodeoffset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913)  *	-FDT_ERR_BADSTRUCTURE, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 				 int supernodedepth, int *nodedepth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919)  * fdt_node_depth - find the depth of a given node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921)  * @nodeoffset: offset of the node whose parent to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923)  * fdt_node_depth() finds the depth of a given node.  The root node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924)  * has depth 0, its immediate subnodes depth 1 and so forth.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926)  * NOTE: This function is expensive, as it must scan the device tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927)  * structure from the start to nodeoffset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930)  *	depth of the node at nodeoffset (>=0), on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931)  *	-FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935)  *	-FDT_ERR_BADSTRUCTURE, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) int fdt_node_depth(const void *fdt, int nodeoffset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940)  * fdt_parent_offset - find the parent of a given node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942)  * @nodeoffset: offset of the node whose parent to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944)  * fdt_parent_offset() locates the parent node of a given node (that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945)  * is, it finds the offset of the node which contains the node at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946)  * nodeoffset as a subnode).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948)  * NOTE: This function is expensive, as it must scan the device tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949)  * structure from the start to nodeoffset, *twice*.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952)  *	structure block offset of the parent of the node at nodeoffset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953)  *		(>=0), on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954)  *	-FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958)  *	-FDT_ERR_BADSTRUCTURE, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) int fdt_parent_offset(const void *fdt, int nodeoffset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963)  * fdt_node_offset_by_prop_value - find nodes with a given property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965)  * @startoffset: only find nodes after this offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966)  * @propname: property name to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967)  * @propval: property value to search for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968)  * @proplen: length of the value in propval
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970)  * fdt_node_offset_by_prop_value() returns the offset of the first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971)  * node after startoffset, which has a property named propname whose
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972)  * value is of length proplen and has value equal to propval; or if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973)  * startoffset is -1, the very first such node in the tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975)  * To iterate through all nodes matching the criterion, the following
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976)  * idiom can be used:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977)  *	offset = fdt_node_offset_by_prop_value(fdt, -1, propname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978)  *					       propval, proplen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979)  *	while (offset != -FDT_ERR_NOTFOUND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980)  *		// other code here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981)  *		offset = fdt_node_offset_by_prop_value(fdt, offset, propname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982)  *						       propval, proplen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983)  *	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985)  * Note the -1 in the first call to the function, if 0 is used here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986)  * instead, the function will never locate the root node, even if it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987)  * matches the criterion.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990)  *	structure block offset of the located node (>= 0, >startoffset),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991)  *		 on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992)  *	-FDT_ERR_NOTFOUND, no node matching the criterion exists in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993)  *		tree after startoffset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994)  *	-FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998)  *	-FDT_ERR_BADSTRUCTURE, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 				  const char *propname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 				  const void *propval, int proplen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005)  * fdt_node_offset_by_phandle - find the node with a given phandle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007)  * @phandle: phandle value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)  * fdt_node_offset_by_phandle() returns the offset of the node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010)  * which has the given phandle value.  If there is more than one node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011)  * in the tree with the given phandle (an invalid tree), results are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012)  * undefined.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)  *	structure block offset of the located node (>= 0), on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016)  *	-FDT_ERR_NOTFOUND, no node with that phandle exists
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)  *	-FDT_ERR_BADPHANDLE, given phandle value was invalid (0 or -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021)  *	-FDT_ERR_BADSTRUCTURE, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)  * fdt_node_check_compatible - check a node's compatible property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028)  * @nodeoffset: offset of a tree node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029)  * @compatible: string to match against
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031)  * fdt_node_check_compatible() returns 0 if the given node contains a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032)  * @compatible property with the given string as one of its elements,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)  * it returns non-zero otherwise, or on error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036)  *	0, if the node has a 'compatible' property listing the given string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037)  *	1, if the node has a 'compatible' property, but it does not list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038)  *		the given string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039)  *	-FDT_ERR_NOTFOUND, if the given node has no 'compatible' property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040)  *	-FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044)  *	-FDT_ERR_BADSTRUCTURE, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) int fdt_node_check_compatible(const void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 			      const char *compatible);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050)  * fdt_node_offset_by_compatible - find nodes with a given 'compatible' value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052)  * @startoffset: only find nodes after this offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)  * @compatible: 'compatible' string to match against
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055)  * fdt_node_offset_by_compatible() returns the offset of the first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056)  * node after startoffset, which has a 'compatible' property which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)  * lists the given compatible string; or if startoffset is -1, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058)  * very first such node in the tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060)  * To iterate through all nodes matching the criterion, the following
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061)  * idiom can be used:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062)  *	offset = fdt_node_offset_by_compatible(fdt, -1, compatible);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063)  *	while (offset != -FDT_ERR_NOTFOUND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064)  *		// other code here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)  *		offset = fdt_node_offset_by_compatible(fdt, offset, compatible);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)  *	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)  * Note the -1 in the first call to the function, if 0 is used here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069)  * instead, the function will never locate the root node, even if it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070)  * matches the criterion.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073)  *	structure block offset of the located node (>= 0, >startoffset),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074)  *		 on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075)  *	-FDT_ERR_NOTFOUND, no node matching the criterion exists in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076)  *		tree after startoffset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)  *	-FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081)  *	-FDT_ERR_BADSTRUCTURE, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 				  const char *compatible);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087)  * fdt_stringlist_contains - check a string list property for a string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088)  * @strlist: Property containing a list of strings to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)  * @listlen: Length of property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)  * @str: String to search for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092)  * This is a utility function provided for convenience. The list contains
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093)  * one or more strings, each terminated by \0, as is found in a device tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094)  * "compatible" property.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096)  * Return: 1 if the string is found in the list, 0 not found, or invalid list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) int fdt_stringlist_contains(const char *strlist, int listlen, const char *str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101)  * fdt_stringlist_count - count the number of strings in a string list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103)  * @nodeoffset: offset of a tree node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104)  * @property: name of the property containing the string list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)  * Return:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107)  *   the number of strings in the given property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108)  *   -FDT_ERR_BADVALUE if the property value is not NUL-terminated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109)  *   -FDT_ERR_NOTFOUND if the property does not exist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) int fdt_stringlist_count(const void *fdt, int nodeoffset, const char *property);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114)  * fdt_stringlist_search - find a string in a string list and return its index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116)  * @nodeoffset: offset of a tree node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117)  * @property: name of the property containing the string list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118)  * @string: string to look up in the string list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120)  * Note that it is possible for this function to succeed on property values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121)  * that are not NUL-terminated. That's because the function will stop after
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122)  * finding the first occurrence of @string. This can for example happen with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123)  * small-valued cell properties, such as #address-cells, when searching for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124)  * the empty string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126)  * return:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127)  *   the index of the string in the list of strings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)  *   -FDT_ERR_BADVALUE if the property value is not NUL-terminated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129)  *   -FDT_ERR_NOTFOUND if the property does not exist or does not contain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)  *                     the given string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) int fdt_stringlist_search(const void *fdt, int nodeoffset, const char *property,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 			  const char *string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136)  * fdt_stringlist_get() - obtain the string at a given index in a string list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138)  * @nodeoffset: offset of a tree node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139)  * @property: name of the property containing the string list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)  * @index: index of the string to return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141)  * @lenp: return location for the string length or an error code on failure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)  * Note that this will successfully extract strings from properties with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)  * non-NUL-terminated values. For example on small-valued cell properties
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145)  * this function will return the empty string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147)  * If non-NULL, the length of the string (on success) or a negative error-code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148)  * (on failure) will be stored in the integer pointer to by lenp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150)  * Return:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151)  *   A pointer to the string at the given index in the string list or NULL on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152)  *   failure. On success the length of the string will be stored in the memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)  *   location pointed to by the lenp parameter, if non-NULL. On failure one of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154)  *   the following negative error codes will be returned in the lenp parameter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155)  *   (if non-NULL):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156)  *     -FDT_ERR_BADVALUE if the property value is not NUL-terminated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157)  *     -FDT_ERR_NOTFOUND if the property does not exist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) const char *fdt_stringlist_get(const void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 			       const char *property, int index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 			       int *lenp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) /* Read-only functions (addressing related)                           */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168)  * FDT_MAX_NCELLS - maximum value for #address-cells and #size-cells
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170)  * This is the maximum value for #address-cells, #size-cells and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171)  * similar properties that will be processed by libfdt.  IEE1275
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172)  * requires that OF implementations handle values up to 4.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173)  * Implementations may support larger values, but in practice higher
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174)  * values aren't used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) #define FDT_MAX_NCELLS		4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179)  * fdt_address_cells - retrieve address size for a bus represented in the tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181)  * @nodeoffset: offset of the node to find the address size for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183)  * When the node has a valid #address-cells property, returns its value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186)  *	0 <= n < FDT_MAX_NCELLS, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187)  *      2, if the node has no #address-cells property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188)  *      -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)  *		#address-cells property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) int fdt_address_cells(const void *fdt, int nodeoffset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)  * fdt_size_cells - retrieve address range size for a bus represented in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200)  *                  tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202)  * @nodeoffset: offset of the node to find the address range size for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204)  * When the node has a valid #size-cells property, returns its value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207)  *	0 <= n < FDT_MAX_NCELLS, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208)  *      1, if the node has no #size-cells property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209)  *      -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210)  *		#size-cells property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) int fdt_size_cells(const void *fdt, int nodeoffset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) /* Write-in-place functions                                           */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225)  * fdt_setprop_inplace_namelen_partial - change a property's value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)  *                                       but not its size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230)  * @namelen: number of characters of name to consider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231)  * @idx: index of the property to change in the array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232)  * @val: pointer to data to replace the property value with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233)  * @len: length of the property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)  * Identical to fdt_setprop_inplace(), but modifies the given property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)  * starting from the given index, and using only the first characters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237)  * of the name. It is useful when you want to manipulate only one value of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238)  * an array and you have a string that doesn't end with \0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240)  * Return: 0 on success, negative libfdt error value otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) #ifndef SWIG /* Not available in Python */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 					const char *name, int namelen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 					uint32_t idx, const void *val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 					int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250)  * fdt_setprop_inplace - change a property's value, but not its size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254)  * @val: pointer to data to replace the property value with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)  * @len: length of the property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257)  * fdt_setprop_inplace() replaces the value of a given property with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)  * the data in val, of length len.  This function cannot change the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259)  * size of a property, and so will only work if len is equal to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260)  * current length of the property.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262)  * This function will alter only the bytes in the blob which contain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263)  * the given property value, and will not alter or move any other part
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264)  * of the tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268)  *	-FDT_ERR_NOSPACE, if len is not equal to the property's current length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269)  *	-FDT_ERR_NOTFOUND, node does not have the named property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) #ifndef SWIG /* Not available in Python */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 			const void *val, int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283)  * fdt_setprop_inplace_u32 - change the value of a 32-bit integer property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287)  * @val: 32-bit integer value to replace the property with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289)  * fdt_setprop_inplace_u32() replaces the value of a given property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290)  * with the 32-bit integer value in val, converting val to big-endian
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291)  * if necessary.  This function cannot change the size of a property,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292)  * and so will only work if the property already exists and has length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293)  * 4.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295)  * This function will alter only the bytes in the blob which contain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296)  * the given property value, and will not alter or move any other part
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297)  * of the tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301)  *	-FDT_ERR_NOSPACE, if the property's length is not equal to 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302)  *	-FDT_ERR_NOTFOUND, node does not have the named property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) static inline int fdt_setprop_inplace_u32(void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 					  const char *name, uint32_t val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) 	fdt32_t tmp = cpu_to_fdt32(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 	return fdt_setprop_inplace(fdt, nodeoffset, name, &tmp, sizeof(tmp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318)  * fdt_setprop_inplace_u64 - change the value of a 64-bit integer property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322)  * @val: 64-bit integer value to replace the property with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324)  * fdt_setprop_inplace_u64() replaces the value of a given property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325)  * with the 64-bit integer value in val, converting val to big-endian
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326)  * if necessary.  This function cannot change the size of a property,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327)  * and so will only work if the property already exists and has length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328)  * 8.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330)  * This function will alter only the bytes in the blob which contain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331)  * the given property value, and will not alter or move any other part
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332)  * of the tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336)  *	-FDT_ERR_NOSPACE, if the property's length is not equal to 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337)  *	-FDT_ERR_NOTFOUND, node does not have the named property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) static inline int fdt_setprop_inplace_u64(void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 					  const char *name, uint64_t val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 	fdt64_t tmp = cpu_to_fdt64(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 	return fdt_setprop_inplace(fdt, nodeoffset, name, &tmp, sizeof(tmp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353)  * fdt_setprop_inplace_cell - change the value of a single-cell property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355)  * @nodeoffset: offset of the node containing the property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356)  * @name: name of the property to change the value of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357)  * @val: new value of the 32-bit cell
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359)  * This is an alternative name for fdt_setprop_inplace_u32()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360)  * Return: 0 on success, negative libfdt error number otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 					   const char *name, uint32_t val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 	return fdt_setprop_inplace_u32(fdt, nodeoffset, name, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369)  * fdt_nop_property - replace a property with nop tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371)  * @nodeoffset: offset of the node whose property to nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372)  * @name: name of the property to nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374)  * fdt_nop_property() will replace a given property's representation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375)  * in the blob with FDT_NOP tags, effectively removing it from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)  * tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378)  * This function will alter only the bytes in the blob which contain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379)  * the property, and will not alter or move any other part of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380)  * tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384)  *	-FDT_ERR_NOTFOUND, node does not have the named property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) int fdt_nop_property(void *fdt, int nodeoffset, const char *name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395)  * fdt_nop_node - replace a node (subtree) with nop tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397)  * @nodeoffset: offset of the node to nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399)  * fdt_nop_node() will replace a given node's representation in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400)  * blob, including all its subnodes, if any, with FDT_NOP tags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401)  * effectively removing it from the tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403)  * This function will alter only the bytes in the blob which contain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404)  * the node and its properties and subnodes, and will not alter or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405)  * move any other part of the tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) int fdt_nop_node(void *fdt, int nodeoffset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) /* Sequential write functions                                         */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) /* fdt_create_with_flags flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) #define FDT_CREATE_FLAG_NO_NAME_DEDUP 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 	/* FDT_CREATE_FLAG_NO_NAME_DEDUP: Do not try to de-duplicate property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 	 * names in the fdt. This can result in faster creation times, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 	 * a larger fdt. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) #define FDT_CREATE_FLAGS_ALL	(FDT_CREATE_FLAG_NO_NAME_DEDUP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431)  * fdt_create_with_flags - begin creation of a new fdt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432)  * @buf: pointer to memory allocated where fdt will be created
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433)  * @bufsize: size of the memory space at fdt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434)  * @flags: a valid combination of FDT_CREATE_FLAG_ flags, or 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436)  * fdt_create_with_flags() begins the process of creating a new fdt with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437)  * the sequential write interface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439)  * fdt creation process must end with fdt_finished() to produce a valid fdt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443)  *	-FDT_ERR_NOSPACE, bufsize is insufficient for a minimal fdt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444)  *	-FDT_ERR_BADFLAGS, flags is not valid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) int fdt_create_with_flags(void *buf, int bufsize, uint32_t flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449)  * fdt_create - begin creation of a new fdt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450)  * @buf: pointer to memory allocated where fdt will be created
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451)  * @bufsize: size of the memory space at fdt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453)  * fdt_create() is equivalent to fdt_create_with_flags() with flags=0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457)  *	-FDT_ERR_NOSPACE, bufsize is insufficient for a minimal fdt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) int fdt_create(void *buf, int bufsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) int fdt_resize(void *fdt, void *buf, int bufsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) int fdt_finish_reservemap(void *fdt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) int fdt_begin_node(void *fdt, const char *name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) int fdt_property(void *fdt, const char *name, const void *val, int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) static inline int fdt_property_u32(void *fdt, const char *name, uint32_t val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 	fdt32_t tmp = cpu_to_fdt32(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) 	return fdt_property(fdt, name, &tmp, sizeof(tmp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) static inline int fdt_property_u64(void *fdt, const char *name, uint64_t val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) 	fdt64_t tmp = cpu_to_fdt64(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 	return fdt_property(fdt, name, &tmp, sizeof(tmp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) #ifndef SWIG /* Not available in Python */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 	return fdt_property_u32(fdt, name, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485)  * fdt_property_placeholder - add a new property and return a ptr to its value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488)  * @name: name of property to add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489)  * @len: length of property value in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490)  * @valp: returns a pointer to where where the value should be placed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495)  *	-FDT_ERR_NOSPACE, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) #define fdt_property_string(fdt, name, str) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) 	fdt_property(fdt, name, str, strlen(str)+1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) int fdt_end_node(void *fdt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) int fdt_finish(void *fdt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) /* Read-write functions                                               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) int fdt_create_empty_tree(void *buf, int bufsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) int fdt_open_into(const void *fdt, void *buf, int bufsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) int fdt_pack(void *fdt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513)  * fdt_add_mem_rsv - add one memory reserve map entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515)  * @address: 64-bit start address of the reserve map entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516)  * @size: 64-bit size of the reserved region
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518)  * Adds a reserve map entry to the given blob reserving a region at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519)  * address address of length size.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521)  * This function will insert data into the reserve map and will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522)  * therefore change the indexes of some entries in the table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526)  *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527)  *		contain the new reservation entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538)  * fdt_del_mem_rsv - remove a memory reserve map entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540)  * @n: entry to remove
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542)  * fdt_del_mem_rsv() removes the n-th memory reserve map entry from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543)  * the blob.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545)  * This function will delete data from the reservation table and will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546)  * therefore change the indexes of some entries in the table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550)  *	-FDT_ERR_NOTFOUND, there is no entry of the given index (i.e. there
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551)  *		are less than n+1 reserve map entries)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) int fdt_del_mem_rsv(void *fdt, int n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562)  * fdt_set_name - change the name of a given node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564)  * @nodeoffset: structure block offset of a node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565)  * @name: name to give the node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567)  * fdt_set_name() replaces the name (including unit address, if any)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568)  * of the given node with the given string.  NOTE: this function can't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569)  * efficiently check if the new name is unique amongst the given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570)  * node's siblings; results are undefined if this function is invoked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571)  * with a name equal to one of the given node's siblings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573)  * This function may insert or delete data from the blob, and will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574)  * therefore change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578)  *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579)  *		to contain the new name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583)  *	-FDT_ERR_BADSTATE, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) int fdt_set_name(void *fdt, int nodeoffset, const char *name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588)  * fdt_setprop - create or change a property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592)  * @val: pointer to data to set the property value to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593)  * @len: length of the property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595)  * fdt_setprop() sets the value of the named property in the given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596)  * node to the given value and length, creating the property if it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597)  * does not already exist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599)  * This function may insert or delete data from the blob, and will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600)  * therefore change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604)  *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605)  *		contain the new property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) int fdt_setprop(void *fdt, int nodeoffset, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) 		const void *val, int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619)  * fdt_setprop_placeholder - allocate space for a property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623)  * @len: length of the property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624)  * @prop_data: return pointer to property data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626)  * fdt_setprop_placeholer() allocates the named property in the given node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627)  * If the property exists it is resized. In either case a pointer to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628)  * property data is returned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630)  * This function may insert or delete data from the blob, and will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631)  * therefore change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635)  *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636)  *		contain the new property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) 			    int len, void **prop_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650)  * fdt_setprop_u32 - set a property to a 32-bit integer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654)  * @val: 32-bit integer value for the property (native endian)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656)  * fdt_setprop_u32() sets the value of the named property in the given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)  * node to the given 32-bit integer value (converting to big-endian if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658)  * necessary), or creates a new property with that value if it does
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659)  * not already exist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661)  * This function may insert or delete data from the blob, and will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662)  * therefore change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666)  *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667)  *		contain the new property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) static inline int fdt_setprop_u32(void *fdt, int nodeoffset, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) 				  uint32_t val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) 	fdt32_t tmp = cpu_to_fdt32(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) 	return fdt_setprop(fdt, nodeoffset, name, &tmp, sizeof(tmp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685)  * fdt_setprop_u64 - set a property to a 64-bit integer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689)  * @val: 64-bit integer value for the property (native endian)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691)  * fdt_setprop_u64() sets the value of the named property in the given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692)  * node to the given 64-bit integer value (converting to big-endian if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693)  * necessary), or creates a new property with that value if it does
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694)  * not already exist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696)  * This function may insert or delete data from the blob, and will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697)  * therefore change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701)  *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702)  *		contain the new property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) static inline int fdt_setprop_u64(void *fdt, int nodeoffset, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) 				  uint64_t val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) 	fdt64_t tmp = cpu_to_fdt64(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) 	return fdt_setprop(fdt, nodeoffset, name, &tmp, sizeof(tmp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720)  * fdt_setprop_cell - set a property to a single cell value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724)  * @val: 32-bit integer value for the property (native endian)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726)  * This is an alternative name for fdt_setprop_u32()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728)  * Return: 0 on success, negative libfdt error value otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) 				   uint32_t val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) 	return fdt_setprop_u32(fdt, nodeoffset, name, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737)  * fdt_setprop_string - set a property to a string value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741)  * @str: string value for the property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743)  * fdt_setprop_string() sets the value of the named property in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744)  * given node to the given string value (using the length of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745)  * string to determine the new length of the property), or creates a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746)  * new property with that value if it does not already exist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748)  * This function may insert or delete data from the blob, and will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749)  * therefore change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753)  *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754)  *		contain the new property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) #define fdt_setprop_string(fdt, nodeoffset, name, str) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) 	fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769)  * fdt_setprop_empty - set a property to an empty value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774)  * fdt_setprop_empty() sets the value of the named property in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775)  * given node to an empty (zero length) value, or creates a new empty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776)  * property if it does not already exist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778)  * This function may insert or delete data from the blob, and will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779)  * therefore change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783)  *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784)  *		contain the new property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) #define fdt_setprop_empty(fdt, nodeoffset, name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) 	fdt_setprop((fdt), (nodeoffset), (name), NULL, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798)  * fdt_appendprop - append to or create a property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801)  * @name: name of the property to append to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802)  * @val: pointer to data to append to the property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803)  * @len: length of the data to append to the property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805)  * fdt_appendprop() appends the value to the named property in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806)  * given node, creating the property if it does not already exist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808)  * This function may insert data into the blob, and will therefore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809)  * change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813)  *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814)  *		contain the new property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) int fdt_appendprop(void *fdt, int nodeoffset, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) 		   const void *val, int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828)  * fdt_appendprop_u32 - append a 32-bit integer value to a property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832)  * @val: 32-bit integer value to append to the property (native endian)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834)  * fdt_appendprop_u32() appends the given 32-bit integer value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835)  * (converting to big-endian if necessary) to the value of the named
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836)  * property in the given node, or creates a new property with that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837)  * value if it does not already exist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839)  * This function may insert data into the blob, and will therefore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840)  * change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844)  *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845)  *		contain the new property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) static inline int fdt_appendprop_u32(void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) 				     const char *name, uint32_t val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) 	fdt32_t tmp = cpu_to_fdt32(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) 	return fdt_appendprop(fdt, nodeoffset, name, &tmp, sizeof(tmp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863)  * fdt_appendprop_u64 - append a 64-bit integer value to a property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867)  * @val: 64-bit integer value to append to the property (native endian)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869)  * fdt_appendprop_u64() appends the given 64-bit integer value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870)  * (converting to big-endian if necessary) to the value of the named
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871)  * property in the given node, or creates a new property with that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872)  * value if it does not already exist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874)  * This function may insert data into the blob, and will therefore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875)  * change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879)  *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880)  *		contain the new property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) static inline int fdt_appendprop_u64(void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) 				     const char *name, uint64_t val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) 	fdt64_t tmp = cpu_to_fdt64(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) 	return fdt_appendprop(fdt, nodeoffset, name, &tmp, sizeof(tmp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898)  * fdt_appendprop_cell - append a single cell value to a property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902)  * @val: 32-bit integer value to append to the property (native endian)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904)  * This is an alternative name for fdt_appendprop_u32()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906)  * Return: 0 on success, negative libfdt error value otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) static inline int fdt_appendprop_cell(void *fdt, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) 				      const char *name, uint32_t val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) 	return fdt_appendprop_u32(fdt, nodeoffset, name, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915)  * fdt_appendprop_string - append a string to a property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917)  * @nodeoffset: offset of the node whose property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918)  * @name: name of the property to change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919)  * @str: string value to append to the property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921)  * fdt_appendprop_string() appends the given string to the value of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922)  * the named property in the given node, or creates a new property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923)  * with that value if it does not already exist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925)  * This function may insert data into the blob, and will therefore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926)  * change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930)  *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931)  *		contain the new property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) #define fdt_appendprop_string(fdt, nodeoffset, name, str) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) 	fdt_appendprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945)  * fdt_appendprop_addrrange - append a address range property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947)  * @parent: offset of the parent node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948)  * @nodeoffset: offset of the node to add a property at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949)  * @name: name of property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950)  * @addr: start address of a given range
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951)  * @size: size of a given range
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953)  * fdt_appendprop_addrrange() appends an address range value (start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954)  * address and size) to the value of the named property in the given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955)  * node, or creates a new property with that value if it does not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956)  * already exist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957)  * If "name" is not specified, a default "reg" is used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958)  * Cell sizes are determined by parent's #address-cells and #size-cells.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960)  * This function may insert data into the blob, and will therefore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961)  * change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967)  *	-FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968)  *		#address-cells property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973)  *	-FDT_ERR_BADVALUE, addr or size doesn't fit to respective cells size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974)  *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975)  *		contain a new property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) int fdt_appendprop_addrrange(void *fdt, int parent, int nodeoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) 			     const char *name, uint64_t addr, uint64_t size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982)  * fdt_delprop - delete a property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984)  * @nodeoffset: offset of the node whose property to nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985)  * @name: name of the property to nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987)  * fdt_del_property() will delete the given property.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989)  * This function will delete data from the blob, and will therefore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990)  * change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994)  *	-FDT_ERR_NOTFOUND, node does not have the named property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) int fdt_delprop(void *fdt, int nodeoffset, const char *name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006)  * fdt_add_subnode_namelen - creates a new node based on substring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008)  * @parentoffset: structure block offset of a node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009)  * @name: name of the subnode to create
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010)  * @namelen: number of characters of name to consider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012)  * Identical to fdt_add_subnode(), but use only the first @namelen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013)  * characters of @name as the name of the new node.  This is useful for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014)  * creating subnodes based on a portion of a larger string, such as a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015)  * full path.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017)  * Return: structure block offset of the created subnode (>=0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018)  *	   negative libfdt error value otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) #ifndef SWIG /* Not available in Python */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) int fdt_add_subnode_namelen(void *fdt, int parentoffset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) 			    const char *name, int namelen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026)  * fdt_add_subnode - creates a new node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028)  * @parentoffset: structure block offset of a node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029)  * @name: name of the subnode to locate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031)  * fdt_add_subnode() creates a new node as a subnode of the node at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032)  * structure block offset parentoffset, with the given name (which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033)  * should include the unit address, if any).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035)  * This function will insert data into the blob, and will therefore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036)  * change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039)  *	structure block offset of the created nodeequested subnode (>=0), on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040)  *		success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041)  *	-FDT_ERR_NOTFOUND, if the requested subnode does not exist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042)  *	-FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043)  *		tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044)  *	-FDT_ERR_EXISTS, if the node at parentoffset already has a subnode of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045)  *		the given name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046)  *	-FDT_ERR_NOSPACE, if there is insufficient free space in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047)  *		blob to contain the new node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048)  *	-FDT_ERR_NOSPACE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049)  *	-FDT_ERR_BADLAYOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050)  *      -FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054)  *	-FDT_ERR_TRUNCATED, standard meanings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) int fdt_add_subnode(void *fdt, int parentoffset, const char *name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059)  * fdt_del_node - delete a node (subtree)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060)  * @fdt: pointer to the device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061)  * @nodeoffset: offset of the node to nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063)  * fdt_del_node() will remove the given node, including all its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064)  * subnodes if any, from the blob.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066)  * This function will delete data from the blob, and will therefore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067)  * change the offsets of some existing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071)  *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) int fdt_del_node(void *fdt, int nodeoffset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082)  * fdt_overlay_apply - Applies a DT overlay on a base DT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083)  * @fdt: pointer to the base device tree blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084)  * @fdto: pointer to the device tree overlay blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086)  * fdt_overlay_apply() will apply the given device tree overlay on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087)  * given base device tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089)  * Expect the base device tree to be modified, even if the function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090)  * returns an error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092)  * returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093)  *	0, on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094)  *	-FDT_ERR_NOSPACE, there's not enough space in the base device tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095)  *	-FDT_ERR_NOTFOUND, the overlay points to some inexistant nodes or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096)  *		properties in the base DT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097)  *	-FDT_ERR_BADPHANDLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098)  *	-FDT_ERR_BADOVERLAY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099)  *	-FDT_ERR_NOPHANDLES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100)  *	-FDT_ERR_INTERNAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101)  *	-FDT_ERR_BADLAYOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102)  *	-FDT_ERR_BADMAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103)  *	-FDT_ERR_BADOFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104)  *	-FDT_ERR_BADPATH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105)  *	-FDT_ERR_BADVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106)  *	-FDT_ERR_BADSTRUCTURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107)  *	-FDT_ERR_BADSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108)  *	-FDT_ERR_TRUNCATED, standard meanings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) int fdt_overlay_apply(void *fdt, void *fdto);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) /* Debugging / informational functions                                */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) /**********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) const char *fdt_strerror(int errval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) #ifdef __cplusplus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) #endif /* LIBFDT_H */