15df38ca6SAndy Shevchenko // SPDX-License-Identifier: GPL-2.0+
25df38ca6SAndy Shevchenko /*
35df38ca6SAndy Shevchenko * Test cases for API provided by resource.c and ioport.h
45df38ca6SAndy Shevchenko */
55df38ca6SAndy Shevchenko
65df38ca6SAndy Shevchenko #include <kunit/test.h>
75df38ca6SAndy Shevchenko #include <linux/ioport.h>
85df38ca6SAndy Shevchenko #include <linux/kernel.h>
95df38ca6SAndy Shevchenko #include <linux/string.h>
1099185c10SHuang Ying #include <linux/sizes.h>
1199185c10SHuang Ying #include <linux/mm.h>
125df38ca6SAndy Shevchenko
135df38ca6SAndy Shevchenko #define R0_START 0x0000
145df38ca6SAndy Shevchenko #define R0_END 0xffff
155df38ca6SAndy Shevchenko #define R1_START 0x1234
165df38ca6SAndy Shevchenko #define R1_END 0x2345
175df38ca6SAndy Shevchenko #define R2_START 0x4567
185df38ca6SAndy Shevchenko #define R2_END 0x5678
195df38ca6SAndy Shevchenko #define R3_START 0x6789
205df38ca6SAndy Shevchenko #define R3_END 0x789a
215df38ca6SAndy Shevchenko #define R4_START 0x2000
225df38ca6SAndy Shevchenko #define R4_END 0x7000
235df38ca6SAndy Shevchenko
245df38ca6SAndy Shevchenko static struct resource r0 = { .start = R0_START, .end = R0_END };
255df38ca6SAndy Shevchenko static struct resource r1 = { .start = R1_START, .end = R1_END };
265df38ca6SAndy Shevchenko static struct resource r2 = { .start = R2_START, .end = R2_END };
275df38ca6SAndy Shevchenko static struct resource r3 = { .start = R3_START, .end = R3_END };
285df38ca6SAndy Shevchenko static struct resource r4 = { .start = R4_START, .end = R4_END };
295df38ca6SAndy Shevchenko
305df38ca6SAndy Shevchenko struct result {
315df38ca6SAndy Shevchenko struct resource *r1;
325df38ca6SAndy Shevchenko struct resource *r2;
335df38ca6SAndy Shevchenko struct resource r;
345df38ca6SAndy Shevchenko bool ret;
355df38ca6SAndy Shevchenko };
365df38ca6SAndy Shevchenko
375df38ca6SAndy Shevchenko static struct result results_for_union[] = {
385df38ca6SAndy Shevchenko {
395df38ca6SAndy Shevchenko .r1 = &r1, .r2 = &r0, .r.start = R0_START, .r.end = R0_END, .ret = true,
405df38ca6SAndy Shevchenko }, {
415df38ca6SAndy Shevchenko .r1 = &r2, .r2 = &r0, .r.start = R0_START, .r.end = R0_END, .ret = true,
425df38ca6SAndy Shevchenko }, {
435df38ca6SAndy Shevchenko .r1 = &r3, .r2 = &r0, .r.start = R0_START, .r.end = R0_END, .ret = true,
445df38ca6SAndy Shevchenko }, {
455df38ca6SAndy Shevchenko .r1 = &r4, .r2 = &r0, .r.start = R0_START, .r.end = R0_END, .ret = true,
465df38ca6SAndy Shevchenko }, {
475df38ca6SAndy Shevchenko .r1 = &r2, .r2 = &r1, .ret = false,
485df38ca6SAndy Shevchenko }, {
495df38ca6SAndy Shevchenko .r1 = &r3, .r2 = &r1, .ret = false,
505df38ca6SAndy Shevchenko }, {
515df38ca6SAndy Shevchenko .r1 = &r4, .r2 = &r1, .r.start = R1_START, .r.end = R4_END, .ret = true,
525df38ca6SAndy Shevchenko }, {
535df38ca6SAndy Shevchenko .r1 = &r2, .r2 = &r3, .ret = false,
545df38ca6SAndy Shevchenko }, {
555df38ca6SAndy Shevchenko .r1 = &r2, .r2 = &r4, .r.start = R4_START, .r.end = R4_END, .ret = true,
565df38ca6SAndy Shevchenko }, {
575df38ca6SAndy Shevchenko .r1 = &r3, .r2 = &r4, .r.start = R4_START, .r.end = R3_END, .ret = true,
585df38ca6SAndy Shevchenko },
595df38ca6SAndy Shevchenko };
605df38ca6SAndy Shevchenko
615df38ca6SAndy Shevchenko static struct result results_for_intersection[] = {
625df38ca6SAndy Shevchenko {
635df38ca6SAndy Shevchenko .r1 = &r1, .r2 = &r0, .r.start = R1_START, .r.end = R1_END, .ret = true,
645df38ca6SAndy Shevchenko }, {
655df38ca6SAndy Shevchenko .r1 = &r2, .r2 = &r0, .r.start = R2_START, .r.end = R2_END, .ret = true,
665df38ca6SAndy Shevchenko }, {
675df38ca6SAndy Shevchenko .r1 = &r3, .r2 = &r0, .r.start = R3_START, .r.end = R3_END, .ret = true,
685df38ca6SAndy Shevchenko }, {
695df38ca6SAndy Shevchenko .r1 = &r4, .r2 = &r0, .r.start = R4_START, .r.end = R4_END, .ret = true,
705df38ca6SAndy Shevchenko }, {
715df38ca6SAndy Shevchenko .r1 = &r2, .r2 = &r1, .ret = false,
725df38ca6SAndy Shevchenko }, {
735df38ca6SAndy Shevchenko .r1 = &r3, .r2 = &r1, .ret = false,
745df38ca6SAndy Shevchenko }, {
755df38ca6SAndy Shevchenko .r1 = &r4, .r2 = &r1, .r.start = R4_START, .r.end = R1_END, .ret = true,
765df38ca6SAndy Shevchenko }, {
775df38ca6SAndy Shevchenko .r1 = &r2, .r2 = &r3, .ret = false,
785df38ca6SAndy Shevchenko }, {
795df38ca6SAndy Shevchenko .r1 = &r2, .r2 = &r4, .r.start = R2_START, .r.end = R2_END, .ret = true,
805df38ca6SAndy Shevchenko }, {
815df38ca6SAndy Shevchenko .r1 = &r3, .r2 = &r4, .r.start = R3_START, .r.end = R4_END, .ret = true,
825df38ca6SAndy Shevchenko },
835df38ca6SAndy Shevchenko };
845df38ca6SAndy Shevchenko
resource_do_test(struct kunit * test,bool ret,struct resource * r,bool exp_ret,struct resource * exp_r,struct resource * r1,struct resource * r2)855df38ca6SAndy Shevchenko static void resource_do_test(struct kunit *test, bool ret, struct resource *r,
865df38ca6SAndy Shevchenko bool exp_ret, struct resource *exp_r,
875df38ca6SAndy Shevchenko struct resource *r1, struct resource *r2)
885df38ca6SAndy Shevchenko {
895df38ca6SAndy Shevchenko KUNIT_EXPECT_EQ_MSG(test, ret, exp_ret, "Resources %pR %pR", r1, r2);
905df38ca6SAndy Shevchenko KUNIT_EXPECT_EQ_MSG(test, r->start, exp_r->start, "Start elements are not equal");
915df38ca6SAndy Shevchenko KUNIT_EXPECT_EQ_MSG(test, r->end, exp_r->end, "End elements are not equal");
925df38ca6SAndy Shevchenko }
935df38ca6SAndy Shevchenko
resource_do_union_test(struct kunit * test,struct result * r)945df38ca6SAndy Shevchenko static void resource_do_union_test(struct kunit *test, struct result *r)
955df38ca6SAndy Shevchenko {
965df38ca6SAndy Shevchenko struct resource result;
975df38ca6SAndy Shevchenko bool ret;
985df38ca6SAndy Shevchenko
995df38ca6SAndy Shevchenko memset(&result, 0, sizeof(result));
1005df38ca6SAndy Shevchenko ret = resource_union(r->r1, r->r2, &result);
1015df38ca6SAndy Shevchenko resource_do_test(test, ret, &result, r->ret, &r->r, r->r1, r->r2);
1025df38ca6SAndy Shevchenko
1035df38ca6SAndy Shevchenko memset(&result, 0, sizeof(result));
1045df38ca6SAndy Shevchenko ret = resource_union(r->r2, r->r1, &result);
1055df38ca6SAndy Shevchenko resource_do_test(test, ret, &result, r->ret, &r->r, r->r2, r->r1);
1065df38ca6SAndy Shevchenko }
1075df38ca6SAndy Shevchenko
resource_test_union(struct kunit * test)1085df38ca6SAndy Shevchenko static void resource_test_union(struct kunit *test)
1095df38ca6SAndy Shevchenko {
1105df38ca6SAndy Shevchenko struct result *r = results_for_union;
1115df38ca6SAndy Shevchenko unsigned int i = 0;
1125df38ca6SAndy Shevchenko
1135df38ca6SAndy Shevchenko do {
1145df38ca6SAndy Shevchenko resource_do_union_test(test, &r[i]);
1155df38ca6SAndy Shevchenko } while (++i < ARRAY_SIZE(results_for_union));
1165df38ca6SAndy Shevchenko }
1175df38ca6SAndy Shevchenko
resource_do_intersection_test(struct kunit * test,struct result * r)1185df38ca6SAndy Shevchenko static void resource_do_intersection_test(struct kunit *test, struct result *r)
1195df38ca6SAndy Shevchenko {
1205df38ca6SAndy Shevchenko struct resource result;
1215df38ca6SAndy Shevchenko bool ret;
1225df38ca6SAndy Shevchenko
1235df38ca6SAndy Shevchenko memset(&result, 0, sizeof(result));
1245df38ca6SAndy Shevchenko ret = resource_intersection(r->r1, r->r2, &result);
1255df38ca6SAndy Shevchenko resource_do_test(test, ret, &result, r->ret, &r->r, r->r1, r->r2);
1265df38ca6SAndy Shevchenko
1275df38ca6SAndy Shevchenko memset(&result, 0, sizeof(result));
1285df38ca6SAndy Shevchenko ret = resource_intersection(r->r2, r->r1, &result);
1295df38ca6SAndy Shevchenko resource_do_test(test, ret, &result, r->ret, &r->r, r->r2, r->r1);
1305df38ca6SAndy Shevchenko }
1315df38ca6SAndy Shevchenko
resource_test_intersection(struct kunit * test)1325df38ca6SAndy Shevchenko static void resource_test_intersection(struct kunit *test)
1335df38ca6SAndy Shevchenko {
1345df38ca6SAndy Shevchenko struct result *r = results_for_intersection;
1355df38ca6SAndy Shevchenko unsigned int i = 0;
1365df38ca6SAndy Shevchenko
1375df38ca6SAndy Shevchenko do {
1385df38ca6SAndy Shevchenko resource_do_intersection_test(test, &r[i]);
1395df38ca6SAndy Shevchenko } while (++i < ARRAY_SIZE(results_for_intersection));
1405df38ca6SAndy Shevchenko }
1415df38ca6SAndy Shevchenko
14299185c10SHuang Ying /*
14399185c10SHuang Ying * The test resource tree for region_intersects() test:
14499185c10SHuang Ying *
14599185c10SHuang Ying * BASE-BASE+1M-1 : Test System RAM 0
14699185c10SHuang Ying * # hole 0 (BASE+1M-BASE+2M)
14799185c10SHuang Ying * BASE+2M-BASE+3M-1 : Test CXL Window 0
14899185c10SHuang Ying * BASE+3M-BASE+4M-1 : Test System RAM 1
14999185c10SHuang Ying * BASE+4M-BASE+7M-1 : Test CXL Window 1
15099185c10SHuang Ying * BASE+4M-BASE+5M-1 : Test System RAM 2
15199185c10SHuang Ying * BASE+4M+128K-BASE+4M+256K-1: Test Code
15299185c10SHuang Ying * BASE+5M-BASE+6M-1 : Test System RAM 3
15399185c10SHuang Ying */
15499185c10SHuang Ying #define RES_TEST_RAM0_OFFSET 0
15599185c10SHuang Ying #define RES_TEST_RAM0_SIZE SZ_1M
15699185c10SHuang Ying #define RES_TEST_HOLE0_OFFSET (RES_TEST_RAM0_OFFSET + RES_TEST_RAM0_SIZE)
15799185c10SHuang Ying #define RES_TEST_HOLE0_SIZE SZ_1M
15899185c10SHuang Ying #define RES_TEST_WIN0_OFFSET (RES_TEST_HOLE0_OFFSET + RES_TEST_HOLE0_SIZE)
15999185c10SHuang Ying #define RES_TEST_WIN0_SIZE SZ_1M
16099185c10SHuang Ying #define RES_TEST_RAM1_OFFSET (RES_TEST_WIN0_OFFSET + RES_TEST_WIN0_SIZE)
16199185c10SHuang Ying #define RES_TEST_RAM1_SIZE SZ_1M
16299185c10SHuang Ying #define RES_TEST_WIN1_OFFSET (RES_TEST_RAM1_OFFSET + RES_TEST_RAM1_SIZE)
16399185c10SHuang Ying #define RES_TEST_WIN1_SIZE (SZ_1M * 3)
16499185c10SHuang Ying #define RES_TEST_RAM2_OFFSET RES_TEST_WIN1_OFFSET
16599185c10SHuang Ying #define RES_TEST_RAM2_SIZE SZ_1M
16699185c10SHuang Ying #define RES_TEST_CODE_OFFSET (RES_TEST_RAM2_OFFSET + SZ_128K)
16799185c10SHuang Ying #define RES_TEST_CODE_SIZE SZ_128K
16899185c10SHuang Ying #define RES_TEST_RAM3_OFFSET (RES_TEST_RAM2_OFFSET + RES_TEST_RAM2_SIZE)
16999185c10SHuang Ying #define RES_TEST_RAM3_SIZE SZ_1M
17099185c10SHuang Ying #define RES_TEST_TOTAL_SIZE ((RES_TEST_WIN1_OFFSET + RES_TEST_WIN1_SIZE))
17199185c10SHuang Ying
172*0665d7a3SHuang Ying KUNIT_DEFINE_ACTION_WRAPPER(kfree_wrapper, kfree, const void *);
173*0665d7a3SHuang Ying
remove_free_resource(void * ctx)17499185c10SHuang Ying static void remove_free_resource(void *ctx)
17599185c10SHuang Ying {
17699185c10SHuang Ying struct resource *res = (struct resource *)ctx;
17799185c10SHuang Ying
17899185c10SHuang Ying remove_resource(res);
17999185c10SHuang Ying kfree(res);
18099185c10SHuang Ying }
18199185c10SHuang Ying
resource_test_add_action_or_abort(struct kunit * test,void (* action)(void *),void * ctx)182*0665d7a3SHuang Ying static void resource_test_add_action_or_abort(
183*0665d7a3SHuang Ying struct kunit *test, void (*action)(void *), void *ctx)
184*0665d7a3SHuang Ying {
185*0665d7a3SHuang Ying KUNIT_ASSERT_EQ_MSG(test, 0,
186*0665d7a3SHuang Ying kunit_add_action_or_reset(test, action, ctx),
187*0665d7a3SHuang Ying "Fail to add action");
188*0665d7a3SHuang Ying }
189*0665d7a3SHuang Ying
resource_test_request_region(struct kunit * test,struct resource * parent,resource_size_t start,resource_size_t size,const char * name,unsigned long flags)19099185c10SHuang Ying static void resource_test_request_region(struct kunit *test, struct resource *parent,
19199185c10SHuang Ying resource_size_t start, resource_size_t size,
19299185c10SHuang Ying const char *name, unsigned long flags)
19399185c10SHuang Ying {
19499185c10SHuang Ying struct resource *res;
19599185c10SHuang Ying
19699185c10SHuang Ying res = __request_region(parent, start, size, name, flags);
19799185c10SHuang Ying KUNIT_ASSERT_NOT_NULL(test, res);
198*0665d7a3SHuang Ying resource_test_add_action_or_abort(test, remove_free_resource, res);
19999185c10SHuang Ying }
20099185c10SHuang Ying
resource_test_insert_resource(struct kunit * test,struct resource * parent,resource_size_t start,resource_size_t size,const char * name,unsigned long flags)20199185c10SHuang Ying static void resource_test_insert_resource(struct kunit *test, struct resource *parent,
20299185c10SHuang Ying resource_size_t start, resource_size_t size,
20399185c10SHuang Ying const char *name, unsigned long flags)
20499185c10SHuang Ying {
20599185c10SHuang Ying struct resource *res;
20699185c10SHuang Ying
20799185c10SHuang Ying res = kzalloc(sizeof(*res), GFP_KERNEL);
20899185c10SHuang Ying KUNIT_ASSERT_NOT_NULL(test, res);
20999185c10SHuang Ying
21099185c10SHuang Ying res->name = name;
21199185c10SHuang Ying res->start = start;
21299185c10SHuang Ying res->end = start + size - 1;
21399185c10SHuang Ying res->flags = flags;
21499185c10SHuang Ying if (insert_resource(parent, res)) {
215*0665d7a3SHuang Ying resource_test_add_action_or_abort(test, kfree_wrapper, res);
21699185c10SHuang Ying KUNIT_FAIL_AND_ABORT(test, "Fail to insert resource %pR\n", res);
21799185c10SHuang Ying }
21899185c10SHuang Ying
219*0665d7a3SHuang Ying resource_test_add_action_or_abort(test, remove_free_resource, res);
22099185c10SHuang Ying }
22199185c10SHuang Ying
resource_test_region_intersects(struct kunit * test)22299185c10SHuang Ying static void resource_test_region_intersects(struct kunit *test)
22399185c10SHuang Ying {
22499185c10SHuang Ying unsigned long flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
22599185c10SHuang Ying struct resource *parent;
22699185c10SHuang Ying resource_size_t start;
22799185c10SHuang Ying
22899185c10SHuang Ying /* Find an iomem_resource hole to hold test resources */
22999185c10SHuang Ying parent = alloc_free_mem_region(&iomem_resource, RES_TEST_TOTAL_SIZE, SZ_1M,
23099185c10SHuang Ying "test resources");
23199185c10SHuang Ying KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent);
23299185c10SHuang Ying start = parent->start;
233*0665d7a3SHuang Ying resource_test_add_action_or_abort(test, remove_free_resource, parent);
23499185c10SHuang Ying
23599185c10SHuang Ying resource_test_request_region(test, parent, start + RES_TEST_RAM0_OFFSET,
23699185c10SHuang Ying RES_TEST_RAM0_SIZE, "Test System RAM 0", flags);
23799185c10SHuang Ying resource_test_insert_resource(test, parent, start + RES_TEST_WIN0_OFFSET,
23899185c10SHuang Ying RES_TEST_WIN0_SIZE, "Test CXL Window 0",
23999185c10SHuang Ying IORESOURCE_MEM);
24099185c10SHuang Ying resource_test_request_region(test, parent, start + RES_TEST_RAM1_OFFSET,
24199185c10SHuang Ying RES_TEST_RAM1_SIZE, "Test System RAM 1", flags);
24299185c10SHuang Ying resource_test_insert_resource(test, parent, start + RES_TEST_WIN1_OFFSET,
24399185c10SHuang Ying RES_TEST_WIN1_SIZE, "Test CXL Window 1",
24499185c10SHuang Ying IORESOURCE_MEM);
24599185c10SHuang Ying resource_test_request_region(test, parent, start + RES_TEST_RAM2_OFFSET,
24699185c10SHuang Ying RES_TEST_RAM2_SIZE, "Test System RAM 2", flags);
24799185c10SHuang Ying resource_test_insert_resource(test, parent, start + RES_TEST_CODE_OFFSET,
24899185c10SHuang Ying RES_TEST_CODE_SIZE, "Test Code", flags);
24999185c10SHuang Ying resource_test_request_region(test, parent, start + RES_TEST_RAM3_OFFSET,
25099185c10SHuang Ying RES_TEST_RAM3_SIZE, "Test System RAM 3", flags);
25199185c10SHuang Ying kunit_release_action(test, remove_free_resource, parent);
25299185c10SHuang Ying
25399185c10SHuang Ying KUNIT_EXPECT_EQ(test, REGION_INTERSECTS,
25499185c10SHuang Ying region_intersects(start + RES_TEST_RAM0_OFFSET, PAGE_SIZE,
25599185c10SHuang Ying IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
25699185c10SHuang Ying KUNIT_EXPECT_EQ(test, REGION_INTERSECTS,
25799185c10SHuang Ying region_intersects(start + RES_TEST_RAM0_OFFSET +
25899185c10SHuang Ying RES_TEST_RAM0_SIZE - PAGE_SIZE, 2 * PAGE_SIZE,
25999185c10SHuang Ying IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
26099185c10SHuang Ying KUNIT_EXPECT_EQ(test, REGION_DISJOINT,
26199185c10SHuang Ying region_intersects(start + RES_TEST_HOLE0_OFFSET, PAGE_SIZE,
26299185c10SHuang Ying IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
26399185c10SHuang Ying KUNIT_EXPECT_EQ(test, REGION_DISJOINT,
26499185c10SHuang Ying region_intersects(start + RES_TEST_HOLE0_OFFSET +
26599185c10SHuang Ying RES_TEST_HOLE0_SIZE - PAGE_SIZE, 2 * PAGE_SIZE,
26699185c10SHuang Ying IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
26799185c10SHuang Ying KUNIT_EXPECT_EQ(test, REGION_MIXED,
26899185c10SHuang Ying region_intersects(start + RES_TEST_WIN0_OFFSET +
26999185c10SHuang Ying RES_TEST_WIN0_SIZE - PAGE_SIZE, 2 * PAGE_SIZE,
27099185c10SHuang Ying IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
27199185c10SHuang Ying KUNIT_EXPECT_EQ(test, REGION_INTERSECTS,
27299185c10SHuang Ying region_intersects(start + RES_TEST_RAM1_OFFSET +
27399185c10SHuang Ying RES_TEST_RAM1_SIZE - PAGE_SIZE, 2 * PAGE_SIZE,
27499185c10SHuang Ying IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
27599185c10SHuang Ying KUNIT_EXPECT_EQ(test, REGION_INTERSECTS,
27699185c10SHuang Ying region_intersects(start + RES_TEST_RAM2_OFFSET +
27799185c10SHuang Ying RES_TEST_RAM2_SIZE - PAGE_SIZE, 2 * PAGE_SIZE,
27899185c10SHuang Ying IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
27999185c10SHuang Ying KUNIT_EXPECT_EQ(test, REGION_INTERSECTS,
28099185c10SHuang Ying region_intersects(start + RES_TEST_CODE_OFFSET, PAGE_SIZE,
28199185c10SHuang Ying IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
28299185c10SHuang Ying KUNIT_EXPECT_EQ(test, REGION_INTERSECTS,
28399185c10SHuang Ying region_intersects(start + RES_TEST_RAM2_OFFSET,
28499185c10SHuang Ying RES_TEST_RAM2_SIZE + PAGE_SIZE,
28599185c10SHuang Ying IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
28699185c10SHuang Ying KUNIT_EXPECT_EQ(test, REGION_MIXED,
28799185c10SHuang Ying region_intersects(start + RES_TEST_RAM3_OFFSET,
28899185c10SHuang Ying RES_TEST_RAM3_SIZE + PAGE_SIZE,
28999185c10SHuang Ying IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
29099185c10SHuang Ying }
29199185c10SHuang Ying
2925df38ca6SAndy Shevchenko static struct kunit_case resource_test_cases[] = {
2935df38ca6SAndy Shevchenko KUNIT_CASE(resource_test_union),
2945df38ca6SAndy Shevchenko KUNIT_CASE(resource_test_intersection),
29599185c10SHuang Ying KUNIT_CASE(resource_test_region_intersects),
2965df38ca6SAndy Shevchenko {}
2975df38ca6SAndy Shevchenko };
2985df38ca6SAndy Shevchenko
2995df38ca6SAndy Shevchenko static struct kunit_suite resource_test_suite = {
3005df38ca6SAndy Shevchenko .name = "resource",
3015df38ca6SAndy Shevchenko .test_cases = resource_test_cases,
3025df38ca6SAndy Shevchenko };
3035df38ca6SAndy Shevchenko kunit_test_suite(resource_test_suite);
304b87e7459SAndy Shevchenko
3056073496aSJeff Johnson MODULE_DESCRIPTION("I/O Port & Memory Resource manager unit tests");
306b87e7459SAndy Shevchenko MODULE_LICENSE("GPL");
307