You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
1.6 KiB
84 lines
1.6 KiB
// SPDX-License-Identifier: LGPL-2.1-or-later |
|
/* |
|
* libfdt - Flat Device Tree manipulation |
|
* Tests that fdt_next_subnode() works as expected |
|
* |
|
* Copyright (C) 2013 Google, Inc |
|
* |
|
* Copyright (C) 2007 David Gibson, IBM Corporation. |
|
*/ |
|
|
|
#include <stdlib.h> |
|
#include <stdio.h> |
|
#include <string.h> |
|
#include <stdint.h> |
|
|
|
#include <libfdt.h> |
|
|
|
#include "tests.h" |
|
#include "testdata.h" |
|
|
|
static void test_node(void *fdt, int parent_offset) |
|
{ |
|
uint32_t properties; |
|
const fdt32_t *prop; |
|
int offset, property; |
|
int count; |
|
int len; |
|
|
|
/* |
|
* This property indicates the number of properties in our |
|
* test node to expect |
|
*/ |
|
prop = fdt_getprop(fdt, parent_offset, "test-properties", &len); |
|
if (!prop || len != sizeof(fdt32_t)) { |
|
FAIL("Missing/invalid test-properties property at '%s'", |
|
fdt_get_name(fdt, parent_offset, NULL)); |
|
} |
|
properties = fdt32_to_cpu(*prop); |
|
|
|
count = 0; |
|
offset = fdt_first_subnode(fdt, parent_offset); |
|
if (offset < 0) |
|
FAIL("Missing test node\n"); |
|
|
|
fdt_for_each_property_offset(property, fdt, offset) |
|
count++; |
|
|
|
if (count != properties) { |
|
FAIL("Node '%s': Expected %d properties, got %d\n", |
|
fdt_get_name(fdt, parent_offset, NULL), properties, |
|
count); |
|
} |
|
} |
|
|
|
static void check_fdt_next_subnode(void *fdt) |
|
{ |
|
int offset; |
|
int count = 0; |
|
|
|
fdt_for_each_subnode(offset, fdt, 0) { |
|
test_node(fdt, offset); |
|
count++; |
|
} |
|
|
|
if (count != 2) |
|
FAIL("Expected %d tests, got %d\n", 2, count); |
|
} |
|
|
|
int main(int argc, char *argv[]) |
|
{ |
|
void *fdt; |
|
|
|
test_init(argc, argv); |
|
if (argc != 2) |
|
CONFIG("Usage: %s <dtb file>", argv[0]); |
|
|
|
fdt = load_blob(argv[1]); |
|
if (!fdt) |
|
FAIL("No device tree available"); |
|
|
|
check_fdt_next_subnode(fdt); |
|
|
|
PASS(); |
|
}
|
|
|