u-boot/test/dm/interconnect.c
Neil Armstrong 9ab7163710 interconnect: add DM test suite
Add a test suite exercising the whole lifetime and callbacks
of interconnect with a fake 5 providers with a split node graph.

The test suite checks the calculus are right and goes to the correct
nodes, and the lifetime of the node is correct.

Link: https://patch.msgid.link/20251120-topic-interconnect-next-v5-2-e8a82720da5d@linaro.org
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
2025-11-20 09:17:58 +01:00

196 lines
8.7 KiB
C

// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2025 Linaro Limited
*/
#include <dm.h>
#include <malloc.h>
#include <dm/test.h>
#include <asm/interconnect.h>
#include <dm/device-internal.h>
#include <dm/uclass-internal.h>
#include <test/test.h>
#include <test/ut.h>
static int dm_test_interconnect(struct unit_test_state *uts)
{
struct udevice *dev_interconnect_0,
*dev_interconnect_1,
*dev_interconnect_2,
*dev_interconnect_3,
*dev_interconnect_4;
struct udevice *dev_test_0, *dev_test_1, *dev;
u64 avg = 0, peak = 0;
ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "interconnect-test-0",
&dev_test_0));
ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "interconnect-test-1",
&dev_test_1));
ut_assertok(sandbox_interconnect_test_get_index(dev_test_0, 0));
ut_assertok(sandbox_interconnect_test_get(dev_test_1, "icc-path"));
ut_assertok(uclass_find_device_by_name(UCLASS_INTERCONNECT,
"interconnect-0",
&dev_interconnect_0));
ut_assertok(uclass_find_device_by_name(UCLASS_INTERCONNECT,
"interconnect-1",
&dev_interconnect_1));
ut_assertok(uclass_find_device_by_name(UCLASS_INTERCONNECT,
"interconnect-2",
&dev_interconnect_2));
ut_assertok(uclass_find_device_by_name(UCLASS_INTERCONNECT,
"interconnect-3",
&dev_interconnect_3));
ut_assertok(uclass_find_device_by_name(UCLASS_INTERCONNECT,
"interconnect-4",
&dev_interconnect_4));
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_0, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_1, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_2, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_3, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_4, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_test_set_bw(dev_test_0, 10000, 100000));
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_0, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_1, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_2, &avg, &peak));
ut_asserteq(avg, 10000); ut_asserteq(peak, 100000);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_3, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_4, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_test_set_bw(dev_test_1, 20000, 200000));
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_0, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_1, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_2, &avg, &peak));
ut_asserteq(avg, 30000); ut_asserteq(peak, 200000);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_3, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_4, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_test_disable(dev_test_0));
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_0, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_1, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_2, &avg, &peak));
ut_asserteq(avg, 20000); ut_asserteq(peak, 200000);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_3, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_4, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_test_disable(dev_test_1));
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_0, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_1, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_2, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_3, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_4, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_test_enable(dev_test_0));
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_0, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_1, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_2, &avg, &peak));
ut_asserteq(avg, 10000); ut_asserteq(peak, 100000);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_3, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_4, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_test_enable(dev_test_1));
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_0, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_1, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_2, &avg, &peak));
ut_asserteq(avg, 30000); ut_asserteq(peak, 200000);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_3, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_4, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_asserteq(-EBUSY, device_remove(dev_interconnect_0, DM_REMOVE_NORMAL));
ut_asserteq(-EBUSY, device_remove(dev_interconnect_1, DM_REMOVE_NORMAL));
ut_asserteq(-EBUSY, device_remove(dev_interconnect_2, DM_REMOVE_NORMAL));
ut_asserteq(-EBUSY, device_remove(dev_interconnect_3, DM_REMOVE_NORMAL));
ut_asserteq(-EBUSY, device_remove(dev_interconnect_4, DM_REMOVE_NORMAL));
ut_assertok(sandbox_interconnect_test_put(dev_test_0));
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_0, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_1, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_2, &avg, &peak));
ut_asserteq(avg, 20000); ut_asserteq(peak, 200000);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_3, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_4, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_test_put(dev_test_1));
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_0, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_1, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_2, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_3, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_assertok(sandbox_interconnect_get_bw(dev_interconnect_4, &avg, &peak));
ut_asserteq(avg, 0); ut_asserteq(peak, 0);
ut_asserteq(-ENOENT, sandbox_interconnect_test_get_index(dev_test_0, 1));
ut_asserteq(-ENOENT, sandbox_interconnect_test_get_index(dev_test_1, 1));
ut_asserteq(-ENODATA, sandbox_interconnect_test_get(dev_test_1, "pwet"));
ut_assertok(device_remove(dev_interconnect_0, DM_REMOVE_NORMAL));
ut_assertok(device_remove(dev_interconnect_1, DM_REMOVE_NORMAL));
ut_assertok(device_remove(dev_interconnect_2, DM_REMOVE_NORMAL));
ut_assertok(device_remove(dev_interconnect_3, DM_REMOVE_NORMAL));
ut_assertok(device_remove(dev_interconnect_4, DM_REMOVE_NORMAL));
ut_assertok(device_unbind(dev_interconnect_0));
ut_assertok(device_unbind(dev_interconnect_1));
ut_assertok(device_unbind(dev_interconnect_2));
ut_assertok(device_unbind(dev_interconnect_3));
ut_assertok(device_unbind(dev_interconnect_4));
uclass_find_first_device(UCLASS_INTERCONNECT, &dev);
ut_assert(!dev);
uclass_find_first_device(UCLASS_ICC_NODE, &dev);
ut_assert(!dev);
return 0;
}
DM_TEST(dm_test_interconnect, UTF_SCAN_FDT);