On Thu, Jul 19, 2018 at 08:19:43AM +0200, Sebastian Huber wrote: > Add internal fdt_cells() to avoid copy and paste. Test error cases and > default values. Fix typo in fdt_size_cells() documentation comment. > > Signed-off-by: Sebastian Huber <sebastian.huber@xxxxxxxxxxxxxxxxxx> Applied, thanks. > --- > libfdt/fdt_addresses.c | 35 ++++++++++----------------- > libfdt/libfdt.h | 2 +- > tests/.gitignore | 1 + > tests/Makefile.tests | 1 + > tests/addr_size_cells.c | 3 +++ > tests/addr_size_cells2.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ > tests/addresses.dts | 15 ++++++++++++ > tests/run_tests.sh | 2 ++ > 8 files changed, 98 insertions(+), 23 deletions(-) > create mode 100644 tests/addr_size_cells2.c > > diff --git a/libfdt/fdt_addresses.c b/libfdt/fdt_addresses.c > index eff4dbc..49537b5 100644 > --- a/libfdt/fdt_addresses.c > +++ b/libfdt/fdt_addresses.c > @@ -1,6 +1,7 @@ > /* > * libfdt - Flat Device Tree manipulation > * Copyright (C) 2014 David Gibson <david@xxxxxxxxxxxxxxxxxxxxx> > + * Copyright (C) 2018 embedded brains GmbH > * > * libfdt is dual licensed: you can use it either under the terms of > * the GPL, or the BSD license, at your option. > @@ -55,42 +56,32 @@ > > #include "libfdt_internal.h" > > -int fdt_address_cells(const void *fdt, int nodeoffset) > +static int fdt_cells(const void *fdt, int nodeoffset, const char *name) > { > - const fdt32_t *ac; > + const fdt32_t *c; > int val; > int len; > > - ac = fdt_getprop(fdt, nodeoffset, "#address-cells", &len); > - if (!ac) > + c = fdt_getprop(fdt, nodeoffset, name, &len); > + if (!c) > return 2; > > - if (len != sizeof(*ac)) > + if (len != sizeof(*c)) > return -FDT_ERR_BADNCELLS; > > - val = fdt32_to_cpu(*ac); > + val = fdt32_to_cpu(*c); > if ((val <= 0) || (val > FDT_MAX_NCELLS)) > return -FDT_ERR_BADNCELLS; > > return val; > } > > -int fdt_size_cells(const void *fdt, int nodeoffset) > +int fdt_address_cells(const void *fdt, int nodeoffset) > { > - const fdt32_t *sc; > - int val; > - int len; > - > - sc = fdt_getprop(fdt, nodeoffset, "#size-cells", &len); > - if (!sc) > - return 2; > - > - if (len != sizeof(*sc)) > - return -FDT_ERR_BADNCELLS; > - > - val = fdt32_to_cpu(*sc); > - if ((val < 0) || (val > FDT_MAX_NCELLS)) > - return -FDT_ERR_BADNCELLS; > + return fdt_cells(fdt, nodeoffset, "#address-cells"); > +} > > - return val; > +int fdt_size_cells(const void *fdt, int nodeoffset) > +{ > + return fdt_cells(fdt, nodeoffset, "#size-cells"); > } > diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h > index 38ec313..830b77e 100644 > --- a/libfdt/libfdt.h > +++ b/libfdt/libfdt.h > @@ -1145,7 +1145,7 @@ int fdt_address_cells(const void *fdt, int nodeoffset); > * > * returns: > * 0 <= n < FDT_MAX_NCELLS, on success > - * 2, if the node has no #address-cells property > + * 2, if the node has no #size-cells property > * -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid > * #size-cells property > * -FDT_ERR_BADMAGIC, > diff --git a/tests/.gitignore b/tests/.gitignore > index d423570..7a99f5a 100644 > --- a/tests/.gitignore > +++ b/tests/.gitignore > @@ -4,6 +4,7 @@ > tmp.* > /add_subnode_with_nops > /addr_size_cells > +/addr_size_cells2 > /appendprop[12] > /asm_tree_dump > /boot-cpuid > diff --git a/tests/Makefile.tests b/tests/Makefile.tests > index 2c2c4fd..e7cf6bc 100644 > --- a/tests/Makefile.tests > +++ b/tests/Makefile.tests > @@ -9,6 +9,7 @@ LIB_TESTS_L = get_mem_rsv \ > sized_cells \ > notfound \ > addr_size_cells \ > + addr_size_cells2 \ > stringlist \ > setprop_inplace nop_property nop_node \ > sw_tree1 sw_states \ > diff --git a/tests/addr_size_cells.c b/tests/addr_size_cells.c > index 6090d93..fcd9ff0 100644 > --- a/tests/addr_size_cells.c > +++ b/tests/addr_size_cells.c > @@ -60,5 +60,8 @@ int main(int argc, char *argv[]) > check_node(fdt, "/", 2, 2); > check_node(fdt, "/identity-bus@0", 2, 2); > check_node(fdt, "/simple-bus@1000000", 2, 1); > + check_node(fdt, "/c0", -FDT_ERR_BADNCELLS, -FDT_ERR_BADNCELLS); > + check_node(fdt, "/c1", -FDT_ERR_BADNCELLS, -FDT_ERR_BADNCELLS); > + check_node(fdt, "/c2", -FDT_ERR_BADNCELLS, -FDT_ERR_BADNCELLS); > PASS(); > } > diff --git a/tests/addr_size_cells2.c b/tests/addr_size_cells2.c > new file mode 100644 > index 0000000..38b2c04 > --- /dev/null > +++ b/tests/addr_size_cells2.c > @@ -0,0 +1,62 @@ > +/* > + * libfdt - Flat Device Tree manipulation > + * Testcase for #address-cells and #size-cells handling > + * Copyright (C) 2014 David Gibson, <david@xxxxxxxxxxxxxxxxxxxxx> > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public License > + * as published by the Free Software Foundation; either version 2.1 of > + * the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this library; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > + */ > +#include <stdlib.h> > +#include <stdio.h> > +#include <string.h> > +#include <stdint.h> > + > +#include <libfdt.h> > + > +#include "tests.h" > +#include "testdata.h" > + > +static void check_node(const void *fdt, const char *path, int ac, int sc) > +{ > + int offset; > + int xac, xsc; > + > + offset = fdt_path_offset(fdt, path); > + if (offset < 0) > + FAIL("Couldn't find path %s", path); > + > + xac = fdt_address_cells(fdt, offset); > + xsc = fdt_size_cells(fdt, offset); > + > + if (xac != ac) > + FAIL("Address cells for %s is %d instead of %d\n", > + path, xac, ac); > + if (xsc != sc) > + FAIL("Size cells for %s is %d instead of %d\n", > + path, xsc, sc); > +} > + > +int main(int argc, char *argv[]) > +{ > + void *fdt; > + > + if (argc != 2) > + CONFIG("Usage: %s <dtb file>\n", argv[0]); > + > + test_init(argc, argv); > + fdt = load_blob(argv[1]); > + > + check_node(fdt, "/", 2, 2); > + PASS(); > +} > diff --git a/tests/addresses.dts b/tests/addresses.dts > index a2faaf5..fab6b19 100644 > --- a/tests/addresses.dts > +++ b/tests/addresses.dts > @@ -12,4 +12,19 @@ > #address-cells = <2>; > #size-cells = <1>; > }; > + > + c0@0 { > + #address-cells = <1 1>; > + #size-cells = <1 1>; > + }; > + > + c1@0 { > + #address-cells = <0x80000000>; > + #size-cells = <0x80000000>; > + }; > + > + c2@0 { > + #address-cells = <5>; > + #size-cells = <5>; > + }; > }; > diff --git a/tests/run_tests.sh b/tests/run_tests.sh > index cf87066..7348c9c 100755 > --- a/tests/run_tests.sh > +++ b/tests/run_tests.sh > @@ -336,6 +336,8 @@ libfdt_tests () { > > run_dtc_test -I dts -O dtb -o addresses.test.dtb addresses.dts > run_test addr_size_cells addresses.test.dtb > + run_dtc_test -I dts -O dtb -o addresses2.test.dtb empty.dts > + run_test addr_size_cells2 addresses2.test.dtb > > run_dtc_test -I dts -O dtb -o stringlist.test.dtb stringlist.dts > run_test stringlist stringlist.test.dtb -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
Attachment:
signature.asc
Description: PGP signature