1*06ebbe71SKuan-Wei Chiu // SPDX-License-Identifier: GPL-2.0 2*06ebbe71SKuan-Wei Chiu /* 3*06ebbe71SKuan-Wei Chiu * KUnit tests for the Interconnect framework. 4*06ebbe71SKuan-Wei Chiu * 5*06ebbe71SKuan-Wei Chiu * Copyright (c) 2025 Kuan-Wei Chiu <visitorckw@gmail.com> 6*06ebbe71SKuan-Wei Chiu * 7*06ebbe71SKuan-Wei Chiu * This suite verifies the behavior of the interconnect core, including 8*06ebbe71SKuan-Wei Chiu * topology construction, bandwidth aggregation, and path lifecycle. 9*06ebbe71SKuan-Wei Chiu */ 10*06ebbe71SKuan-Wei Chiu 11*06ebbe71SKuan-Wei Chiu #include <kunit/platform_device.h> 12*06ebbe71SKuan-Wei Chiu #include <kunit/test.h> 13*06ebbe71SKuan-Wei Chiu #include <linux/interconnect-provider.h> 14*06ebbe71SKuan-Wei Chiu #include <linux/interconnect.h> 15*06ebbe71SKuan-Wei Chiu #include <linux/list.h> 16*06ebbe71SKuan-Wei Chiu #include <linux/module.h> 17*06ebbe71SKuan-Wei Chiu #include <linux/overflow.h> 18*06ebbe71SKuan-Wei Chiu #include <linux/platform_device.h> 19*06ebbe71SKuan-Wei Chiu #include <linux/slab.h> 20*06ebbe71SKuan-Wei Chiu 21*06ebbe71SKuan-Wei Chiu #include "internal.h" 22*06ebbe71SKuan-Wei Chiu 23*06ebbe71SKuan-Wei Chiu enum { 24*06ebbe71SKuan-Wei Chiu NODE_CPU, 25*06ebbe71SKuan-Wei Chiu NODE_GPU, 26*06ebbe71SKuan-Wei Chiu NODE_BUS, 27*06ebbe71SKuan-Wei Chiu NODE_DDR, 28*06ebbe71SKuan-Wei Chiu NODE_MAX 29*06ebbe71SKuan-Wei Chiu }; 30*06ebbe71SKuan-Wei Chiu 31*06ebbe71SKuan-Wei Chiu struct test_node_data { 32*06ebbe71SKuan-Wei Chiu int id; 33*06ebbe71SKuan-Wei Chiu const char *name; 34*06ebbe71SKuan-Wei Chiu int num_links; 35*06ebbe71SKuan-Wei Chiu int links[2]; 36*06ebbe71SKuan-Wei Chiu }; 37*06ebbe71SKuan-Wei Chiu 38*06ebbe71SKuan-Wei Chiu /* 39*06ebbe71SKuan-Wei Chiu * Static Topology: 40*06ebbe71SKuan-Wei Chiu * CPU -\ 41*06ebbe71SKuan-Wei Chiu * -> BUS -> DDR 42*06ebbe71SKuan-Wei Chiu * GPU -/ 43*06ebbe71SKuan-Wei Chiu */ 44*06ebbe71SKuan-Wei Chiu static const struct test_node_data test_topology[] = { 45*06ebbe71SKuan-Wei Chiu { NODE_CPU, "cpu", 1, { NODE_BUS } }, 46*06ebbe71SKuan-Wei Chiu { NODE_GPU, "gpu", 1, { NODE_BUS } }, 47*06ebbe71SKuan-Wei Chiu { NODE_BUS, "bus", 1, { NODE_DDR } }, 48*06ebbe71SKuan-Wei Chiu { NODE_DDR, "ddr", 0, { } }, 49*06ebbe71SKuan-Wei Chiu }; 50*06ebbe71SKuan-Wei Chiu 51*06ebbe71SKuan-Wei Chiu struct icc_test_priv { 52*06ebbe71SKuan-Wei Chiu struct icc_provider provider; 53*06ebbe71SKuan-Wei Chiu struct platform_device *pdev; 54*06ebbe71SKuan-Wei Chiu struct icc_node *nodes[NODE_MAX]; 55*06ebbe71SKuan-Wei Chiu }; 56*06ebbe71SKuan-Wei Chiu 57*06ebbe71SKuan-Wei Chiu static struct icc_node *get_node(struct icc_test_priv *priv, int id) 58*06ebbe71SKuan-Wei Chiu { 59*06ebbe71SKuan-Wei Chiu int idx = id - NODE_CPU; 60*06ebbe71SKuan-Wei Chiu 61*06ebbe71SKuan-Wei Chiu if (idx < 0 || idx >= ARRAY_SIZE(test_topology)) 62*06ebbe71SKuan-Wei Chiu return NULL; 63*06ebbe71SKuan-Wei Chiu return priv->nodes[idx]; 64*06ebbe71SKuan-Wei Chiu } 65*06ebbe71SKuan-Wei Chiu 66*06ebbe71SKuan-Wei Chiu static int icc_test_set(struct icc_node *src, struct icc_node *dst) 67*06ebbe71SKuan-Wei Chiu { 68*06ebbe71SKuan-Wei Chiu return 0; 69*06ebbe71SKuan-Wei Chiu } 70*06ebbe71SKuan-Wei Chiu 71*06ebbe71SKuan-Wei Chiu static int icc_test_aggregate(struct icc_node *node, u32 tag, u32 avg_bw, 72*06ebbe71SKuan-Wei Chiu u32 peak_bw, u32 *agg_avg, u32 *agg_peak) 73*06ebbe71SKuan-Wei Chiu { 74*06ebbe71SKuan-Wei Chiu return icc_std_aggregate(node, tag, avg_bw, peak_bw, agg_avg, agg_peak); 75*06ebbe71SKuan-Wei Chiu } 76*06ebbe71SKuan-Wei Chiu 77*06ebbe71SKuan-Wei Chiu static struct icc_node *icc_test_xlate(const struct of_phandle_args *spec, void *data) 78*06ebbe71SKuan-Wei Chiu { 79*06ebbe71SKuan-Wei Chiu return NULL; 80*06ebbe71SKuan-Wei Chiu } 81*06ebbe71SKuan-Wei Chiu 82*06ebbe71SKuan-Wei Chiu static int icc_test_get_bw(struct icc_node *node, u32 *avg, u32 *peak) 83*06ebbe71SKuan-Wei Chiu { 84*06ebbe71SKuan-Wei Chiu *avg = 0; 85*06ebbe71SKuan-Wei Chiu *peak = 0; 86*06ebbe71SKuan-Wei Chiu 87*06ebbe71SKuan-Wei Chiu return 0; 88*06ebbe71SKuan-Wei Chiu } 89*06ebbe71SKuan-Wei Chiu 90*06ebbe71SKuan-Wei Chiu static int icc_test_init(struct kunit *test) 91*06ebbe71SKuan-Wei Chiu { 92*06ebbe71SKuan-Wei Chiu struct icc_test_priv *priv; 93*06ebbe71SKuan-Wei Chiu struct icc_node *node; 94*06ebbe71SKuan-Wei Chiu int i, j, ret; 95*06ebbe71SKuan-Wei Chiu 96*06ebbe71SKuan-Wei Chiu priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL); 97*06ebbe71SKuan-Wei Chiu KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv); 98*06ebbe71SKuan-Wei Chiu test->priv = priv; 99*06ebbe71SKuan-Wei Chiu 100*06ebbe71SKuan-Wei Chiu priv->pdev = kunit_platform_device_alloc(test, "icc-test-dev", -1); 101*06ebbe71SKuan-Wei Chiu KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->pdev); 102*06ebbe71SKuan-Wei Chiu KUNIT_ASSERT_EQ(test, kunit_platform_device_add(test, priv->pdev), 0); 103*06ebbe71SKuan-Wei Chiu 104*06ebbe71SKuan-Wei Chiu priv->provider.set = icc_test_set; 105*06ebbe71SKuan-Wei Chiu priv->provider.aggregate = icc_test_aggregate; 106*06ebbe71SKuan-Wei Chiu priv->provider.xlate = icc_test_xlate; 107*06ebbe71SKuan-Wei Chiu priv->provider.get_bw = icc_test_get_bw; 108*06ebbe71SKuan-Wei Chiu priv->provider.dev = &priv->pdev->dev; 109*06ebbe71SKuan-Wei Chiu priv->provider.data = priv; 110*06ebbe71SKuan-Wei Chiu INIT_LIST_HEAD(&priv->provider.nodes); 111*06ebbe71SKuan-Wei Chiu 112*06ebbe71SKuan-Wei Chiu ret = icc_provider_register(&priv->provider); 113*06ebbe71SKuan-Wei Chiu KUNIT_ASSERT_EQ(test, ret, 0); 114*06ebbe71SKuan-Wei Chiu 115*06ebbe71SKuan-Wei Chiu for (i = 0; i < ARRAY_SIZE(test_topology); i++) { 116*06ebbe71SKuan-Wei Chiu const struct test_node_data *data = &test_topology[i]; 117*06ebbe71SKuan-Wei Chiu 118*06ebbe71SKuan-Wei Chiu node = icc_node_create(data->id); 119*06ebbe71SKuan-Wei Chiu KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node); 120*06ebbe71SKuan-Wei Chiu 121*06ebbe71SKuan-Wei Chiu node->name = data->name; 122*06ebbe71SKuan-Wei Chiu icc_node_add(node, &priv->provider); 123*06ebbe71SKuan-Wei Chiu priv->nodes[i] = node; 124*06ebbe71SKuan-Wei Chiu } 125*06ebbe71SKuan-Wei Chiu 126*06ebbe71SKuan-Wei Chiu for (i = 0; i < ARRAY_SIZE(test_topology); i++) { 127*06ebbe71SKuan-Wei Chiu const struct test_node_data *data = &test_topology[i]; 128*06ebbe71SKuan-Wei Chiu struct icc_node *src = get_node(priv, data->id); 129*06ebbe71SKuan-Wei Chiu 130*06ebbe71SKuan-Wei Chiu for (j = 0; j < data->num_links; j++) { 131*06ebbe71SKuan-Wei Chiu ret = icc_link_create(src, data->links[j]); 132*06ebbe71SKuan-Wei Chiu KUNIT_ASSERT_EQ_MSG(test, ret, 0, "Failed to link %s->%d", 133*06ebbe71SKuan-Wei Chiu src->name, data->links[j]); 134*06ebbe71SKuan-Wei Chiu } 135*06ebbe71SKuan-Wei Chiu } 136*06ebbe71SKuan-Wei Chiu 137*06ebbe71SKuan-Wei Chiu icc_sync_state(&priv->pdev->dev); 138*06ebbe71SKuan-Wei Chiu 139*06ebbe71SKuan-Wei Chiu return 0; 140*06ebbe71SKuan-Wei Chiu } 141*06ebbe71SKuan-Wei Chiu 142*06ebbe71SKuan-Wei Chiu static void icc_test_exit(struct kunit *test) 143*06ebbe71SKuan-Wei Chiu { 144*06ebbe71SKuan-Wei Chiu struct icc_test_priv *priv = test->priv; 145*06ebbe71SKuan-Wei Chiu 146*06ebbe71SKuan-Wei Chiu icc_nodes_remove(&priv->provider); 147*06ebbe71SKuan-Wei Chiu icc_provider_deregister(&priv->provider); 148*06ebbe71SKuan-Wei Chiu } 149*06ebbe71SKuan-Wei Chiu 150*06ebbe71SKuan-Wei Chiu /* 151*06ebbe71SKuan-Wei Chiu * Helper to construct a mock path. 152*06ebbe71SKuan-Wei Chiu * 153*06ebbe71SKuan-Wei Chiu * Because we are bypassing icc_get(), we must manually link the requests 154*06ebbe71SKuan-Wei Chiu * to the nodes' req_list so that icc_std_aggregate() can discover them. 155*06ebbe71SKuan-Wei Chiu */ 156*06ebbe71SKuan-Wei Chiu static struct icc_path *icc_test_create_path(struct kunit *test, 157*06ebbe71SKuan-Wei Chiu struct icc_node **nodes, int num) 158*06ebbe71SKuan-Wei Chiu { 159*06ebbe71SKuan-Wei Chiu struct icc_path *path; 160*06ebbe71SKuan-Wei Chiu int i; 161*06ebbe71SKuan-Wei Chiu 162*06ebbe71SKuan-Wei Chiu path = kunit_kzalloc(test, struct_size(path, reqs, num), GFP_KERNEL); 163*06ebbe71SKuan-Wei Chiu KUNIT_ASSERT_NOT_ERR_OR_NULL(test, path); 164*06ebbe71SKuan-Wei Chiu 165*06ebbe71SKuan-Wei Chiu path->num_nodes = num; 166*06ebbe71SKuan-Wei Chiu for (i = 0; i < num; i++) { 167*06ebbe71SKuan-Wei Chiu path->reqs[i].node = nodes[i]; 168*06ebbe71SKuan-Wei Chiu hlist_add_head(&path->reqs[i].req_node, &nodes[i]->req_list); 169*06ebbe71SKuan-Wei Chiu } 170*06ebbe71SKuan-Wei Chiu path->name = "mock-path"; 171*06ebbe71SKuan-Wei Chiu 172*06ebbe71SKuan-Wei Chiu return path; 173*06ebbe71SKuan-Wei Chiu } 174*06ebbe71SKuan-Wei Chiu 175*06ebbe71SKuan-Wei Chiu static void icc_test_destroy_path(struct kunit *test, struct icc_path *path) 176*06ebbe71SKuan-Wei Chiu { 177*06ebbe71SKuan-Wei Chiu int i; 178*06ebbe71SKuan-Wei Chiu 179*06ebbe71SKuan-Wei Chiu for (i = 0; i < path->num_nodes; i++) 180*06ebbe71SKuan-Wei Chiu hlist_del(&path->reqs[i].req_node); 181*06ebbe71SKuan-Wei Chiu 182*06ebbe71SKuan-Wei Chiu kunit_kfree(test, path); 183*06ebbe71SKuan-Wei Chiu } 184*06ebbe71SKuan-Wei Chiu 185*06ebbe71SKuan-Wei Chiu static void icc_test_topology_integrity(struct kunit *test) 186*06ebbe71SKuan-Wei Chiu { 187*06ebbe71SKuan-Wei Chiu struct icc_test_priv *priv = test->priv; 188*06ebbe71SKuan-Wei Chiu struct icc_node *cpu = get_node(priv, NODE_CPU); 189*06ebbe71SKuan-Wei Chiu struct icc_node *bus = get_node(priv, NODE_BUS); 190*06ebbe71SKuan-Wei Chiu 191*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, cpu->num_links, 1); 192*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_PTR_EQ(test, cpu->links[0], bus); 193*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_PTR_EQ(test, cpu->provider, &priv->provider); 194*06ebbe71SKuan-Wei Chiu } 195*06ebbe71SKuan-Wei Chiu 196*06ebbe71SKuan-Wei Chiu static void icc_test_set_bw(struct kunit *test) 197*06ebbe71SKuan-Wei Chiu { 198*06ebbe71SKuan-Wei Chiu struct icc_test_priv *priv = test->priv; 199*06ebbe71SKuan-Wei Chiu struct icc_path *path; 200*06ebbe71SKuan-Wei Chiu struct icc_node *path_nodes[3]; 201*06ebbe71SKuan-Wei Chiu int ret; 202*06ebbe71SKuan-Wei Chiu 203*06ebbe71SKuan-Wei Chiu /* Path: CPU -> BUS -> DDR */ 204*06ebbe71SKuan-Wei Chiu path_nodes[0] = get_node(priv, NODE_CPU); 205*06ebbe71SKuan-Wei Chiu path_nodes[1] = get_node(priv, NODE_BUS); 206*06ebbe71SKuan-Wei Chiu path_nodes[2] = get_node(priv, NODE_DDR); 207*06ebbe71SKuan-Wei Chiu 208*06ebbe71SKuan-Wei Chiu path = icc_test_create_path(test, path_nodes, 3); 209*06ebbe71SKuan-Wei Chiu 210*06ebbe71SKuan-Wei Chiu ret = icc_enable(path); 211*06ebbe71SKuan-Wei Chiu KUNIT_ASSERT_EQ(test, ret, 0); 212*06ebbe71SKuan-Wei Chiu 213*06ebbe71SKuan-Wei Chiu ret = icc_set_bw(path, 1000, 2000); 214*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, ret, 0); 215*06ebbe71SKuan-Wei Chiu 216*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, path_nodes[0]->avg_bw, 1000); 217*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, path_nodes[0]->peak_bw, 2000); 218*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, path_nodes[1]->avg_bw, 1000); 219*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, path_nodes[1]->peak_bw, 2000); 220*06ebbe71SKuan-Wei Chiu 221*06ebbe71SKuan-Wei Chiu icc_set_tag(path, 0xABC); 222*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, path->reqs[0].tag, 0xABC); 223*06ebbe71SKuan-Wei Chiu 224*06ebbe71SKuan-Wei Chiu icc_disable(path); 225*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, path_nodes[0]->avg_bw, 0); 226*06ebbe71SKuan-Wei Chiu 227*06ebbe71SKuan-Wei Chiu icc_test_destroy_path(test, path); 228*06ebbe71SKuan-Wei Chiu } 229*06ebbe71SKuan-Wei Chiu 230*06ebbe71SKuan-Wei Chiu static void icc_test_aggregation(struct kunit *test) 231*06ebbe71SKuan-Wei Chiu { 232*06ebbe71SKuan-Wei Chiu struct icc_test_priv *priv = test->priv; 233*06ebbe71SKuan-Wei Chiu struct icc_path *path_cpu, *path_gpu; 234*06ebbe71SKuan-Wei Chiu struct icc_node *nodes_cpu[3], *nodes_gpu[2]; 235*06ebbe71SKuan-Wei Chiu struct icc_node *bus = get_node(priv, NODE_BUS); 236*06ebbe71SKuan-Wei Chiu int ret; 237*06ebbe71SKuan-Wei Chiu 238*06ebbe71SKuan-Wei Chiu nodes_cpu[0] = get_node(priv, NODE_CPU); 239*06ebbe71SKuan-Wei Chiu nodes_cpu[1] = bus; 240*06ebbe71SKuan-Wei Chiu nodes_cpu[2] = get_node(priv, NODE_DDR); 241*06ebbe71SKuan-Wei Chiu path_cpu = icc_test_create_path(test, nodes_cpu, 3); 242*06ebbe71SKuan-Wei Chiu 243*06ebbe71SKuan-Wei Chiu nodes_gpu[0] = get_node(priv, NODE_GPU); 244*06ebbe71SKuan-Wei Chiu nodes_gpu[1] = bus; 245*06ebbe71SKuan-Wei Chiu path_gpu = icc_test_create_path(test, nodes_gpu, 2); 246*06ebbe71SKuan-Wei Chiu 247*06ebbe71SKuan-Wei Chiu icc_enable(path_cpu); 248*06ebbe71SKuan-Wei Chiu icc_enable(path_gpu); 249*06ebbe71SKuan-Wei Chiu 250*06ebbe71SKuan-Wei Chiu ret = icc_set_bw(path_cpu, 1000, 1000); 251*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, ret, 0); 252*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, bus->avg_bw, 1000); 253*06ebbe71SKuan-Wei Chiu 254*06ebbe71SKuan-Wei Chiu ret = icc_set_bw(path_gpu, 2000, 2000); 255*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, ret, 0); 256*06ebbe71SKuan-Wei Chiu 257*06ebbe71SKuan-Wei Chiu /* Bus aggregates: CPU(1000) + GPU(2000) */ 258*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, bus->avg_bw, 3000); 259*06ebbe71SKuan-Wei Chiu /* Peak aggregates: max(CPU, GPU) */ 260*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, bus->peak_bw, 2000); 261*06ebbe71SKuan-Wei Chiu 262*06ebbe71SKuan-Wei Chiu icc_test_destroy_path(test, path_cpu); 263*06ebbe71SKuan-Wei Chiu icc_test_destroy_path(test, path_gpu); 264*06ebbe71SKuan-Wei Chiu } 265*06ebbe71SKuan-Wei Chiu 266*06ebbe71SKuan-Wei Chiu static void icc_test_bulk_ops(struct kunit *test) 267*06ebbe71SKuan-Wei Chiu { 268*06ebbe71SKuan-Wei Chiu struct icc_test_priv *priv = test->priv; 269*06ebbe71SKuan-Wei Chiu struct icc_node *nodes_cpu[3], *nodes_gpu[2]; 270*06ebbe71SKuan-Wei Chiu struct icc_bulk_data bulk[2]; 271*06ebbe71SKuan-Wei Chiu int ret; 272*06ebbe71SKuan-Wei Chiu 273*06ebbe71SKuan-Wei Chiu nodes_cpu[0] = get_node(priv, NODE_CPU); 274*06ebbe71SKuan-Wei Chiu nodes_cpu[1] = get_node(priv, NODE_BUS); 275*06ebbe71SKuan-Wei Chiu nodes_cpu[2] = get_node(priv, NODE_DDR); 276*06ebbe71SKuan-Wei Chiu 277*06ebbe71SKuan-Wei Chiu nodes_gpu[0] = get_node(priv, NODE_GPU); 278*06ebbe71SKuan-Wei Chiu nodes_gpu[1] = get_node(priv, NODE_BUS); 279*06ebbe71SKuan-Wei Chiu 280*06ebbe71SKuan-Wei Chiu bulk[0].path = icc_test_create_path(test, nodes_cpu, 3); 281*06ebbe71SKuan-Wei Chiu bulk[0].avg_bw = 500; 282*06ebbe71SKuan-Wei Chiu bulk[0].peak_bw = 500; 283*06ebbe71SKuan-Wei Chiu 284*06ebbe71SKuan-Wei Chiu bulk[1].path = icc_test_create_path(test, nodes_gpu, 2); 285*06ebbe71SKuan-Wei Chiu bulk[1].avg_bw = 600; 286*06ebbe71SKuan-Wei Chiu bulk[1].peak_bw = 600; 287*06ebbe71SKuan-Wei Chiu 288*06ebbe71SKuan-Wei Chiu ret = icc_bulk_set_bw(2, bulk); 289*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, ret, 0); 290*06ebbe71SKuan-Wei Chiu /* Paths disabled, bandwidth should be 0 */ 291*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, get_node(priv, NODE_BUS)->avg_bw, 0); 292*06ebbe71SKuan-Wei Chiu 293*06ebbe71SKuan-Wei Chiu ret = icc_bulk_enable(2, bulk); 294*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, ret, 0); 295*06ebbe71SKuan-Wei Chiu /* Paths enabled, aggregation applies */ 296*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, get_node(priv, NODE_BUS)->avg_bw, 1100); 297*06ebbe71SKuan-Wei Chiu 298*06ebbe71SKuan-Wei Chiu icc_bulk_disable(2, bulk); 299*06ebbe71SKuan-Wei Chiu KUNIT_EXPECT_EQ(test, get_node(priv, NODE_BUS)->avg_bw, 0); 300*06ebbe71SKuan-Wei Chiu 301*06ebbe71SKuan-Wei Chiu icc_test_destroy_path(test, bulk[0].path); 302*06ebbe71SKuan-Wei Chiu icc_test_destroy_path(test, bulk[1].path); 303*06ebbe71SKuan-Wei Chiu } 304*06ebbe71SKuan-Wei Chiu 305*06ebbe71SKuan-Wei Chiu static struct kunit_case icc_test_cases[] = { 306*06ebbe71SKuan-Wei Chiu KUNIT_CASE(icc_test_topology_integrity), 307*06ebbe71SKuan-Wei Chiu KUNIT_CASE(icc_test_set_bw), 308*06ebbe71SKuan-Wei Chiu KUNIT_CASE(icc_test_aggregation), 309*06ebbe71SKuan-Wei Chiu KUNIT_CASE(icc_test_bulk_ops), 310*06ebbe71SKuan-Wei Chiu {} 311*06ebbe71SKuan-Wei Chiu }; 312*06ebbe71SKuan-Wei Chiu 313*06ebbe71SKuan-Wei Chiu static struct kunit_suite icc_test_suite = { 314*06ebbe71SKuan-Wei Chiu .name = "interconnect", 315*06ebbe71SKuan-Wei Chiu .init = icc_test_init, 316*06ebbe71SKuan-Wei Chiu .exit = icc_test_exit, 317*06ebbe71SKuan-Wei Chiu .test_cases = icc_test_cases, 318*06ebbe71SKuan-Wei Chiu }; 319*06ebbe71SKuan-Wei Chiu 320*06ebbe71SKuan-Wei Chiu kunit_test_suite(icc_test_suite); 321*06ebbe71SKuan-Wei Chiu 322*06ebbe71SKuan-Wei Chiu MODULE_AUTHOR("Kuan-Wei Chiu <visitorckw@gmail.com>"); 323*06ebbe71SKuan-Wei Chiu MODULE_DESCRIPTION("KUnit tests for the Interconnect framework"); 324*06ebbe71SKuan-Wei Chiu MODULE_LICENSE("GPL"); 325