root/drivers/hwtracing/coresight/coresight-kunit-tests.c
// 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");