^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 */