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>