Re: [PATCH v2 2/2] tests: add fdt_appendprop_addrrange() test

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



David,

On Wed, Feb 06, 2019 at 03:40:10PM +1100, David Gibson wrote:
> On Thu, Jan 24, 2019 at 07:20:49PM +0900, AKASHI Takahiro wrote:
> > In this patch, "appendprop_addrrange" test program is added to test
> > fdt_appendprop_addrrange() interface.
> > 
> > Signed-off-by: AKASHI Takahiro <takahiro.akashi@xxxxxxxxxx>
> 
> There's no real point splitting the test into a separate patch, just
> fold it into 1/2.

I believed that separating a test script from the code would be
a nice practice, but if you don't care, I don't mind merging them.

Thanks,
-Takahiro Akashi

> > ---
> >  tests/.gitignore             |   1 +
> >  tests/Makefile.tests         |   1 +
> >  tests/appendprop_addrrange.c | 108 +++++++++++++++++++++++++++++++++++
> >  tests/run_tests.sh           |   5 ++
> >  tests/testdata.h             |   6 ++
> >  tests/tests.h                |   3 +
> >  tests/testutils.c            |  58 +++++++++++++++++++
> >  7 files changed, 182 insertions(+)
> >  create mode 100644 tests/appendprop_addrrange.c
> > 
> > diff --git a/tests/.gitignore b/tests/.gitignore
> > index 12af43868e09..0bc78aa5842b 100644
> > --- a/tests/.gitignore
> > +++ b/tests/.gitignore
> > @@ -8,6 +8,7 @@ tmp.*
> >  /addr_size_cells
> >  /addr_size_cells2
> >  /appendprop[12]
> > +/appendprop_addrrange
> >  /asm_tree_dump
> >  /boot-cpuid
> >  /char_literal
> > diff --git a/tests/Makefile.tests b/tests/Makefile.tests
> > index b02d8bf3d15b..b77f121f0ba6 100644
> > --- a/tests/Makefile.tests
> > +++ b/tests/Makefile.tests
> > @@ -10,6 +10,7 @@ LIB_TESTS_L = get_mem_rsv \
> >  	notfound \
> >  	addr_size_cells \
> >  	addr_size_cells2 \
> > +	appendprop_addrrange \
> >  	stringlist \
> >  	setprop_inplace nop_property nop_node \
> >  	sw_tree1 sw_states \
> > diff --git a/tests/appendprop_addrrange.c b/tests/appendprop_addrrange.c
> > new file mode 100644
> > index 000000000000..b54f9049ff6a
> > --- /dev/null
> > +++ b/tests/appendprop_addrrange.c
> > @@ -0,0 +1,108 @@
> > +/*
> > + * libfdt - Flat Device Tree manipulation
> > + *	Testcase for fdt_appendprop_addrrange()
> > + * Copyright (C) 2018 AKASHI Takahiro, Linaro Limited
> > + *
> > + * 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"
> > +
> > +int main(int argc, char *argv[])
> > +{
> > +	void *fdt, *buf;
> > +	int offset, xac, xsc, num, i, err;
> > +	uint64_t addr, size;
> > +
> > +	if (argc != 5)
> > +		CONFIG("Usage: %s <dtb file> <address-cells> <size-cells> <num>\n",
> > +		       argv[0]);
> > +
> > +	test_init(argc, argv);
> > +	fdt = load_blob(argv[1]);
> > +	xac = strtol(argv[2], NULL, 10);
> > +	xsc = strtol(argv[3], NULL, 10);
> > +	num = strtol(argv[4], NULL, 10);
> > +
> > +	buf = xmalloc(0x1000);
> > +	if (!buf)
> > +		FAIL("Couldn't allocate temporary buffer");
> > +	err = fdt_open_into(fdt, buf, 0x1000);
> > +	if (err)
> > +		FAIL("fdt_open_into(): %s", fdt_strerror(err));
> > +
> > +	fdt = buf;
> > +
> > +	/* Set up */
> > +	err = fdt_setprop_cell(fdt, 0, "#address-cells", xac);
> > +	if (err)
> > +		FAIL("fdt_setprop_cell(\"#address-cells\"): %s",
> > +		     fdt_strerror(err));
> > +	err = fdt_setprop_cell(fdt, 0, "#size-cells", xsc);
> > +	if (err)
> > +		FAIL("fdt_setprop_cell(\"#size-cells\"): %s",
> > +		     fdt_strerror(err));
> > +
> > +	offset = fdt_path_offset(fdt, "/node@1");
> > +	if (offset < 0)
> > +		FAIL("Couldn't find path %s", "/node@1");
> > +
> > +	addr = TEST_MEMREGION_ADDR;
> > +	if (xac > 1)
> > +		addr += TEST_MEMREGION_ADDR_HI;
> > +	size = TEST_MEMREGION_SIZE;
> > +	if (xsc > 1)
> > +		size += TEST_MEMREGION_SIZE_HI;
> > +
> > +	/*
> > +	 * Do test
> > +	 */
> > +	/* 1. repeat append's */
> > +	for (i = 0; i < num; i++) {
> > +		err = fdt_appendprop_addrrange(fdt, 0, offset,
> > +					       "prop-memregion", addr, size);
> > +		if (err)
> > +			FAIL("Failed to append[%d] \"prop-memregion\": %s",
> > +			     i, fdt_strerror(err));
> > +
> > +		check_getprop_addrrange(fdt, 0, offset, "prop-memregion",
> > +					i + 1);
> > +
> > +		addr += size;
> > +		size += TEST_MEMREGION_SIZE_INC;
> > +	}
> > +
> > +	/* 2. default property name */
> > +	addr = TEST_MEMREGION_ADDR;
> > +	if (xac > 1)
> > +		addr += TEST_MEMREGION_ADDR_HI;
> > +	size = TEST_MEMREGION_SIZE;
> > +	if (xsc > 1)
> > +		size += TEST_MEMREGION_SIZE_HI;
> > +
> > +	err = fdt_appendprop_addrrange(fdt, 0, offset, NULL, addr, size);
> > +	if (err)
> > +		FAIL("Failed to set \"reg\"(default): %s", fdt_strerror(err));
> > +	check_getprop_addrrange(fdt, 0, offset, "reg", 1);
> > +
> > +	PASS();
> > +}
> > diff --git a/tests/run_tests.sh b/tests/run_tests.sh
> > index ca3fc867db31..aa677c6015e5 100755
> > --- a/tests/run_tests.sh
> > +++ b/tests/run_tests.sh
> > @@ -424,6 +424,11 @@ libfdt_tests () {
> >      run_dtc_test -I dts -O dtb -o property_iterate.dtb property_iterate.dts
> >      run_test property_iterate property_iterate.dtb
> >  
> > +    run_dtc_test -I dts -O dtb -o unit-addr-without-reg.dtb unit-addr-without-reg.dts
> > +    run_test appendprop_addrrange unit-addr-without-reg.dtb 1 1 1
> > +    run_test appendprop_addrrange unit-addr-without-reg.dtb 2 2 2
> > +    run_test appendprop_addrrange unit-addr-without-reg.dtb 2 1 3
> > +
> >      # Tests for behaviour on various sorts of corrupted trees
> >      run_test truncated_property
> >      run_test truncated_string
> > diff --git a/tests/testdata.h b/tests/testdata.h
> > index 68dcbaceada4..0d08efb20d52 100644
> > --- a/tests/testdata.h
> > +++ b/tests/testdata.h
> > @@ -40,6 +40,12 @@
> >  #define TEST_CHAR4	'\''
> >  #define TEST_CHAR5	'\xff'
> >  
> > +#define TEST_MEMREGION_ADDR	0x12345678
> > +#define TEST_MEMREGION_ADDR_HI	0x8765432100000000
> > +#define TEST_MEMREGION_SIZE	0x9abcdef0
> > +#define TEST_MEMREGION_SIZE_HI	0x0fedcba900000000
> > +#define TEST_MEMREGION_SIZE_INC	0x1000
> > +
> >  #ifndef __ASSEMBLY__
> >  extern struct fdt_header test_tree1;
> >  extern struct fdt_header truncated_property;
> > diff --git a/tests/tests.h b/tests/tests.h
> > index dc8120eb6d9d..75735d63ee4c 100644
> > --- a/tests/tests.h
> > +++ b/tests/tests.h
> > @@ -128,6 +128,9 @@ const void *check_get_prop_offset(void *fdt, int poffset, const char *in_name,
> >  		check_get_prop_offset(fdt, poffset, name, sizeof(x), &x); \
> >  	})
> >  
> > +const void *check_getprop_addrrange(void *fdt, int parent, int nodeoffset,
> > +				    const char *name, int num);
> > +
> >  int nodename_eq(const char *s1, const char *s2);
> >  void vg_prepare_blob(void *fdt, size_t bufsize);
> >  void *load_blob(const char *filename);
> > diff --git a/tests/testutils.c b/tests/testutils.c
> > index bbfda90b9cdd..a250d5a5d7f9 100644
> > --- a/tests/testutils.c
> > +++ b/tests/testutils.c
> > @@ -45,6 +45,7 @@ static inline void VALGRIND_MAKE_MEM_DEFINED(void *p, size_t len)
> >  #include <libfdt.h>
> >  
> >  #include "tests.h"
> > +#include "testdata.h"
> >  
> >  /* For FDT_SW_MAGIC */
> >  #include "libfdt_internal.h"
> > @@ -184,6 +185,63 @@ const void *check_get_prop_offset(void *fdt, int poffset, const char *exp_name,
> >  	return propval;
> >  }
> >  
> > +const void *check_getprop_addrrange(void *fdt, int parent, int nodeoffset,
> > +				    const char *name, int num)
> > +{
> > +	const void *propval;
> > +	int xac, xsc, buf_size, cells, i;
> > +	char *buf, *p;
> > +	uint64_t addr, size;
> > +	fdt32_t val;
> > +
> > +	xac = fdt_address_cells(fdt, parent);
> > +	xsc = fdt_size_cells(fdt, parent);
> > +
> > +	if (xac <= 0)
> > +		FAIL("Couldn't identify #address-cells: %s",
> > +		     fdt_strerror(xac));
> > +	if (xsc <= 0)
> > +		FAIL("Couldn't identify #size-cells: %s",
> > +		     fdt_strerror(xsc));
> > +
> > +	buf_size = (xac + xsc) * sizeof(fdt32_t) * num;
> > +	buf = malloc(buf_size);
> > +	if (!buf)
> > +		FAIL("Couldn't allocate temporary buffer");
> > +
> > +	/* expected value */
> > +	addr = TEST_MEMREGION_ADDR;
> > +	if (xac > 1)
> > +		addr += TEST_MEMREGION_ADDR_HI;
> > +	size = TEST_MEMREGION_SIZE;
> > +	if (xsc > 1)
> > +		size += TEST_MEMREGION_SIZE_HI;
> > +	for (p = buf, i = 0; i < num; i++) {
> > +		cells = xac;
> > +		while (cells) {
> > +			val = cpu_to_fdt32(addr >> (32 * (--cells)));
> > +			memcpy(p, &val, sizeof(val));
> > +			p += sizeof(val);
> > +		}
> > +		cells = xsc;
> > +		while (cells) {
> > +			val = cpu_to_fdt32(size >> (32 * (--cells)));
> > +			memcpy(p, &val, sizeof(val));
> > +			p += sizeof(val);
> > +		}
> > +
> > +		addr += size;
> > +		size += TEST_MEMREGION_SIZE_INC;
> > +	}
> > +
> > +	/* check */
> > +	propval = check_getprop(fdt, nodeoffset, name, buf_size,
> > +				(const void *)buf);
> > +
> > +	free(buf);
> > +
> > +	return propval;
> > +}
> >  
> >  int nodename_eq(const char *s1, const char *s2)
> >  {
> 
> -- 
> 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





[Index of Archives]     [Device Tree]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux