]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
coresight: Add a KUnit test for coresight_find_default_sink()
authorJames Clark <james.clark@linaro.org>
Wed, 12 Mar 2025 10:31:57 +0000 (10:31 +0000)
committerSuzuki K Poulose <suzuki.poulose@arm.com>
Wed, 30 Apr 2025 15:59:27 +0000 (16:59 +0100)
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: Leo Yan <leo.yan@arm.com>
Signed-off-by: James Clark <james.clark@linaro.org>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20250312-james-cs-kunit-test-v4-1-ae3dd718a26a@linaro.org
drivers/hwtracing/coresight/Kconfig
drivers/hwtracing/coresight/Makefile
drivers/hwtracing/coresight/coresight-core.c
drivers/hwtracing/coresight/coresight-kunit-tests.c [new file with mode: 0644]

index ecd7086a5b83e86b6bc8ea039d6d26a628334ed3..f064e3d172b3d630515bb3a11450e883a6b5b4bf 100644 (file)
@@ -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
index 8e62c3150aebd1e82b445fafc97a0a9b44397b0e..4e6ea5b05b01769f8c0ea1d81adc1b24170c9711 100644 (file)
@@ -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
index a68b4299020afbc2f6213fa21880a6435a1c199d..5632bcb8feb609ecd36f8eeed4e3712f7bd74ba0 100644 (file)
@@ -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)
 {
diff --git a/drivers/hwtracing/coresight/coresight-kunit-tests.c b/drivers/hwtracing/coresight/coresight-kunit-tests.c
new file mode 100644 (file)
index 0000000..c8f3617
--- /dev/null
@@ -0,0 +1,74 @@
+// 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");