1 /* $NetBSD: appendprop_addrrange.c,v 1.1.1.1 2019/12/22 12:34:07 skrll Exp $ */ 2 3 // SPDX-License-Identifier: LGPL-2.1-or-later 4 /* 5 * libfdt - Flat Device Tree manipulation 6 * Testcase for fdt_appendprop_addrrange() 7 * Copyright (C) 2018 AKASHI Takahiro, Linaro Limited 8 */ 9 #include <stdlib.h> 10 #include <stdio.h> 11 #include <string.h> 12 #include <stdint.h> 13 14 #include <libfdt.h> 15 16 #include "tests.h" 17 #include "testdata.h" 18 19 int main(int argc, char *argv[]) 20 { 21 void *fdt, *buf; 22 int offset, xac, xsc, num, i, err; 23 uint64_t addr, size; 24 25 if (argc != 5) 26 CONFIG("Usage: %s <dtb file> <address-cells> <size-cells> <num>\n", 27 argv[0]); 28 29 test_init(argc, argv); 30 fdt = load_blob(argv[1]); 31 xac = strtol(argv[2], NULL, 10); 32 xsc = strtol(argv[3], NULL, 10); 33 num = strtol(argv[4], NULL, 10); 34 35 buf = xmalloc(0x1000); 36 if (!buf) 37 FAIL("Couldn't allocate temporary buffer"); 38 err = fdt_open_into(fdt, buf, 0x1000); 39 if (err) 40 FAIL("fdt_open_into(): %s", fdt_strerror(err)); 41 42 fdt = buf; 43 44 /* Set up */ 45 err = fdt_setprop_cell(fdt, 0, "#address-cells", xac); 46 if (err) 47 FAIL("fdt_setprop_cell(\"#address-cells\"): %s", 48 fdt_strerror(err)); 49 err = fdt_setprop_cell(fdt, 0, "#size-cells", xsc); 50 if (err) 51 FAIL("fdt_setprop_cell(\"#size-cells\"): %s", 52 fdt_strerror(err)); 53 54 offset = fdt_path_offset(fdt, "/node@1"); 55 if (offset < 0) 56 FAIL("Couldn't find path %s", "/node@1"); 57 58 addr = TEST_MEMREGION_ADDR; 59 if (xac > 1) 60 addr += TEST_MEMREGION_ADDR_HI; 61 size = TEST_MEMREGION_SIZE; 62 if (xsc > 1) 63 size += TEST_MEMREGION_SIZE_HI; 64 65 /* 66 * Do test 67 */ 68 /* 1. repeat append's */ 69 for (i = 0; i < num; i++) { 70 err = fdt_appendprop_addrrange(fdt, 0, offset, 71 "prop-memregion", addr, size); 72 if (err) 73 FAIL("Failed to append[%d] \"prop-memregion\": %s", 74 i, fdt_strerror(err)); 75 76 check_getprop_addrrange(fdt, 0, offset, "prop-memregion", 77 i + 1); 78 79 addr += size; 80 size += TEST_MEMREGION_SIZE_INC; 81 } 82 83 /* 2. default property name */ 84 addr = TEST_MEMREGION_ADDR; 85 if (xac > 1) 86 addr += TEST_MEMREGION_ADDR_HI; 87 size = TEST_MEMREGION_SIZE; 88 if (xsc > 1) 89 size += TEST_MEMREGION_SIZE_HI; 90 91 err = fdt_appendprop_addrrange(fdt, 0, offset, "reg", addr, size); 92 if (err) 93 FAIL("Failed to set \"reg\": %s", fdt_strerror(err)); 94 check_getprop_addrrange(fdt, 0, offset, "reg", 1); 95 96 PASS(); 97 } 98