Commit b104a941 authored by James Clark's avatar James Clark Committed by Suzuki K Poulose
Browse files

coresight: Add a KUnit test for coresight_find_default_sink()



Add a test to confirm that default sink selection skips over an ETF
and returns an ETR even if it's further away.

This also makes it easier to add new unit tests in the future.

Reviewed-by: default avatarLeo Yan <leo.yan@arm.com>
Signed-off-by: default avatarJames Clark <james.clark@linaro.org>
Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20250312-james-cs-kunit-test-v4-1-ae3dd718a26a@linaro.org
parent e6e6b692
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -259,4 +259,13 @@ config CORESIGHT_DUMMY

	  To compile this driver as a module, choose M here: the module will be
	  called coresight-dummy.

config CORESIGHT_KUNIT_TESTS
	  tristate "Enable Coresight unit tests"
	  depends on KUNIT
	  default KUNIT_ALL_TESTS
	  help
	    Enable Coresight unit tests. Only useful for development and not
	    intended for production.

endif
+1 −0
Original line number Diff line number Diff line
@@ -53,3 +53,4 @@ obj-$(CONFIG_ULTRASOC_SMB) += ultrasoc-smb.o
obj-$(CONFIG_CORESIGHT_DUMMY) += coresight-dummy.o
obj-$(CONFIG_CORESIGHT_CTCU) += coresight-ctcu.o
coresight-ctcu-y := coresight-ctcu-core.o
obj-$(CONFIG_CORESIGHT_KUNIT_TESTS) += coresight-kunit-tests.o
+1 −0
Original line number Diff line number Diff line
@@ -989,6 +989,7 @@ coresight_find_default_sink(struct coresight_device *csdev)
	}
	return csdev->def_sink;
}
EXPORT_SYMBOL_GPL(coresight_find_default_sink);

static int coresight_remove_sink_ref(struct device *dev, void *data)
{
+74 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0

#include <kunit/test.h>
#include <kunit/device.h>
#include <linux/coresight.h>

#include "coresight-priv.h"

static struct coresight_device *coresight_test_device(struct device *dev)
{
	struct coresight_device *csdev = devm_kcalloc(dev, 1,
						     sizeof(struct coresight_device),
						     GFP_KERNEL);
	csdev->pdata = devm_kcalloc(dev, 1,
				   sizeof(struct coresight_platform_data),
				   GFP_KERNEL);
	return csdev;
}

static void test_default_sink(struct kunit *test)
{
	/*
	 * Source -> ETF -> ETR -> CATU
	 *                   ^
	 *                   | default
	 */
	struct device *dev = kunit_device_register(test, "coresight_kunit");
	struct coresight_device *src = coresight_test_device(dev),
				*etf = coresight_test_device(dev),
				*etr = coresight_test_device(dev),
				*catu = coresight_test_device(dev);
	struct coresight_connection conn = {};

	src->type = CORESIGHT_DEV_TYPE_SOURCE;
	/*
	 * Don't use CORESIGHT_DEV_SUBTYPE_SOURCE_PROC, that would always return
	 * a TRBE sink if one is registered.
	 */
	src->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_BUS;
	etf->type = CORESIGHT_DEV_TYPE_LINKSINK;
	etf->subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_BUFFER;
	etr->type = CORESIGHT_DEV_TYPE_SINK;
	etr->subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_SYSMEM;
	catu->type = CORESIGHT_DEV_TYPE_HELPER;

	conn.src_dev = src;
	conn.dest_dev = etf;
	coresight_add_out_conn(dev, src->pdata, &conn);

	conn.src_dev = etf;
	conn.dest_dev = etr;
	coresight_add_out_conn(dev, etf->pdata, &conn);

	conn.src_dev = etr;
	conn.dest_dev = catu;
	coresight_add_out_conn(dev, etr->pdata, &conn);

	KUNIT_ASSERT_PTR_EQ(test, coresight_find_default_sink(src), etr);
}

static struct kunit_case coresight_testcases[] = {
	KUNIT_CASE(test_default_sink),
	{}
};

static struct kunit_suite coresight_test_suite = {
	.name = "coresight_test_suite",
	.test_cases = coresight_testcases,
};

kunit_test_suites(&coresight_test_suite);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("James Clark <james.clark@linaro.org>");
MODULE_DESCRIPTION("Arm CoreSight KUnit tests");