Loading...
// 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);