19537Satgutier@umich.edu/*
29537Satgutier@umich.edu * libfdt - Flat Device Tree manipulation
39537Satgutier@umich.edu * Copyright (C) 2006 David Gibson, IBM Corporation.
49537Satgutier@umich.edu *
59537Satgutier@umich.edu *     Redistribution and use in source and binary forms, with or
69537Satgutier@umich.edu *     without modification, are permitted provided that the following
79537Satgutier@umich.edu *     conditions are met:
89537Satgutier@umich.edu *
99537Satgutier@umich.edu *     1. Redistributions of source code must retain the above
109537Satgutier@umich.edu *        copyright notice, this list of conditions and the following
119537Satgutier@umich.edu *        disclaimer.
129537Satgutier@umich.edu *     2. Redistributions in binary form must reproduce the above
139537Satgutier@umich.edu *        copyright notice, this list of conditions and the following
149537Satgutier@umich.edu *        disclaimer in the documentation and/or other materials
159537Satgutier@umich.edu *        provided with the distribution.
169537Satgutier@umich.edu *
179537Satgutier@umich.edu *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
189537Satgutier@umich.edu *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
199537Satgutier@umich.edu *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
209537Satgutier@umich.edu *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
219537Satgutier@umich.edu *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
229537Satgutier@umich.edu *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
239537Satgutier@umich.edu *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
249537Satgutier@umich.edu *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
259537Satgutier@umich.edu *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
269537Satgutier@umich.edu *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
279537Satgutier@umich.edu *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
289537Satgutier@umich.edu *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
299537Satgutier@umich.edu *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
309537Satgutier@umich.edu */
319537Satgutier@umich.edu#include <fdt.h>
329537Satgutier@umich.edu#include <libfdt.h>
339537Satgutier@umich.edu
349537Satgutier@umich.edu#include "libfdt_env.h"
359537Satgutier@umich.edu#include "libfdt_internal.h"
369537Satgutier@umich.edu
379537Satgutier@umich.eduint fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
389537Satgutier@umich.edu                        const void *val, int len)
399537Satgutier@umich.edu{
409537Satgutier@umich.edu        void *propval;
419537Satgutier@umich.edu        int proplen;
429537Satgutier@umich.edu
439537Satgutier@umich.edu        propval = fdt_getprop_w(fdt, nodeoffset, name, &proplen);
449537Satgutier@umich.edu        if (! propval)
459537Satgutier@umich.edu                return proplen;
469537Satgutier@umich.edu
479537Satgutier@umich.edu        if (proplen != len)
489537Satgutier@umich.edu                return -FDT_ERR_NOSPACE;
499537Satgutier@umich.edu
509537Satgutier@umich.edu        memcpy(propval, val, len);
519537Satgutier@umich.edu        return 0;
529537Satgutier@umich.edu}
539537Satgutier@umich.edu
549537Satgutier@umich.edustatic void _fdt_nop_region(void *start, int len)
559537Satgutier@umich.edu{
569537Satgutier@umich.edu        fdt32_t *p;
579537Satgutier@umich.edu
589537Satgutier@umich.edu        for (p = start; (char *)p < ((char *)start + len); p++)
599537Satgutier@umich.edu                *p = cpu_to_fdt32(FDT_NOP);
609537Satgutier@umich.edu}
619537Satgutier@umich.edu
629537Satgutier@umich.eduint fdt_nop_property(void *fdt, int nodeoffset, const char *name)
639537Satgutier@umich.edu{
649537Satgutier@umich.edu        struct fdt_property *prop;
659537Satgutier@umich.edu        int len;
669537Satgutier@umich.edu
679537Satgutier@umich.edu        prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
689537Satgutier@umich.edu        if (! prop)
699537Satgutier@umich.edu                return len;
709537Satgutier@umich.edu
719537Satgutier@umich.edu        _fdt_nop_region(prop, len + sizeof(*prop));
729537Satgutier@umich.edu
739537Satgutier@umich.edu        return 0;
749537Satgutier@umich.edu}
759537Satgutier@umich.edu
769537Satgutier@umich.eduint _fdt_node_end_offset(void *fdt, int offset)
779537Satgutier@umich.edu{
789537Satgutier@umich.edu        int depth = 0;
799537Satgutier@umich.edu
809537Satgutier@umich.edu        while ((offset >= 0) && (depth >= 0))
819537Satgutier@umich.edu                offset = fdt_next_node(fdt, offset, &depth);
829537Satgutier@umich.edu
839537Satgutier@umich.edu        return offset;
849537Satgutier@umich.edu}
859537Satgutier@umich.edu
869537Satgutier@umich.eduint fdt_nop_node(void *fdt, int nodeoffset)
879537Satgutier@umich.edu{
889537Satgutier@umich.edu        int endoffset;
899537Satgutier@umich.edu
909537Satgutier@umich.edu        endoffset = _fdt_node_end_offset(fdt, nodeoffset);
919537Satgutier@umich.edu        if (endoffset < 0)
929537Satgutier@umich.edu                return endoffset;
939537Satgutier@umich.edu
949537Satgutier@umich.edu        _fdt_nop_region(fdt_offset_ptr_w(fdt, nodeoffset, 0),
959537Satgutier@umich.edu                        endoffset - nodeoffset);
969537Satgutier@umich.edu        return 0;
979537Satgutier@umich.edu}
98