1ae9ace70SMasahiro Yamada /* SPDX-License-Identifier: GPL-2.0+ BSD-2-Clause */ 2ae9ace70SMasahiro Yamada #include "fdt_host.h" 3ae9ace70SMasahiro Yamada #include "../../scripts/dtc/libfdt/fdt_rw.c" 4ae9ace70SMasahiro Yamada 5ae9ace70SMasahiro Yamada int fdt_remove_unused_strings(const void *old, void *new) 6ae9ace70SMasahiro Yamada { 7ae9ace70SMasahiro Yamada const struct fdt_property *old_prop; 8ae9ace70SMasahiro Yamada struct fdt_property *new_prop; 9ae9ace70SMasahiro Yamada int size = fdt_totalsize(old); 10ae9ace70SMasahiro Yamada int next_offset, offset; 11ae9ace70SMasahiro Yamada const char *str; 12ae9ace70SMasahiro Yamada int ret; 13ae9ace70SMasahiro Yamada int tag = FDT_PROP; 14ae9ace70SMasahiro Yamada 15ae9ace70SMasahiro Yamada /* Make a copy and remove the strings */ 16ae9ace70SMasahiro Yamada memcpy(new, old, size); 17ae9ace70SMasahiro Yamada fdt_set_size_dt_strings(new, 0); 18ae9ace70SMasahiro Yamada 19ae9ace70SMasahiro Yamada /* Add every property name back into the new string table */ 20ae9ace70SMasahiro Yamada for (offset = 0; tag != FDT_END; offset = next_offset) { 21ae9ace70SMasahiro Yamada tag = fdt_next_tag(old, offset, &next_offset); 22ae9ace70SMasahiro Yamada if (tag != FDT_PROP) 23ae9ace70SMasahiro Yamada continue; 24ae9ace70SMasahiro Yamada old_prop = fdt_get_property_by_offset(old, offset, NULL); 25ae9ace70SMasahiro Yamada new_prop = (struct fdt_property *)(unsigned long) 26ae9ace70SMasahiro Yamada fdt_get_property_by_offset(new, offset, NULL); 27ae9ace70SMasahiro Yamada str = fdt_string(old, fdt32_to_cpu(old_prop->nameoff)); 28*db405d19SRob Herring ret = fdt_find_add_string_(new, str); 29ae9ace70SMasahiro Yamada if (ret < 0) 30ae9ace70SMasahiro Yamada return ret; 31ae9ace70SMasahiro Yamada new_prop->nameoff = cpu_to_fdt32(ret); 32ae9ace70SMasahiro Yamada } 33ae9ace70SMasahiro Yamada 34ae9ace70SMasahiro Yamada return 0; 35ae9ace70SMasahiro Yamada } 36