Annotation of elwix/tools/uboot_mkimage/include/libfdt.h, revision 1.1
1.1 ! misho 1: #ifndef _LIBFDT_H
! 2: #define _LIBFDT_H
! 3: /*
! 4: * libfdt - Flat Device Tree manipulation
! 5: * Copyright (C) 2006 David Gibson, IBM Corporation.
! 6: *
! 7: * libfdt is dual licensed: you can use it either under the terms of
! 8: * the GPL, or the BSD license, at your option.
! 9: *
! 10: * a) This library is free software; you can redistribute it and/or
! 11: * modify it under the terms of the GNU General Public License as
! 12: * published by the Free Software Foundation; either version 2 of the
! 13: * License, or (at your option) any later version.
! 14: *
! 15: * This library is distributed in the hope that it will be useful,
! 16: * but WITHOUT ANY WARRANTY; without even the implied warranty of
! 17: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 18: * GNU General Public License for more details.
! 19: *
! 20: * You should have received a copy of the GNU General Public
! 21: * License along with this library; if not, write to the Free
! 22: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
! 23: * MA 02110-1301 USA
! 24: *
! 25: * Alternatively,
! 26: *
! 27: * b) Redistribution and use in source and binary forms, with or
! 28: * without modification, are permitted provided that the following
! 29: * conditions are met:
! 30: *
! 31: * 1. Redistributions of source code must retain the above
! 32: * copyright notice, this list of conditions and the following
! 33: * disclaimer.
! 34: * 2. Redistributions in binary form must reproduce the above
! 35: * copyright notice, this list of conditions and the following
! 36: * disclaimer in the documentation and/or other materials
! 37: * provided with the distribution.
! 38: *
! 39: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
! 40: * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
! 41: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
! 42: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
! 43: * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
! 44: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
! 45: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 46: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
! 47: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 48: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 49: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
! 50: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
! 51: * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 52: */
! 53:
! 54: #include <libfdt_env.h>
! 55: #include <fdt.h>
! 56:
! 57: #define FDT_FIRST_SUPPORTED_VERSION 0x10
! 58: #define FDT_LAST_SUPPORTED_VERSION 0x11
! 59:
! 60: /* Error codes: informative error codes */
! 61: #define FDT_ERR_NOTFOUND 1
! 62: /* FDT_ERR_NOTFOUND: The requested node or property does not exist */
! 63: #define FDT_ERR_EXISTS 2
! 64: /* FDT_ERR_EXISTS: Attemped to create a node or property which
! 65: * already exists */
! 66: #define FDT_ERR_NOSPACE 3
! 67: /* FDT_ERR_NOSPACE: Operation needed to expand the device
! 68: * tree, but its buffer did not have sufficient space to
! 69: * contain the expanded tree. Use fdt_open_into() to move the
! 70: * device tree to a buffer with more space. */
! 71:
! 72: /* Error codes: codes for bad parameters */
! 73: #define FDT_ERR_BADOFFSET 4
! 74: /* FDT_ERR_BADOFFSET: Function was passed a structure block
! 75: * offset which is out-of-bounds, or which points to an
! 76: * unsuitable part of the structure for the operation. */
! 77: #define FDT_ERR_BADPATH 5
! 78: /* FDT_ERR_BADPATH: Function was passed a badly formatted path
! 79: * (e.g. missing a leading / for a function which requires an
! 80: * absolute path) */
! 81: #define FDT_ERR_BADPHANDLE 6
! 82: /* FDT_ERR_BADPHANDLE: Function was passed an invalid phandle
! 83: * value. phandle values of 0 and -1 are not permitted. */
! 84: #define FDT_ERR_BADSTATE 7
! 85: /* FDT_ERR_BADSTATE: Function was passed an incomplete device
! 86: * tree created by the sequential-write functions, which is
! 87: * not sufficiently complete for the requested operation. */
! 88:
! 89: /* Error codes: codes for bad device tree blobs */
! 90: #define FDT_ERR_TRUNCATED 8
! 91: /* FDT_ERR_TRUNCATED: Structure block of the given device tree
! 92: * ends without an FDT_END tag. */
! 93: #define FDT_ERR_BADMAGIC 9
! 94: /* FDT_ERR_BADMAGIC: Given "device tree" appears not to be a
! 95: * device tree at all - it is missing the flattened device
! 96: * tree magic number. */
! 97: #define FDT_ERR_BADVERSION 10
! 98: /* FDT_ERR_BADVERSION: Given device tree has a version which
! 99: * can't be handled by the requested operation. For
! 100: * read-write functions, this may mean that fdt_open_into() is
! 101: * required to convert the tree to the expected version. */
! 102: #define FDT_ERR_BADSTRUCTURE 11
! 103: /* FDT_ERR_BADSTRUCTURE: Given device tree has a corrupt
! 104: * structure block or other serious error (e.g. misnested
! 105: * nodes, or subnodes preceding properties). */
! 106: #define FDT_ERR_BADLAYOUT 12
! 107: /* FDT_ERR_BADLAYOUT: For read-write functions, the given
! 108: * device tree has it's sub-blocks in an order that the
! 109: * function can't handle (memory reserve map, then structure,
! 110: * then strings). Use fdt_open_into() to reorganize the tree
! 111: * into a form suitable for the read-write operations. */
! 112:
! 113: /* "Can't happen" error indicating a bug in libfdt */
! 114: #define FDT_ERR_INTERNAL 13
! 115: /* FDT_ERR_INTERNAL: libfdt has failed an internal assertion.
! 116: * Should never be returned, if it is, it indicates a bug in
! 117: * libfdt itself. */
! 118:
! 119: #define FDT_ERR_MAX 13
! 120:
! 121: /**********************************************************************/
! 122: /* Low-level functions (you probably don't need these) */
! 123: /**********************************************************************/
! 124:
! 125: const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int checklen);
! 126: static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
! 127: {
! 128: return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen);
! 129: }
! 130:
! 131: uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);
! 132:
! 133: /**********************************************************************/
! 134: /* Traversal functions */
! 135: /**********************************************************************/
! 136:
! 137: int fdt_next_node(const void *fdt, int offset, int *depth);
! 138:
! 139: /**********************************************************************/
! 140: /* General functions */
! 141: /**********************************************************************/
! 142:
! 143: #define fdt_get_header(fdt, field) \
! 144: (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field))
! 145: #define fdt_magic(fdt) (fdt_get_header(fdt, magic))
! 146: #define fdt_totalsize(fdt) (fdt_get_header(fdt, totalsize))
! 147: #define fdt_off_dt_struct(fdt) (fdt_get_header(fdt, off_dt_struct))
! 148: #define fdt_off_dt_strings(fdt) (fdt_get_header(fdt, off_dt_strings))
! 149: #define fdt_off_mem_rsvmap(fdt) (fdt_get_header(fdt, off_mem_rsvmap))
! 150: #define fdt_version(fdt) (fdt_get_header(fdt, version))
! 151: #define fdt_last_comp_version(fdt) (fdt_get_header(fdt, last_comp_version))
! 152: #define fdt_boot_cpuid_phys(fdt) (fdt_get_header(fdt, boot_cpuid_phys))
! 153: #define fdt_size_dt_strings(fdt) (fdt_get_header(fdt, size_dt_strings))
! 154: #define fdt_size_dt_struct(fdt) (fdt_get_header(fdt, size_dt_struct))
! 155:
! 156: #define __fdt_set_hdr(name) \
! 157: static inline void fdt_set_##name(void *fdt, uint32_t val) \
! 158: { \
! 159: struct fdt_header *fdth = (struct fdt_header*)fdt; \
! 160: fdth->name = cpu_to_fdt32(val); \
! 161: }
! 162: __fdt_set_hdr(magic);
! 163: __fdt_set_hdr(totalsize);
! 164: __fdt_set_hdr(off_dt_struct);
! 165: __fdt_set_hdr(off_dt_strings);
! 166: __fdt_set_hdr(off_mem_rsvmap);
! 167: __fdt_set_hdr(version);
! 168: __fdt_set_hdr(last_comp_version);
! 169: __fdt_set_hdr(boot_cpuid_phys);
! 170: __fdt_set_hdr(size_dt_strings);
! 171: __fdt_set_hdr(size_dt_struct);
! 172: #undef __fdt_set_hdr
! 173:
! 174: /**
! 175: * fdt_check_header - sanity check a device tree or possible device tree
! 176: * @fdt: pointer to data which might be a flattened device tree
! 177: *
! 178: * fdt_check_header() checks that the given buffer contains what
! 179: * appears to be a flattened device tree with sane information in its
! 180: * header.
! 181: *
! 182: * returns:
! 183: * 0, if the buffer appears to contain a valid device tree
! 184: * -FDT_ERR_BADMAGIC,
! 185: * -FDT_ERR_BADVERSION,
! 186: * -FDT_ERR_BADSTATE, standard meanings, as above
! 187: */
! 188: int fdt_check_header(const void *fdt);
! 189:
! 190: /**
! 191: * fdt_move - move a device tree around in memory
! 192: * @fdt: pointer to the device tree to move
! 193: * @buf: pointer to memory where the device is to be moved
! 194: * @bufsize: size of the memory space at buf
! 195: *
! 196: * fdt_move() relocates, if possible, the device tree blob located at
! 197: * fdt to the buffer at buf of size bufsize. The buffer may overlap
! 198: * with the existing device tree blob at fdt. Therefore,
! 199: * fdt_move(fdt, fdt, fdt_totalsize(fdt))
! 200: * should always succeed.
! 201: *
! 202: * returns:
! 203: * 0, on success
! 204: * -FDT_ERR_NOSPACE, bufsize is insufficient to contain the device tree
! 205: * -FDT_ERR_BADMAGIC,
! 206: * -FDT_ERR_BADVERSION,
! 207: * -FDT_ERR_BADSTATE, standard meanings
! 208: */
! 209: int fdt_move(const void *fdt, void *buf, int bufsize);
! 210:
! 211: /**********************************************************************/
! 212: /* Read-only functions */
! 213: /**********************************************************************/
! 214:
! 215: /**
! 216: * fdt_string - retrieve a string from the strings block of a device tree
! 217: * @fdt: pointer to the device tree blob
! 218: * @stroffset: offset of the string within the strings block (native endian)
! 219: *
! 220: * fdt_string() retrieves a pointer to a single string from the
! 221: * strings block of the device tree blob at fdt.
! 222: *
! 223: * returns:
! 224: * a pointer to the string, on success
! 225: * NULL, if stroffset is out of bounds
! 226: */
! 227: const char *fdt_string(const void *fdt, int stroffset);
! 228:
! 229: /**
! 230: * fdt_num_mem_rsv - retrieve the number of memory reserve map entries
! 231: * @fdt: pointer to the device tree blob
! 232: *
! 233: * Returns the number of entries in the device tree blob's memory
! 234: * reservation map. This does not include the terminating 0,0 entry
! 235: * or any other (0,0) entries reserved for expansion.
! 236: *
! 237: * returns:
! 238: * the number of entries
! 239: */
! 240: int fdt_num_mem_rsv(const void *fdt);
! 241:
! 242: /**
! 243: * fdt_get_mem_rsv - retrieve one memory reserve map entry
! 244: * @fdt: pointer to the device tree blob
! 245: * @address, @size: pointers to 64-bit variables
! 246: *
! 247: * On success, *address and *size will contain the address and size of
! 248: * the n-th reserve map entry from the device tree blob, in
! 249: * native-endian format.
! 250: *
! 251: * returns:
! 252: * 0, on success
! 253: * -FDT_ERR_BADMAGIC,
! 254: * -FDT_ERR_BADVERSION,
! 255: * -FDT_ERR_BADSTATE, standard meanings
! 256: */
! 257: int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size);
! 258:
! 259: /**
! 260: * fdt_subnode_offset_namelen - find a subnode based on substring
! 261: * @fdt: pointer to the device tree blob
! 262: * @parentoffset: structure block offset of a node
! 263: * @name: name of the subnode to locate
! 264: * @namelen: number of characters of name to consider
! 265: *
! 266: * Identical to fdt_subnode_offset(), but only examine the first
! 267: * namelen characters of name for matching the subnode name. This is
! 268: * useful for finding subnodes based on a portion of a larger string,
! 269: * such as a full path.
! 270: */
! 271: int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
! 272: const char *name, int namelen);
! 273: /**
! 274: * fdt_subnode_offset - find a subnode of a given node
! 275: * @fdt: pointer to the device tree blob
! 276: * @parentoffset: structure block offset of a node
! 277: * @name: name of the subnode to locate
! 278: *
! 279: * fdt_subnode_offset() finds a subnode of the node at structure block
! 280: * offset parentoffset with the given name. name may include a unit
! 281: * address, in which case fdt_subnode_offset() will find the subnode
! 282: * with that unit address, or the unit address may be omitted, in
! 283: * which case fdt_subnode_offset() will find an arbitrary subnode
! 284: * whose name excluding unit address matches the given name.
! 285: *
! 286: * returns:
! 287: * structure block offset of the requested subnode (>=0), on success
! 288: * -FDT_ERR_NOTFOUND, if the requested subnode does not exist
! 289: * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag
! 290: * -FDT_ERR_BADMAGIC,
! 291: * -FDT_ERR_BADVERSION,
! 292: * -FDT_ERR_BADSTATE,
! 293: * -FDT_ERR_BADSTRUCTURE,
! 294: * -FDT_ERR_TRUNCATED, standard meanings.
! 295: */
! 296: int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name);
! 297:
! 298: /**
! 299: * fdt_path_offset - find a tree node by its full path
! 300: * @fdt: pointer to the device tree blob
! 301: * @path: full path of the node to locate
! 302: *
! 303: * fdt_path_offset() finds a node of a given path in the device tree.
! 304: * Each path component may omit the unit address portion, but the
! 305: * results of this are undefined if any such path component is
! 306: * ambiguous (that is if there are multiple nodes at the relevant
! 307: * level matching the given component, differentiated only by unit
! 308: * address).
! 309: *
! 310: * returns:
! 311: * structure block offset of the node with the requested path (>=0), on success
! 312: * -FDT_ERR_BADPATH, given path does not begin with '/' or is invalid
! 313: * -FDT_ERR_NOTFOUND, if the requested node does not exist
! 314: * -FDT_ERR_BADMAGIC,
! 315: * -FDT_ERR_BADVERSION,
! 316: * -FDT_ERR_BADSTATE,
! 317: * -FDT_ERR_BADSTRUCTURE,
! 318: * -FDT_ERR_TRUNCATED, standard meanings.
! 319: */
! 320: int fdt_path_offset(const void *fdt, const char *path);
! 321:
! 322: /**
! 323: * fdt_get_name - retrieve the name of a given node
! 324: * @fdt: pointer to the device tree blob
! 325: * @nodeoffset: structure block offset of the starting node
! 326: * @lenp: pointer to an integer variable (will be overwritten) or NULL
! 327: *
! 328: * fdt_get_name() retrieves the name (including unit address) of the
! 329: * device tree node at structure block offset nodeoffset. If lenp is
! 330: * non-NULL, the length of this name is also returned, in the integer
! 331: * pointed to by lenp.
! 332: *
! 333: * returns:
! 334: * pointer to the node's name, on success
! 335: * If lenp is non-NULL, *lenp contains the length of that name (>=0)
! 336: * NULL, on error
! 337: * if lenp is non-NULL *lenp contains an error code (<0):
! 338: * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
! 339: * -FDT_ERR_BADMAGIC,
! 340: * -FDT_ERR_BADVERSION,
! 341: * -FDT_ERR_BADSTATE, standard meanings
! 342: */
! 343: const char *fdt_get_name(const void *fdt, int nodeoffset, int *lenp);
! 344:
! 345: /**
! 346: * fdt_get_property_namelen - find a property based on substring
! 347: * @fdt: pointer to the device tree blob
! 348: * @nodeoffset: offset of the node whose property to find
! 349: * @name: name of the property to find
! 350: * @namelen: number of characters of name to consider
! 351: * @lenp: pointer to an integer variable (will be overwritten) or NULL
! 352: *
! 353: * Identical to fdt_get_property_namelen(), but only examine the first
! 354: * namelen characters of name for matching the property name.
! 355: */
! 356: const struct fdt_property *fdt_get_property_namelen(const void *fdt,
! 357: int nodeoffset,
! 358: const char *name,
! 359: int namelen, int *lenp);
! 360:
! 361: /**
! 362: * fdt_get_property - find a given property in a given node
! 363: * @fdt: pointer to the device tree blob
! 364: * @nodeoffset: offset of the node whose property to find
! 365: * @name: name of the property to find
! 366: * @lenp: pointer to an integer variable (will be overwritten) or NULL
! 367: *
! 368: * fdt_get_property() retrieves a pointer to the fdt_property
! 369: * structure within the device tree blob corresponding to the property
! 370: * named 'name' of the node at offset nodeoffset. If lenp is
! 371: * non-NULL, the length of the property value is also returned, in the
! 372: * integer pointed to by lenp.
! 373: *
! 374: * returns:
! 375: * pointer to the structure representing the property
! 376: * if lenp is non-NULL, *lenp contains the length of the property
! 377: * value (>=0)
! 378: * NULL, on error
! 379: * if lenp is non-NULL, *lenp contains an error code (<0):
! 380: * -FDT_ERR_NOTFOUND, node does not have named property
! 381: * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
! 382: * -FDT_ERR_BADMAGIC,
! 383: * -FDT_ERR_BADVERSION,
! 384: * -FDT_ERR_BADSTATE,
! 385: * -FDT_ERR_BADSTRUCTURE,
! 386: * -FDT_ERR_TRUNCATED, standard meanings
! 387: */
! 388: const struct fdt_property *fdt_get_property(const void *fdt, int nodeoffset,
! 389: const char *name, int *lenp);
! 390: static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset,
! 391: const char *name,
! 392: int *lenp)
! 393: {
! 394: return (struct fdt_property *)(uintptr_t)
! 395: fdt_get_property(fdt, nodeoffset, name, lenp);
! 396: }
! 397:
! 398: /**
! 399: * fdt_getprop_namelen - get property value based on substring
! 400: * @fdt: pointer to the device tree blob
! 401: * @nodeoffset: offset of the node whose property to find
! 402: * @name: name of the property to find
! 403: * @namelen: number of characters of name to consider
! 404: * @lenp: pointer to an integer variable (will be overwritten) or NULL
! 405: *
! 406: * Identical to fdt_getprop(), but only examine the first namelen
! 407: * characters of name for matching the property name.
! 408: */
! 409: const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
! 410: const char *name, int namelen, int *lenp);
! 411:
! 412: /**
! 413: * fdt_getprop - retrieve the value of a given property
! 414: * @fdt: pointer to the device tree blob
! 415: * @nodeoffset: offset of the node whose property to find
! 416: * @name: name of the property to find
! 417: * @lenp: pointer to an integer variable (will be overwritten) or NULL
! 418: *
! 419: * fdt_getprop() retrieves a pointer to the value of the property
! 420: * named 'name' of the node at offset nodeoffset (this will be a
! 421: * pointer to within the device blob itself, not a copy of the value).
! 422: * If lenp is non-NULL, the length of the property value is also
! 423: * returned, in the integer pointed to by lenp.
! 424: *
! 425: * returns:
! 426: * pointer to the property's value
! 427: * if lenp is non-NULL, *lenp contains the length of the property
! 428: * value (>=0)
! 429: * NULL, on error
! 430: * if lenp is non-NULL, *lenp contains an error code (<0):
! 431: * -FDT_ERR_NOTFOUND, node does not have named property
! 432: * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
! 433: * -FDT_ERR_BADMAGIC,
! 434: * -FDT_ERR_BADVERSION,
! 435: * -FDT_ERR_BADSTATE,
! 436: * -FDT_ERR_BADSTRUCTURE,
! 437: * -FDT_ERR_TRUNCATED, standard meanings
! 438: */
! 439: const void *fdt_getprop(const void *fdt, int nodeoffset,
! 440: const char *name, int *lenp);
! 441: static inline void *fdt_getprop_w(void *fdt, int nodeoffset,
! 442: const char *name, int *lenp)
! 443: {
! 444: return (void *)(uintptr_t)fdt_getprop(fdt, nodeoffset, name, lenp);
! 445: }
! 446:
! 447: /**
! 448: * fdt_get_phandle - retrieve the phandle of a given node
! 449: * @fdt: pointer to the device tree blob
! 450: * @nodeoffset: structure block offset of the node
! 451: *
! 452: * fdt_get_phandle() retrieves the phandle of the device tree node at
! 453: * structure block offset nodeoffset.
! 454: *
! 455: * returns:
! 456: * the phandle of the node at nodeoffset, on success (!= 0, != -1)
! 457: * 0, if the node has no phandle, or another error occurs
! 458: */
! 459: uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);
! 460:
! 461: /**
! 462: * fdt_get_alias_namelen - get alias based on substring
! 463: * @fdt: pointer to the device tree blob
! 464: * @name: name of the alias th look up
! 465: * @namelen: number of characters of name to consider
! 466: *
! 467: * Identical to fdt_get_alias(), but only examine the first namelen
! 468: * characters of name for matching the alias name.
! 469: */
! 470: const char *fdt_get_alias_namelen(const void *fdt,
! 471: const char *name, int namelen);
! 472:
! 473: /**
! 474: * fdt_get_alias - retreive the path referenced by a given alias
! 475: * @fdt: pointer to the device tree blob
! 476: * @name: name of the alias th look up
! 477: *
! 478: * fdt_get_alias() retrieves the value of a given alias. That is, the
! 479: * value of the property named 'name' in the node /aliases.
! 480: *
! 481: * returns:
! 482: * a pointer to the expansion of the alias named 'name', of it exists
! 483: * NULL, if the given alias or the /aliases node does not exist
! 484: */
! 485: const char *fdt_get_alias(const void *fdt, const char *name);
! 486:
! 487: /**
! 488: * fdt_get_path - determine the full path of a node
! 489: * @fdt: pointer to the device tree blob
! 490: * @nodeoffset: offset of the node whose path to find
! 491: * @buf: character buffer to contain the returned path (will be overwritten)
! 492: * @buflen: size of the character buffer at buf
! 493: *
! 494: * fdt_get_path() computes the full path of the node at offset
! 495: * nodeoffset, and records that path in the buffer at buf.
! 496: *
! 497: * NOTE: This function is expensive, as it must scan the device tree
! 498: * structure from the start to nodeoffset.
! 499: *
! 500: * returns:
! 501: * 0, on success
! 502: * buf contains the absolute path of the node at
! 503: * nodeoffset, as a NUL-terminated string.
! 504: * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
! 505: * -FDT_ERR_NOSPACE, the path of the given node is longer than (bufsize-1)
! 506: * characters and will not fit in the given buffer.
! 507: * -FDT_ERR_BADMAGIC,
! 508: * -FDT_ERR_BADVERSION,
! 509: * -FDT_ERR_BADSTATE,
! 510: * -FDT_ERR_BADSTRUCTURE, standard meanings
! 511: */
! 512: int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen);
! 513:
! 514: /**
! 515: * fdt_supernode_atdepth_offset - find a specific ancestor of a node
! 516: * @fdt: pointer to the device tree blob
! 517: * @nodeoffset: offset of the node whose parent to find
! 518: * @supernodedepth: depth of the ancestor to find
! 519: * @nodedepth: pointer to an integer variable (will be overwritten) or NULL
! 520: *
! 521: * fdt_supernode_atdepth_offset() finds an ancestor of the given node
! 522: * at a specific depth from the root (where the root itself has depth
! 523: * 0, its immediate subnodes depth 1 and so forth). So
! 524: * fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, NULL);
! 525: * will always return 0, the offset of the root node. If the node at
! 526: * nodeoffset has depth D, then:
! 527: * fdt_supernode_atdepth_offset(fdt, nodeoffset, D, NULL);
! 528: * will return nodeoffset itself.
! 529: *
! 530: * NOTE: This function is expensive, as it must scan the device tree
! 531: * structure from the start to nodeoffset.
! 532: *
! 533: * returns:
! 534:
! 535: * structure block offset of the node at node offset's ancestor
! 536: * of depth supernodedepth (>=0), on success
! 537: * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
! 538: * -FDT_ERR_NOTFOUND, supernodedepth was greater than the depth of nodeoffset
! 539: * -FDT_ERR_BADMAGIC,
! 540: * -FDT_ERR_BADVERSION,
! 541: * -FDT_ERR_BADSTATE,
! 542: * -FDT_ERR_BADSTRUCTURE, standard meanings
! 543: */
! 544: int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
! 545: int supernodedepth, int *nodedepth);
! 546:
! 547: /**
! 548: * fdt_node_depth - find the depth of a given node
! 549: * @fdt: pointer to the device tree blob
! 550: * @nodeoffset: offset of the node whose parent to find
! 551: *
! 552: * fdt_node_depth() finds the depth of a given node. The root node
! 553: * has depth 0, its immediate subnodes depth 1 and so forth.
! 554: *
! 555: * NOTE: This function is expensive, as it must scan the device tree
! 556: * structure from the start to nodeoffset.
! 557: *
! 558: * returns:
! 559: * depth of the node at nodeoffset (>=0), on success
! 560: * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
! 561: * -FDT_ERR_BADMAGIC,
! 562: * -FDT_ERR_BADVERSION,
! 563: * -FDT_ERR_BADSTATE,
! 564: * -FDT_ERR_BADSTRUCTURE, standard meanings
! 565: */
! 566: int fdt_node_depth(const void *fdt, int nodeoffset);
! 567:
! 568: /**
! 569: * fdt_parent_offset - find the parent of a given node
! 570: * @fdt: pointer to the device tree blob
! 571: * @nodeoffset: offset of the node whose parent to find
! 572: *
! 573: * fdt_parent_offset() locates the parent node of a given node (that
! 574: * is, it finds the offset of the node which contains the node at
! 575: * nodeoffset as a subnode).
! 576: *
! 577: * NOTE: This function is expensive, as it must scan the device tree
! 578: * structure from the start to nodeoffset, *twice*.
! 579: *
! 580: * returns:
! 581: * structure block offset of the parent of the node at nodeoffset
! 582: * (>=0), on success
! 583: * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
! 584: * -FDT_ERR_BADMAGIC,
! 585: * -FDT_ERR_BADVERSION,
! 586: * -FDT_ERR_BADSTATE,
! 587: * -FDT_ERR_BADSTRUCTURE, standard meanings
! 588: */
! 589: int fdt_parent_offset(const void *fdt, int nodeoffset);
! 590:
! 591: /**
! 592: * fdt_node_offset_by_prop_value - find nodes with a given property value
! 593: * @fdt: pointer to the device tree blob
! 594: * @startoffset: only find nodes after this offset
! 595: * @propname: property name to check
! 596: * @propval: property value to search for
! 597: * @proplen: length of the value in propval
! 598: *
! 599: * fdt_node_offset_by_prop_value() returns the offset of the first
! 600: * node after startoffset, which has a property named propname whose
! 601: * value is of length proplen and has value equal to propval; or if
! 602: * startoffset is -1, the very first such node in the tree.
! 603: *
! 604: * To iterate through all nodes matching the criterion, the following
! 605: * idiom can be used:
! 606: * offset = fdt_node_offset_by_prop_value(fdt, -1, propname,
! 607: * propval, proplen);
! 608: * while (offset != -FDT_ERR_NOTFOUND) {
! 609: * ... other code here ...
! 610: * offset = fdt_node_offset_by_prop_value(fdt, offset, propname,
! 611: * propval, proplen);
! 612: * }
! 613: *
! 614: * Note the -1 in the first call to the function, if 0 is used here
! 615: * instead, the function will never locate the root node, even if it
! 616: * matches the criterion.
! 617: *
! 618: * returns:
! 619: * structure block offset of the located node (>= 0, >startoffset),
! 620: * on success
! 621: * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the
! 622: * tree after startoffset
! 623: * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
! 624: * -FDT_ERR_BADMAGIC,
! 625: * -FDT_ERR_BADVERSION,
! 626: * -FDT_ERR_BADSTATE,
! 627: * -FDT_ERR_BADSTRUCTURE, standard meanings
! 628: */
! 629: int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
! 630: const char *propname,
! 631: const void *propval, int proplen);
! 632:
! 633: /**
! 634: * fdt_node_offset_by_phandle - find the node with a given phandle
! 635: * @fdt: pointer to the device tree blob
! 636: * @phandle: phandle value
! 637: *
! 638: * fdt_node_offset_by_phandle() returns the offset of the node
! 639: * which has the given phandle value. If there is more than one node
! 640: * in the tree with the given phandle (an invalid tree), results are
! 641: * undefined.
! 642: *
! 643: * returns:
! 644: * structure block offset of the located node (>= 0), on success
! 645: * -FDT_ERR_NOTFOUND, no node with that phandle exists
! 646: * -FDT_ERR_BADPHANDLE, given phandle value was invalid (0 or -1)
! 647: * -FDT_ERR_BADMAGIC,
! 648: * -FDT_ERR_BADVERSION,
! 649: * -FDT_ERR_BADSTATE,
! 650: * -FDT_ERR_BADSTRUCTURE, standard meanings
! 651: */
! 652: int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle);
! 653:
! 654: /**
! 655: * fdt_node_check_compatible: check a node's compatible property
! 656: * @fdt: pointer to the device tree blob
! 657: * @nodeoffset: offset of a tree node
! 658: * @compatible: string to match against
! 659: *
! 660: *
! 661: * fdt_node_check_compatible() returns 0 if the given node contains a
! 662: * 'compatible' property with the given string as one of its elements,
! 663: * it returns non-zero otherwise, or on error.
! 664: *
! 665: * returns:
! 666: * 0, if the node has a 'compatible' property listing the given string
! 667: * 1, if the node has a 'compatible' property, but it does not list
! 668: * the given string
! 669: * -FDT_ERR_NOTFOUND, if the given node has no 'compatible' property
! 670: * -FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag
! 671: * -FDT_ERR_BADMAGIC,
! 672: * -FDT_ERR_BADVERSION,
! 673: * -FDT_ERR_BADSTATE,
! 674: * -FDT_ERR_BADSTRUCTURE, standard meanings
! 675: */
! 676: int fdt_node_check_compatible(const void *fdt, int nodeoffset,
! 677: const char *compatible);
! 678:
! 679: /**
! 680: * fdt_node_offset_by_compatible - find nodes with a given 'compatible' value
! 681: * @fdt: pointer to the device tree blob
! 682: * @startoffset: only find nodes after this offset
! 683: * @compatible: 'compatible' string to match against
! 684: *
! 685: * fdt_node_offset_by_compatible() returns the offset of the first
! 686: * node after startoffset, which has a 'compatible' property which
! 687: * lists the given compatible string; or if startoffset is -1, the
! 688: * very first such node in the tree.
! 689: *
! 690: * To iterate through all nodes matching the criterion, the following
! 691: * idiom can be used:
! 692: * offset = fdt_node_offset_by_compatible(fdt, -1, compatible);
! 693: * while (offset != -FDT_ERR_NOTFOUND) {
! 694: * ... other code here ...
! 695: * offset = fdt_node_offset_by_compatible(fdt, offset, compatible);
! 696: * }
! 697: *
! 698: * Note the -1 in the first call to the function, if 0 is used here
! 699: * instead, the function will never locate the root node, even if it
! 700: * matches the criterion.
! 701: *
! 702: * returns:
! 703: * structure block offset of the located node (>= 0, >startoffset),
! 704: * on success
! 705: * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the
! 706: * tree after startoffset
! 707: * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
! 708: * -FDT_ERR_BADMAGIC,
! 709: * -FDT_ERR_BADVERSION,
! 710: * -FDT_ERR_BADSTATE,
! 711: * -FDT_ERR_BADSTRUCTURE, standard meanings
! 712: */
! 713: int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
! 714: const char *compatible);
! 715:
! 716: /**********************************************************************/
! 717: /* Write-in-place functions */
! 718: /**********************************************************************/
! 719:
! 720: /**
! 721: * fdt_setprop_inplace - change a property's value, but not its size
! 722: * @fdt: pointer to the device tree blob
! 723: * @nodeoffset: offset of the node whose property to change
! 724: * @name: name of the property to change
! 725: * @val: pointer to data to replace the property value with
! 726: * @len: length of the property value
! 727: *
! 728: * fdt_setprop_inplace() replaces the value of a given property with
! 729: * the data in val, of length len. This function cannot change the
! 730: * size of a property, and so will only work if len is equal to the
! 731: * current length of the property.
! 732: *
! 733: * This function will alter only the bytes in the blob which contain
! 734: * the given property value, and will not alter or move any other part
! 735: * of the tree.
! 736: *
! 737: * returns:
! 738: * 0, on success
! 739: * -FDT_ERR_NOSPACE, if len is not equal to the property's current length
! 740: * -FDT_ERR_NOTFOUND, node does not have the named property
! 741: * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
! 742: * -FDT_ERR_BADMAGIC,
! 743: * -FDT_ERR_BADVERSION,
! 744: * -FDT_ERR_BADSTATE,
! 745: * -FDT_ERR_BADSTRUCTURE,
! 746: * -FDT_ERR_TRUNCATED, standard meanings
! 747: */
! 748: int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
! 749: const void *val, int len);
! 750:
! 751: /**
! 752: * fdt_setprop_inplace_cell - change the value of a single-cell property
! 753: * @fdt: pointer to the device tree blob
! 754: * @nodeoffset: offset of the node whose property to change
! 755: * @name: name of the property to change
! 756: * @val: cell (32-bit integer) value to replace the property with
! 757: *
! 758: * fdt_setprop_inplace_cell() replaces the value of a given property
! 759: * with the 32-bit integer cell value in val, converting val to
! 760: * big-endian if necessary. This function cannot change the size of a
! 761: * property, and so will only work if the property already exists and
! 762: * has length 4.
! 763: *
! 764: * This function will alter only the bytes in the blob which contain
! 765: * the given property value, and will not alter or move any other part
! 766: * of the tree.
! 767: *
! 768: * returns:
! 769: * 0, on success
! 770: * -FDT_ERR_NOSPACE, if the property's length is not equal to 4
! 771: * -FDT_ERR_NOTFOUND, node does not have the named property
! 772: * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
! 773: * -FDT_ERR_BADMAGIC,
! 774: * -FDT_ERR_BADVERSION,
! 775: * -FDT_ERR_BADSTATE,
! 776: * -FDT_ERR_BADSTRUCTURE,
! 777: * -FDT_ERR_TRUNCATED, standard meanings
! 778: */
! 779: static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset,
! 780: const char *name, uint32_t val)
! 781: {
! 782: val = cpu_to_fdt32(val);
! 783: return fdt_setprop_inplace(fdt, nodeoffset, name, &val, sizeof(val));
! 784: }
! 785:
! 786: /**
! 787: * fdt_nop_property - replace a property with nop tags
! 788: * @fdt: pointer to the device tree blob
! 789: * @nodeoffset: offset of the node whose property to nop
! 790: * @name: name of the property to nop
! 791: *
! 792: * fdt_nop_property() will replace a given property's representation
! 793: * in the blob with FDT_NOP tags, effectively removing it from the
! 794: * tree.
! 795: *
! 796: * This function will alter only the bytes in the blob which contain
! 797: * the property, and will not alter or move any other part of the
! 798: * tree.
! 799: *
! 800: * returns:
! 801: * 0, on success
! 802: * -FDT_ERR_NOTFOUND, node does not have the named property
! 803: * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
! 804: * -FDT_ERR_BADMAGIC,
! 805: * -FDT_ERR_BADVERSION,
! 806: * -FDT_ERR_BADSTATE,
! 807: * -FDT_ERR_BADSTRUCTURE,
! 808: * -FDT_ERR_TRUNCATED, standard meanings
! 809: */
! 810: int fdt_nop_property(void *fdt, int nodeoffset, const char *name);
! 811:
! 812: /**
! 813: * fdt_nop_node - replace a node (subtree) with nop tags
! 814: * @fdt: pointer to the device tree blob
! 815: * @nodeoffset: offset of the node to nop
! 816: *
! 817: * fdt_nop_node() will replace a given node's representation in the
! 818: * blob, including all its subnodes, if any, with FDT_NOP tags,
! 819: * effectively removing it from the tree.
! 820: *
! 821: * This function will alter only the bytes in the blob which contain
! 822: * the node and its properties and subnodes, and will not alter or
! 823: * move any other part of the tree.
! 824: *
! 825: * returns:
! 826: * 0, on success
! 827: * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
! 828: * -FDT_ERR_BADMAGIC,
! 829: * -FDT_ERR_BADVERSION,
! 830: * -FDT_ERR_BADSTATE,
! 831: * -FDT_ERR_BADSTRUCTURE,
! 832: * -FDT_ERR_TRUNCATED, standard meanings
! 833: */
! 834: int fdt_nop_node(void *fdt, int nodeoffset);
! 835:
! 836: /**********************************************************************/
! 837: /* Sequential write functions */
! 838: /**********************************************************************/
! 839:
! 840: int fdt_create(void *buf, int bufsize);
! 841: int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size);
! 842: int fdt_finish_reservemap(void *fdt);
! 843: int fdt_begin_node(void *fdt, const char *name);
! 844: int fdt_property(void *fdt, const char *name, const void *val, int len);
! 845: static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)
! 846: {
! 847: val = cpu_to_fdt32(val);
! 848: return fdt_property(fdt, name, &val, sizeof(val));
! 849: }
! 850: #define fdt_property_string(fdt, name, str) \
! 851: fdt_property(fdt, name, str, strlen(str)+1)
! 852: int fdt_end_node(void *fdt);
! 853: int fdt_finish(void *fdt);
! 854:
! 855: /**********************************************************************/
! 856: /* Read-write functions */
! 857: /**********************************************************************/
! 858:
! 859: int fdt_open_into(const void *fdt, void *buf, int bufsize);
! 860: int fdt_pack(void *fdt);
! 861:
! 862: /**
! 863: * fdt_add_mem_rsv - add one memory reserve map entry
! 864: * @fdt: pointer to the device tree blob
! 865: * @address, @size: 64-bit values (native endian)
! 866: *
! 867: * Adds a reserve map entry to the given blob reserving a region at
! 868: * address address of length size.
! 869: *
! 870: * This function will insert data into the reserve map and will
! 871: * therefore change the indexes of some entries in the table.
! 872: *
! 873: * returns:
! 874: * 0, on success
! 875: * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
! 876: * contain the new reservation entry
! 877: * -FDT_ERR_BADMAGIC,
! 878: * -FDT_ERR_BADVERSION,
! 879: * -FDT_ERR_BADSTATE,
! 880: * -FDT_ERR_BADSTRUCTURE,
! 881: * -FDT_ERR_BADLAYOUT,
! 882: * -FDT_ERR_TRUNCATED, standard meanings
! 883: */
! 884: int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size);
! 885:
! 886: /**
! 887: * fdt_del_mem_rsv - remove a memory reserve map entry
! 888: * @fdt: pointer to the device tree blob
! 889: * @n: entry to remove
! 890: *
! 891: * fdt_del_mem_rsv() removes the n-th memory reserve map entry from
! 892: * the blob.
! 893: *
! 894: * This function will delete data from the reservation table and will
! 895: * therefore change the indexes of some entries in the table.
! 896: *
! 897: * returns:
! 898: * 0, on success
! 899: * -FDT_ERR_NOTFOUND, there is no entry of the given index (i.e. there
! 900: * are less than n+1 reserve map entries)
! 901: * -FDT_ERR_BADMAGIC,
! 902: * -FDT_ERR_BADVERSION,
! 903: * -FDT_ERR_BADSTATE,
! 904: * -FDT_ERR_BADSTRUCTURE,
! 905: * -FDT_ERR_BADLAYOUT,
! 906: * -FDT_ERR_TRUNCATED, standard meanings
! 907: */
! 908: int fdt_del_mem_rsv(void *fdt, int n);
! 909:
! 910: /**
! 911: * fdt_set_name - change the name of a given node
! 912: * @fdt: pointer to the device tree blob
! 913: * @nodeoffset: structure block offset of a node
! 914: * @name: name to give the node
! 915: *
! 916: * fdt_set_name() replaces the name (including unit address, if any)
! 917: * of the given node with the given string. NOTE: this function can't
! 918: * efficiently check if the new name is unique amongst the given
! 919: * node's siblings; results are undefined if this function is invoked
! 920: * with a name equal to one of the given node's siblings.
! 921: *
! 922: * This function may insert or delete data from the blob, and will
! 923: * therefore change the offsets of some existing nodes.
! 924: *
! 925: * returns:
! 926: * 0, on success
! 927: * -FDT_ERR_NOSPACE, there is insufficient free space in the blob
! 928: * to contain the new name
! 929: * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
! 930: * -FDT_ERR_BADMAGIC,
! 931: * -FDT_ERR_BADVERSION,
! 932: * -FDT_ERR_BADSTATE, standard meanings
! 933: */
! 934: int fdt_set_name(void *fdt, int nodeoffset, const char *name);
! 935:
! 936: /**
! 937: * fdt_setprop - create or change a property
! 938: * @fdt: pointer to the device tree blob
! 939: * @nodeoffset: offset of the node whose property to change
! 940: * @name: name of the property to change
! 941: * @val: pointer to data to set the property value to
! 942: * @len: length of the property value
! 943: *
! 944: * fdt_setprop() sets the value of the named property in the given
! 945: * node to the given value and length, creating the property if it
! 946: * does not already exist.
! 947: *
! 948: * This function may insert or delete data from the blob, and will
! 949: * therefore change the offsets of some existing nodes.
! 950: *
! 951: * returns:
! 952: * 0, on success
! 953: * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
! 954: * contain the new property value
! 955: * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
! 956: * -FDT_ERR_BADLAYOUT,
! 957: * -FDT_ERR_BADMAGIC,
! 958: * -FDT_ERR_BADVERSION,
! 959: * -FDT_ERR_BADSTATE,
! 960: * -FDT_ERR_BADSTRUCTURE,
! 961: * -FDT_ERR_BADLAYOUT,
! 962: * -FDT_ERR_TRUNCATED, standard meanings
! 963: */
! 964: int fdt_setprop(void *fdt, int nodeoffset, const char *name,
! 965: const void *val, int len);
! 966:
! 967: /**
! 968: * fdt_setprop_cell - set a property to a single cell value
! 969: * @fdt: pointer to the device tree blob
! 970: * @nodeoffset: offset of the node whose property to change
! 971: * @name: name of the property to change
! 972: * @val: 32-bit integer value for the property (native endian)
! 973: *
! 974: * fdt_setprop_cell() sets the value of the named property in the
! 975: * given node to the given cell value (converting to big-endian if
! 976: * necessary), or creates a new property with that value if it does
! 977: * not already exist.
! 978: *
! 979: * This function may insert or delete data from the blob, and will
! 980: * therefore change the offsets of some existing nodes.
! 981: *
! 982: * returns:
! 983: * 0, on success
! 984: * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
! 985: * contain the new property value
! 986: * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
! 987: * -FDT_ERR_BADLAYOUT,
! 988: * -FDT_ERR_BADMAGIC,
! 989: * -FDT_ERR_BADVERSION,
! 990: * -FDT_ERR_BADSTATE,
! 991: * -FDT_ERR_BADSTRUCTURE,
! 992: * -FDT_ERR_BADLAYOUT,
! 993: * -FDT_ERR_TRUNCATED, standard meanings
! 994: */
! 995: static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name,
! 996: uint32_t val)
! 997: {
! 998: val = cpu_to_fdt32(val);
! 999: return fdt_setprop(fdt, nodeoffset, name, &val, sizeof(val));
! 1000: }
! 1001:
! 1002: /**
! 1003: * fdt_setprop_string - set a property to a string value
! 1004: * @fdt: pointer to the device tree blob
! 1005: * @nodeoffset: offset of the node whose property to change
! 1006: * @name: name of the property to change
! 1007: * @str: string value for the property
! 1008: *
! 1009: * fdt_setprop_string() sets the value of the named property in the
! 1010: * given node to the given string value (using the length of the
! 1011: * string to determine the new length of the property), or creates a
! 1012: * new property with that value if it does not already exist.
! 1013: *
! 1014: * This function may insert or delete data from the blob, and will
! 1015: * therefore change the offsets of some existing nodes.
! 1016: *
! 1017: * returns:
! 1018: * 0, on success
! 1019: * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
! 1020: * contain the new property value
! 1021: * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
! 1022: * -FDT_ERR_BADLAYOUT,
! 1023: * -FDT_ERR_BADMAGIC,
! 1024: * -FDT_ERR_BADVERSION,
! 1025: * -FDT_ERR_BADSTATE,
! 1026: * -FDT_ERR_BADSTRUCTURE,
! 1027: * -FDT_ERR_BADLAYOUT,
! 1028: * -FDT_ERR_TRUNCATED, standard meanings
! 1029: */
! 1030: #define fdt_setprop_string(fdt, nodeoffset, name, str) \
! 1031: fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
! 1032:
! 1033: /**
! 1034: * fdt_delprop - delete a property
! 1035: * @fdt: pointer to the device tree blob
! 1036: * @nodeoffset: offset of the node whose property to nop
! 1037: * @name: name of the property to nop
! 1038: *
! 1039: * fdt_del_property() will delete the given property.
! 1040: *
! 1041: * This function will delete data from the blob, and will therefore
! 1042: * change the offsets of some existing nodes.
! 1043: *
! 1044: * returns:
! 1045: * 0, on success
! 1046: * -FDT_ERR_NOTFOUND, node does not have the named property
! 1047: * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
! 1048: * -FDT_ERR_BADLAYOUT,
! 1049: * -FDT_ERR_BADMAGIC,
! 1050: * -FDT_ERR_BADVERSION,
! 1051: * -FDT_ERR_BADSTATE,
! 1052: * -FDT_ERR_BADSTRUCTURE,
! 1053: * -FDT_ERR_TRUNCATED, standard meanings
! 1054: */
! 1055: int fdt_delprop(void *fdt, int nodeoffset, const char *name);
! 1056:
! 1057: /**
! 1058: * fdt_add_subnode_namelen - creates a new node based on substring
! 1059: * @fdt: pointer to the device tree blob
! 1060: * @parentoffset: structure block offset of a node
! 1061: * @name: name of the subnode to locate
! 1062: * @namelen: number of characters of name to consider
! 1063: *
! 1064: * Identical to fdt_add_subnode(), but use only the first namelen
! 1065: * characters of name as the name of the new node. This is useful for
! 1066: * creating subnodes based on a portion of a larger string, such as a
! 1067: * full path.
! 1068: */
! 1069: int fdt_add_subnode_namelen(void *fdt, int parentoffset,
! 1070: const char *name, int namelen);
! 1071:
! 1072: /**
! 1073: * fdt_add_subnode - creates a new node
! 1074: * @fdt: pointer to the device tree blob
! 1075: * @parentoffset: structure block offset of a node
! 1076: * @name: name of the subnode to locate
! 1077: *
! 1078: * fdt_add_subnode() creates a new node as a subnode of the node at
! 1079: * structure block offset parentoffset, with the given name (which
! 1080: * should include the unit address, if any).
! 1081: *
! 1082: * This function will insert data into the blob, and will therefore
! 1083: * change the offsets of some existing nodes.
! 1084:
! 1085: * returns:
! 1086: * structure block offset of the created nodeequested subnode (>=0), on success
! 1087: * -FDT_ERR_NOTFOUND, if the requested subnode does not exist
! 1088: * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag
! 1089: * -FDT_ERR_EXISTS, if the node at parentoffset already has a subnode of
! 1090: * the given name
! 1091: * -FDT_ERR_NOSPACE, if there is insufficient free space in the
! 1092: * blob to contain the new node
! 1093: * -FDT_ERR_NOSPACE
! 1094: * -FDT_ERR_BADLAYOUT
! 1095: * -FDT_ERR_BADMAGIC,
! 1096: * -FDT_ERR_BADVERSION,
! 1097: * -FDT_ERR_BADSTATE,
! 1098: * -FDT_ERR_BADSTRUCTURE,
! 1099: * -FDT_ERR_TRUNCATED, standard meanings.
! 1100: */
! 1101: int fdt_add_subnode(void *fdt, int parentoffset, const char *name);
! 1102:
! 1103: /**
! 1104: * fdt_del_node - delete a node (subtree)
! 1105: * @fdt: pointer to the device tree blob
! 1106: * @nodeoffset: offset of the node to nop
! 1107: *
! 1108: * fdt_del_node() will remove the given node, including all its
! 1109: * subnodes if any, from the blob.
! 1110: *
! 1111: * This function will delete data from the blob, and will therefore
! 1112: * change the offsets of some existing nodes.
! 1113: *
! 1114: * returns:
! 1115: * 0, on success
! 1116: * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
! 1117: * -FDT_ERR_BADLAYOUT,
! 1118: * -FDT_ERR_BADMAGIC,
! 1119: * -FDT_ERR_BADVERSION,
! 1120: * -FDT_ERR_BADSTATE,
! 1121: * -FDT_ERR_BADSTRUCTURE,
! 1122: * -FDT_ERR_TRUNCATED, standard meanings
! 1123: */
! 1124: int fdt_del_node(void *fdt, int nodeoffset);
! 1125:
! 1126: /**********************************************************************/
! 1127: /* Debugging / informational functions */
! 1128: /**********************************************************************/
! 1129:
! 1130: const char *fdt_strerror(int errval);
! 1131:
! 1132: #endif /* _LIBFDT_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>