xref: /linux-6.15/kernel/resource_kunit.c (revision 0665d7a3)
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