13da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson/* 23da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson * libfdt - Flat Device Tree manipulation 33da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson * Copyright (C) 2006 David Gibson, IBM Corporation. 43da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson * 5948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * libfdt is dual licensed: you can use it either under the terms of 6948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * the GPL, or the BSD license, at your option. 7948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * 8948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * a) This library is free software; you can redistribute it and/or 9948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * modify it under the terms of the GNU General Public License as 10948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * published by the Free Software Foundation; either version 2 of the 11948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * License, or (at your option) any later version. 12948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * 13948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * This library is distributed in the hope that it will be useful, 14948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * but WITHOUT ANY WARRANTY; without even the implied warranty of 15948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * GNU General Public License for more details. 17948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * 18948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * You should have received a copy of the GNU General Public 19948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * License along with this library; if not, write to the Free 20948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, 21948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * MA 02110-1301 USA 22948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * 23948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * Alternatively, 24948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * 25948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * b) Redistribution and use in source and binary forms, with or 26948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * without modification, are permitted provided that the following 27948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * conditions are met: 28948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * 29948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * 1. Redistributions of source code must retain the above 30948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * copyright notice, this list of conditions and the following 31948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * disclaimer. 32948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * 2. Redistributions in binary form must reproduce the above 33948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * copyright notice, this list of conditions and the following 34948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * disclaimer in the documentation and/or other materials 35948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * provided with the distribution. 36948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * 37948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 38948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 39948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 40948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 41948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 42948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 43948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 44948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 45948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 46948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 47948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 48948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 49948160520884b10f545bec792e0d37c1c14bbf2fDavid Gibson * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 503da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson */ 513da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson#include "libfdt_env.h" 523da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson 533da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson#include <fdt.h> 543da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson#include <libfdt.h> 553da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson 563da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson#include "libfdt_internal.h" 573da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson 5896b5fad3a12697b8f2a50dbca944bd44c6f4eec8David Gibsonint fdt_check_header(const void *fdt) 59423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson{ 60423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson if (fdt_magic(fdt) == FDT_MAGIC) { 61423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson /* Complete tree */ 62423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) 639a9fdf59913c6d14f1755fe653dc8161ec6b0b7bDavid Gibson return -FDT_ERR_BADVERSION; 64423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION) 659a9fdf59913c6d14f1755fe653dc8161ec6b0b7bDavid Gibson return -FDT_ERR_BADVERSION; 66b6d80a20fc293f3b995c3ce1a6744a5574192125David Gibson } else if (fdt_magic(fdt) == FDT_SW_MAGIC) { 67423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson /* Unfinished sequential-write blob */ 68fe92f6bb75668d4ff1e5bf08b2ac432ba68fb5b3David Gibson if (fdt_size_dt_struct(fdt) == 0) 699a9fdf59913c6d14f1755fe653dc8161ec6b0b7bDavid Gibson return -FDT_ERR_BADSTATE; 70423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson } else { 719a9fdf59913c6d14f1755fe653dc8161ec6b0b7bDavid Gibson return -FDT_ERR_BADMAGIC; 72423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson } 73423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson 74423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson return 0; 75423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson} 76423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson 77b236893fc4bc173877adfa4270b14d7d7209fb10Jon Loeligerconst void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len) 783da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson{ 79d0b3ab0a0f46ac929b4713da46f7fdcd893dd3bdDavid Gibson unsigned absoffset = offset + fdt_off_dt_struct(fdt); 80d0b3ab0a0f46ac929b4713da46f7fdcd893dd3bdDavid Gibson 81d0b3ab0a0f46ac929b4713da46f7fdcd893dd3bdDavid Gibson if ((absoffset < offset) 82d0b3ab0a0f46ac929b4713da46f7fdcd893dd3bdDavid Gibson || ((absoffset + len) < absoffset) 83d0b3ab0a0f46ac929b4713da46f7fdcd893dd3bdDavid Gibson || (absoffset + len) > fdt_totalsize(fdt)) 84d0b3ab0a0f46ac929b4713da46f7fdcd893dd3bdDavid Gibson return NULL; 853da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson 86fe92f6bb75668d4ff1e5bf08b2ac432ba68fb5b3David Gibson if (fdt_version(fdt) >= 0x11) 87fe92f6bb75668d4ff1e5bf08b2ac432ba68fb5b3David Gibson if (((offset + len) < offset) 88fe92f6bb75668d4ff1e5bf08b2ac432ba68fb5b3David Gibson || ((offset + len) > fdt_size_dt_struct(fdt))) 89fe92f6bb75668d4ff1e5bf08b2ac432ba68fb5b3David Gibson return NULL; 90fe92f6bb75668d4ff1e5bf08b2ac432ba68fb5b3David Gibson 91d0b3ab0a0f46ac929b4713da46f7fdcd893dd3bdDavid Gibson return _fdt_offset_ptr(fdt, offset); 923da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson} 933da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson 941a020e403048a56ffacb8c6f71aef0944b901757David Gibsonuint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset) 953da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson{ 96142419e43c99e88cbe72a760a72cdbf520690eb6Kim Phillips const fdt32_t *tagp, *lenp; 973da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson uint32_t tag; 981a020e403048a56ffacb8c6f71aef0944b901757David Gibson int offset = startoffset; 993da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson const char *p; 1003da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson 1011a020e403048a56ffacb8c6f71aef0944b901757David Gibson *nextoffset = -FDT_ERR_TRUNCATED; 1023da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE); 1031a020e403048a56ffacb8c6f71aef0944b901757David Gibson if (!tagp) 1043da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson return FDT_END; /* premature end */ 1053da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson tag = fdt32_to_cpu(*tagp); 1063da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson offset += FDT_TAGSIZE; 1073da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson 1081a020e403048a56ffacb8c6f71aef0944b901757David Gibson *nextoffset = -FDT_ERR_BADSTRUCTURE; 1093da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson switch (tag) { 1103da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson case FDT_BEGIN_NODE: 1113da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson /* skip name */ 1123da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson do { 1133da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson p = fdt_offset_ptr(fdt, offset++, 1); 1143da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson } while (p && (*p != '\0')); 1151a020e403048a56ffacb8c6f71aef0944b901757David Gibson if (!p) 1161a020e403048a56ffacb8c6f71aef0944b901757David Gibson return FDT_END; /* premature end */ 1173da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson break; 1181a020e403048a56ffacb8c6f71aef0944b901757David Gibson 1193da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson case FDT_PROP: 12007a12a08005f3b5cd9337900a6551e450c07b515David Gibson lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp)); 1211a020e403048a56ffacb8c6f71aef0944b901757David Gibson if (!lenp) 1221a020e403048a56ffacb8c6f71aef0944b901757David Gibson return FDT_END; /* premature end */ 1231a020e403048a56ffacb8c6f71aef0944b901757David Gibson /* skip-name offset, length and value */ 1241a020e403048a56ffacb8c6f71aef0944b901757David Gibson offset += sizeof(struct fdt_property) - FDT_TAGSIZE 1251a020e403048a56ffacb8c6f71aef0944b901757David Gibson + fdt32_to_cpu(*lenp); 1261a020e403048a56ffacb8c6f71aef0944b901757David Gibson break; 1271a020e403048a56ffacb8c6f71aef0944b901757David Gibson 1281a020e403048a56ffacb8c6f71aef0944b901757David Gibson case FDT_END: 1291a020e403048a56ffacb8c6f71aef0944b901757David Gibson case FDT_END_NODE: 1301a020e403048a56ffacb8c6f71aef0944b901757David Gibson case FDT_NOP: 1313da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson break; 1321a020e403048a56ffacb8c6f71aef0944b901757David Gibson 1331a020e403048a56ffacb8c6f71aef0944b901757David Gibson default: 1341a020e403048a56ffacb8c6f71aef0944b901757David Gibson return FDT_END; 1353da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson } 1363da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson 1371a020e403048a56ffacb8c6f71aef0944b901757David Gibson if (!fdt_offset_ptr(fdt, startoffset, offset - startoffset)) 1381a020e403048a56ffacb8c6f71aef0944b901757David Gibson return FDT_END; /* premature end */ 1393da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson 1401a020e403048a56ffacb8c6f71aef0944b901757David Gibson *nextoffset = FDT_TAGALIGN(offset); 1413da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson return tag; 1423da0f9a10dfa9b615d06c350c7b9fe29f360a6eDavid Gibson} 143423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson 144aa1baab3cc184169cfb05dfe289b5179c8333e3cDavid Gibsonint _fdt_check_node_offset(const void *fdt, int offset) 145aa1baab3cc184169cfb05dfe289b5179c8333e3cDavid Gibson{ 146aa1baab3cc184169cfb05dfe289b5179c8333e3cDavid Gibson if ((offset < 0) || (offset % FDT_TAGSIZE) 147aa1baab3cc184169cfb05dfe289b5179c8333e3cDavid Gibson || (fdt_next_tag(fdt, offset, &offset) != FDT_BEGIN_NODE)) 148aa1baab3cc184169cfb05dfe289b5179c8333e3cDavid Gibson return -FDT_ERR_BADOFFSET; 149aa1baab3cc184169cfb05dfe289b5179c8333e3cDavid Gibson 150aa1baab3cc184169cfb05dfe289b5179c8333e3cDavid Gibson return offset; 151aa1baab3cc184169cfb05dfe289b5179c8333e3cDavid Gibson} 152aa1baab3cc184169cfb05dfe289b5179c8333e3cDavid Gibson 15373dca9ae0b9abe6924ba640164ecce9f8df69c5aDavid Gibsonint _fdt_check_prop_offset(const void *fdt, int offset) 15473dca9ae0b9abe6924ba640164ecce9f8df69c5aDavid Gibson{ 15573dca9ae0b9abe6924ba640164ecce9f8df69c5aDavid Gibson if ((offset < 0) || (offset % FDT_TAGSIZE) 15673dca9ae0b9abe6924ba640164ecce9f8df69c5aDavid Gibson || (fdt_next_tag(fdt, offset, &offset) != FDT_PROP)) 15773dca9ae0b9abe6924ba640164ecce9f8df69c5aDavid Gibson return -FDT_ERR_BADOFFSET; 15873dca9ae0b9abe6924ba640164ecce9f8df69c5aDavid Gibson 15973dca9ae0b9abe6924ba640164ecce9f8df69c5aDavid Gibson return offset; 16073dca9ae0b9abe6924ba640164ecce9f8df69c5aDavid Gibson} 16173dca9ae0b9abe6924ba640164ecce9f8df69c5aDavid Gibson 162fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibsonint fdt_next_node(const void *fdt, int offset, int *depth) 163fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson{ 164fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson int nextoffset = 0; 165fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson uint32_t tag; 166fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson 167aa1baab3cc184169cfb05dfe289b5179c8333e3cDavid Gibson if (offset >= 0) 168aa1baab3cc184169cfb05dfe289b5179c8333e3cDavid Gibson if ((nextoffset = _fdt_check_node_offset(fdt, offset)) < 0) 169aa1baab3cc184169cfb05dfe289b5179c8333e3cDavid Gibson return nextoffset; 170fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson 171fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson do { 172fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson offset = nextoffset; 173fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson tag = fdt_next_tag(fdt, offset, &nextoffset); 174fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson 175fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson switch (tag) { 176fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson case FDT_PROP: 177fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson case FDT_NOP: 178fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson break; 179fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson 180fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson case FDT_BEGIN_NODE: 181fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson if (depth) 182fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson (*depth)++; 183fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson break; 184fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson 185fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson case FDT_END_NODE: 186ce4d9c0f746b21119bc2b5aa5571bb08799a82bdDavid Gibson if (depth && ((--(*depth)) < 0)) 187ce4d9c0f746b21119bc2b5aa5571bb08799a82bdDavid Gibson return nextoffset; 188fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson break; 189fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson 190fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson case FDT_END: 1911a020e403048a56ffacb8c6f71aef0944b901757David Gibson if ((nextoffset >= 0) 1921a020e403048a56ffacb8c6f71aef0944b901757David Gibson || ((nextoffset == -FDT_ERR_TRUNCATED) && !depth)) 1931a020e403048a56ffacb8c6f71aef0944b901757David Gibson return -FDT_ERR_NOTFOUND; 1941a020e403048a56ffacb8c6f71aef0944b901757David Gibson else 1951a020e403048a56ffacb8c6f71aef0944b901757David Gibson return nextoffset; 196fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson } 197fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson } while (tag != FDT_BEGIN_NODE); 198fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson 199fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson return offset; 200fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson} 201fc9769ac2bae8a32d5d277007d22414c4516b02bDavid Gibson 2024e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glassint fdt_first_subnode(const void *fdt, int offset) 2034e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass{ 2044e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass int depth = 0; 2054e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass 2064e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass offset = fdt_next_node(fdt, offset, &depth); 2074e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass if (offset < 0 || depth != 1) 2084e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass return -FDT_ERR_NOTFOUND; 2094e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass 2104e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass return offset; 2114e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass} 2124e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass 2134e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glassint fdt_next_subnode(const void *fdt, int offset) 2144e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass{ 2154e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass int depth = 1; 2164e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass 2174e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass /* 2184e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass * With respect to the parent, the depth of the next subnode will be 2194e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass * the same as the last. 2204e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass */ 2214e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass do { 2224e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass offset = fdt_next_node(fdt, offset, &depth); 2234e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass if (offset < 0 || depth < 1) 2244e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass return -FDT_ERR_NOTFOUND; 2254e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass } while (depth > 1); 2264e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass 2274e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass return offset; 2284e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass} 2294e76ec796c90d44d417f82d9db2d67cfe575f8edSimon Glass 230aeddfe2c34c88c386749334746e4016431d10952David Gibsonconst char *_fdt_find_string(const char *strtab, int tabsize, const char *s) 231aeddfe2c34c88c386749334746e4016431d10952David Gibson{ 232aeddfe2c34c88c386749334746e4016431d10952David Gibson int len = strlen(s) + 1; 233aeddfe2c34c88c386749334746e4016431d10952David Gibson const char *last = strtab + tabsize - len; 234aeddfe2c34c88c386749334746e4016431d10952David Gibson const char *p; 235aeddfe2c34c88c386749334746e4016431d10952David Gibson 236aeddfe2c34c88c386749334746e4016431d10952David Gibson for (p = strtab; p <= last; p++) 237b6d80a20fc293f3b995c3ce1a6744a5574192125David Gibson if (memcmp(p, s, len) == 0) 238aeddfe2c34c88c386749334746e4016431d10952David Gibson return p; 239aeddfe2c34c88c386749334746e4016431d10952David Gibson return NULL; 240aeddfe2c34c88c386749334746e4016431d10952David Gibson} 241aeddfe2c34c88c386749334746e4016431d10952David Gibson 24273d60926a05814b8864c86c435e272b386513b0eDavid Gibsonint fdt_move(const void *fdt, void *buf, int bufsize) 243423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson{ 244b6d80a20fc293f3b995c3ce1a6744a5574192125David Gibson FDT_CHECK_HEADER(fdt); 245423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson 246423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson if (fdt_totalsize(fdt) > bufsize) 2479a9fdf59913c6d14f1755fe653dc8161ec6b0b7bDavid Gibson return -FDT_ERR_NOSPACE; 248423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson 249423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson memmove(buf, fdt, fdt_totalsize(fdt)); 2509a9fdf59913c6d14f1755fe653dc8161ec6b0b7bDavid Gibson return 0; 251423697628aa15f578a3fe8e499cdbb7ca64d075eDavid Gibson} 252