1243ce5d5SMadhukar Pappireddy // SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) 2630b011fSAntonio Nino Diaz /* 3630b011fSAntonio Nino Diaz * libfdt - Flat Device Tree manipulation 4630b011fSAntonio Nino Diaz * Copyright (C) 2006 David Gibson, IBM Corporation. 5630b011fSAntonio Nino Diaz */ 6630b011fSAntonio Nino Diaz #include "libfdt_env.h" 7630b011fSAntonio Nino Diaz 8630b011fSAntonio Nino Diaz #include <fdt.h> 9630b011fSAntonio Nino Diaz #include <libfdt.h> 10630b011fSAntonio Nino Diaz 11630b011fSAntonio Nino Diaz #include "libfdt_internal.h" 12630b011fSAntonio Nino Diaz 13630b011fSAntonio Nino Diaz int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset, 14630b011fSAntonio Nino Diaz const char *name, int namelen, 15630b011fSAntonio Nino Diaz uint32_t idx, const void *val, 16630b011fSAntonio Nino Diaz int len) 17630b011fSAntonio Nino Diaz { 18630b011fSAntonio Nino Diaz void *propval; 19630b011fSAntonio Nino Diaz int proplen; 20630b011fSAntonio Nino Diaz 21630b011fSAntonio Nino Diaz propval = fdt_getprop_namelen_w(fdt, nodeoffset, name, namelen, 22630b011fSAntonio Nino Diaz &proplen); 23630b011fSAntonio Nino Diaz if (!propval) 24630b011fSAntonio Nino Diaz return proplen; 25630b011fSAntonio Nino Diaz 26*3b456661SAndre Przywara if ((unsigned)proplen < (len + idx)) 27630b011fSAntonio Nino Diaz return -FDT_ERR_NOSPACE; 28630b011fSAntonio Nino Diaz 29630b011fSAntonio Nino Diaz memcpy((char *)propval + idx, val, len); 30630b011fSAntonio Nino Diaz return 0; 31630b011fSAntonio Nino Diaz } 32630b011fSAntonio Nino Diaz 33630b011fSAntonio Nino Diaz int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name, 34630b011fSAntonio Nino Diaz const void *val, int len) 35630b011fSAntonio Nino Diaz { 36630b011fSAntonio Nino Diaz const void *propval; 37630b011fSAntonio Nino Diaz int proplen; 38630b011fSAntonio Nino Diaz 39630b011fSAntonio Nino Diaz propval = fdt_getprop(fdt, nodeoffset, name, &proplen); 40630b011fSAntonio Nino Diaz if (!propval) 41630b011fSAntonio Nino Diaz return proplen; 42630b011fSAntonio Nino Diaz 43630b011fSAntonio Nino Diaz if (proplen != len) 44630b011fSAntonio Nino Diaz return -FDT_ERR_NOSPACE; 45630b011fSAntonio Nino Diaz 46630b011fSAntonio Nino Diaz return fdt_setprop_inplace_namelen_partial(fdt, nodeoffset, name, 47630b011fSAntonio Nino Diaz strlen(name), 0, 48630b011fSAntonio Nino Diaz val, len); 49630b011fSAntonio Nino Diaz } 50630b011fSAntonio Nino Diaz 51630b011fSAntonio Nino Diaz static void fdt_nop_region_(void *start, int len) 52630b011fSAntonio Nino Diaz { 53630b011fSAntonio Nino Diaz fdt32_t *p; 54630b011fSAntonio Nino Diaz 55630b011fSAntonio Nino Diaz for (p = start; (char *)p < ((char *)start + len); p++) 56630b011fSAntonio Nino Diaz *p = cpu_to_fdt32(FDT_NOP); 57630b011fSAntonio Nino Diaz } 58630b011fSAntonio Nino Diaz 59630b011fSAntonio Nino Diaz int fdt_nop_property(void *fdt, int nodeoffset, const char *name) 60630b011fSAntonio Nino Diaz { 61630b011fSAntonio Nino Diaz struct fdt_property *prop; 62630b011fSAntonio Nino Diaz int len; 63630b011fSAntonio Nino Diaz 64630b011fSAntonio Nino Diaz prop = fdt_get_property_w(fdt, nodeoffset, name, &len); 65630b011fSAntonio Nino Diaz if (!prop) 66630b011fSAntonio Nino Diaz return len; 67630b011fSAntonio Nino Diaz 68630b011fSAntonio Nino Diaz fdt_nop_region_(prop, len + sizeof(*prop)); 69630b011fSAntonio Nino Diaz 70630b011fSAntonio Nino Diaz return 0; 71630b011fSAntonio Nino Diaz } 72630b011fSAntonio Nino Diaz 73630b011fSAntonio Nino Diaz int fdt_node_end_offset_(void *fdt, int offset) 74630b011fSAntonio Nino Diaz { 75630b011fSAntonio Nino Diaz int depth = 0; 76630b011fSAntonio Nino Diaz 77630b011fSAntonio Nino Diaz while ((offset >= 0) && (depth >= 0)) 78630b011fSAntonio Nino Diaz offset = fdt_next_node(fdt, offset, &depth); 79630b011fSAntonio Nino Diaz 80630b011fSAntonio Nino Diaz return offset; 81630b011fSAntonio Nino Diaz } 82630b011fSAntonio Nino Diaz 83630b011fSAntonio Nino Diaz int fdt_nop_node(void *fdt, int nodeoffset) 84630b011fSAntonio Nino Diaz { 85630b011fSAntonio Nino Diaz int endoffset; 86630b011fSAntonio Nino Diaz 87630b011fSAntonio Nino Diaz endoffset = fdt_node_end_offset_(fdt, nodeoffset); 88630b011fSAntonio Nino Diaz if (endoffset < 0) 89630b011fSAntonio Nino Diaz return endoffset; 90630b011fSAntonio Nino Diaz 91630b011fSAntonio Nino Diaz fdt_nop_region_(fdt_offset_ptr_w(fdt, nodeoffset, 0), 92630b011fSAntonio Nino Diaz endoffset - nodeoffset); 93630b011fSAntonio Nino Diaz return 0; 94630b011fSAntonio Nino Diaz } 95