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

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



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.

> ---
>  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

Attachment: signature.asc
Description: PGP signature


[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