xref: /openbmc/linux/kernel/resource_kunit.c (revision b87e7459)
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>
105df38ca6SAndy Shevchenko 
115df38ca6SAndy Shevchenko #define R0_START	0x0000
125df38ca6SAndy Shevchenko #define R0_END		0xffff
135df38ca6SAndy Shevchenko #define R1_START	0x1234
145df38ca6SAndy Shevchenko #define R1_END		0x2345
155df38ca6SAndy Shevchenko #define R2_START	0x4567
165df38ca6SAndy Shevchenko #define R2_END		0x5678
175df38ca6SAndy Shevchenko #define R3_START	0x6789
185df38ca6SAndy Shevchenko #define R3_END		0x789a
195df38ca6SAndy Shevchenko #define R4_START	0x2000
205df38ca6SAndy Shevchenko #define R4_END		0x7000
215df38ca6SAndy Shevchenko 
225df38ca6SAndy Shevchenko static struct resource r0 = { .start = R0_START, .end = R0_END };
235df38ca6SAndy Shevchenko static struct resource r1 = { .start = R1_START, .end = R1_END };
245df38ca6SAndy Shevchenko static struct resource r2 = { .start = R2_START, .end = R2_END };
255df38ca6SAndy Shevchenko static struct resource r3 = { .start = R3_START, .end = R3_END };
265df38ca6SAndy Shevchenko static struct resource r4 = { .start = R4_START, .end = R4_END };
275df38ca6SAndy Shevchenko 
285df38ca6SAndy Shevchenko struct result {
295df38ca6SAndy Shevchenko 	struct resource *r1;
305df38ca6SAndy Shevchenko 	struct resource *r2;
315df38ca6SAndy Shevchenko 	struct resource r;
325df38ca6SAndy Shevchenko 	bool ret;
335df38ca6SAndy Shevchenko };
345df38ca6SAndy Shevchenko 
355df38ca6SAndy Shevchenko static struct result results_for_union[] = {
365df38ca6SAndy Shevchenko 	{
375df38ca6SAndy Shevchenko 		.r1 = &r1, .r2 = &r0, .r.start = R0_START, .r.end = R0_END, .ret = true,
385df38ca6SAndy Shevchenko 	}, {
395df38ca6SAndy Shevchenko 		.r1 = &r2, .r2 = &r0, .r.start = R0_START, .r.end = R0_END, .ret = true,
405df38ca6SAndy Shevchenko 	}, {
415df38ca6SAndy Shevchenko 		.r1 = &r3, .r2 = &r0, .r.start = R0_START, .r.end = R0_END, .ret = true,
425df38ca6SAndy Shevchenko 	}, {
435df38ca6SAndy Shevchenko 		.r1 = &r4, .r2 = &r0, .r.start = R0_START, .r.end = R0_END, .ret = true,
445df38ca6SAndy Shevchenko 	}, {
455df38ca6SAndy Shevchenko 		.r1 = &r2, .r2 = &r1, .ret = false,
465df38ca6SAndy Shevchenko 	}, {
475df38ca6SAndy Shevchenko 		.r1 = &r3, .r2 = &r1, .ret = false,
485df38ca6SAndy Shevchenko 	}, {
495df38ca6SAndy Shevchenko 		.r1 = &r4, .r2 = &r1, .r.start = R1_START, .r.end = R4_END, .ret = true,
505df38ca6SAndy Shevchenko 	}, {
515df38ca6SAndy Shevchenko 		.r1 = &r2, .r2 = &r3, .ret = false,
525df38ca6SAndy Shevchenko 	}, {
535df38ca6SAndy Shevchenko 		.r1 = &r2, .r2 = &r4, .r.start = R4_START, .r.end = R4_END, .ret = true,
545df38ca6SAndy Shevchenko 	}, {
555df38ca6SAndy Shevchenko 		.r1 = &r3, .r2 = &r4, .r.start = R4_START, .r.end = R3_END, .ret = true,
565df38ca6SAndy Shevchenko 	},
575df38ca6SAndy Shevchenko };
585df38ca6SAndy Shevchenko 
595df38ca6SAndy Shevchenko static struct result results_for_intersection[] = {
605df38ca6SAndy Shevchenko 	{
615df38ca6SAndy Shevchenko 		.r1 = &r1, .r2 = &r0, .r.start = R1_START, .r.end = R1_END, .ret = true,
625df38ca6SAndy Shevchenko 	}, {
635df38ca6SAndy Shevchenko 		.r1 = &r2, .r2 = &r0, .r.start = R2_START, .r.end = R2_END, .ret = true,
645df38ca6SAndy Shevchenko 	}, {
655df38ca6SAndy Shevchenko 		.r1 = &r3, .r2 = &r0, .r.start = R3_START, .r.end = R3_END, .ret = true,
665df38ca6SAndy Shevchenko 	}, {
675df38ca6SAndy Shevchenko 		.r1 = &r4, .r2 = &r0, .r.start = R4_START, .r.end = R4_END, .ret = true,
685df38ca6SAndy Shevchenko 	}, {
695df38ca6SAndy Shevchenko 		.r1 = &r2, .r2 = &r1, .ret = false,
705df38ca6SAndy Shevchenko 	}, {
715df38ca6SAndy Shevchenko 		.r1 = &r3, .r2 = &r1, .ret = false,
725df38ca6SAndy Shevchenko 	}, {
735df38ca6SAndy Shevchenko 		.r1 = &r4, .r2 = &r1, .r.start = R4_START, .r.end = R1_END, .ret = true,
745df38ca6SAndy Shevchenko 	}, {
755df38ca6SAndy Shevchenko 		.r1 = &r2, .r2 = &r3, .ret = false,
765df38ca6SAndy Shevchenko 	}, {
775df38ca6SAndy Shevchenko 		.r1 = &r2, .r2 = &r4, .r.start = R2_START, .r.end = R2_END, .ret = true,
785df38ca6SAndy Shevchenko 	}, {
795df38ca6SAndy Shevchenko 		.r1 = &r3, .r2 = &r4, .r.start = R3_START, .r.end = R4_END, .ret = true,
805df38ca6SAndy Shevchenko 	},
815df38ca6SAndy Shevchenko };
825df38ca6SAndy 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)835df38ca6SAndy Shevchenko static void resource_do_test(struct kunit *test, bool ret, struct resource *r,
845df38ca6SAndy Shevchenko 			     bool exp_ret, struct resource *exp_r,
855df38ca6SAndy Shevchenko 			     struct resource *r1, struct resource *r2)
865df38ca6SAndy Shevchenko {
875df38ca6SAndy Shevchenko 	KUNIT_EXPECT_EQ_MSG(test, ret, exp_ret, "Resources %pR %pR", r1, r2);
885df38ca6SAndy Shevchenko 	KUNIT_EXPECT_EQ_MSG(test, r->start, exp_r->start, "Start elements are not equal");
895df38ca6SAndy Shevchenko 	KUNIT_EXPECT_EQ_MSG(test, r->end, exp_r->end, "End elements are not equal");
905df38ca6SAndy Shevchenko }
915df38ca6SAndy Shevchenko 
resource_do_union_test(struct kunit * test,struct result * r)925df38ca6SAndy Shevchenko static void resource_do_union_test(struct kunit *test, struct result *r)
935df38ca6SAndy Shevchenko {
945df38ca6SAndy Shevchenko 	struct resource result;
955df38ca6SAndy Shevchenko 	bool ret;
965df38ca6SAndy Shevchenko 
975df38ca6SAndy Shevchenko 	memset(&result, 0, sizeof(result));
985df38ca6SAndy Shevchenko 	ret = resource_union(r->r1, r->r2, &result);
995df38ca6SAndy Shevchenko 	resource_do_test(test, ret, &result, r->ret, &r->r, r->r1, r->r2);
1005df38ca6SAndy Shevchenko 
1015df38ca6SAndy Shevchenko 	memset(&result, 0, sizeof(result));
1025df38ca6SAndy Shevchenko 	ret = resource_union(r->r2, r->r1, &result);
1035df38ca6SAndy Shevchenko 	resource_do_test(test, ret, &result, r->ret, &r->r, r->r2, r->r1);
1045df38ca6SAndy Shevchenko }
1055df38ca6SAndy Shevchenko 
resource_test_union(struct kunit * test)1065df38ca6SAndy Shevchenko static void resource_test_union(struct kunit *test)
1075df38ca6SAndy Shevchenko {
1085df38ca6SAndy Shevchenko 	struct result *r = results_for_union;
1095df38ca6SAndy Shevchenko 	unsigned int i = 0;
1105df38ca6SAndy Shevchenko 
1115df38ca6SAndy Shevchenko 	do {
1125df38ca6SAndy Shevchenko 		resource_do_union_test(test, &r[i]);
1135df38ca6SAndy Shevchenko 	} while (++i < ARRAY_SIZE(results_for_union));
1145df38ca6SAndy Shevchenko }
1155df38ca6SAndy Shevchenko 
resource_do_intersection_test(struct kunit * test,struct result * r)1165df38ca6SAndy Shevchenko static void resource_do_intersection_test(struct kunit *test, struct result *r)
1175df38ca6SAndy Shevchenko {
1185df38ca6SAndy Shevchenko 	struct resource result;
1195df38ca6SAndy Shevchenko 	bool ret;
1205df38ca6SAndy Shevchenko 
1215df38ca6SAndy Shevchenko 	memset(&result, 0, sizeof(result));
1225df38ca6SAndy Shevchenko 	ret = resource_intersection(r->r1, r->r2, &result);
1235df38ca6SAndy Shevchenko 	resource_do_test(test, ret, &result, r->ret, &r->r, r->r1, r->r2);
1245df38ca6SAndy Shevchenko 
1255df38ca6SAndy Shevchenko 	memset(&result, 0, sizeof(result));
1265df38ca6SAndy Shevchenko 	ret = resource_intersection(r->r2, r->r1, &result);
1275df38ca6SAndy Shevchenko 	resource_do_test(test, ret, &result, r->ret, &r->r, r->r2, r->r1);
1285df38ca6SAndy Shevchenko }
1295df38ca6SAndy Shevchenko 
resource_test_intersection(struct kunit * test)1305df38ca6SAndy Shevchenko static void resource_test_intersection(struct kunit *test)
1315df38ca6SAndy Shevchenko {
1325df38ca6SAndy Shevchenko 	struct result *r = results_for_intersection;
1335df38ca6SAndy Shevchenko 	unsigned int i = 0;
1345df38ca6SAndy Shevchenko 
1355df38ca6SAndy Shevchenko 	do {
1365df38ca6SAndy Shevchenko 		resource_do_intersection_test(test, &r[i]);
1375df38ca6SAndy Shevchenko 	} while (++i < ARRAY_SIZE(results_for_intersection));
1385df38ca6SAndy Shevchenko }
1395df38ca6SAndy Shevchenko 
1405df38ca6SAndy Shevchenko static struct kunit_case resource_test_cases[] = {
1415df38ca6SAndy Shevchenko 	KUNIT_CASE(resource_test_union),
1425df38ca6SAndy Shevchenko 	KUNIT_CASE(resource_test_intersection),
1435df38ca6SAndy Shevchenko 	{}
1445df38ca6SAndy Shevchenko };
1455df38ca6SAndy Shevchenko 
1465df38ca6SAndy Shevchenko static struct kunit_suite resource_test_suite = {
1475df38ca6SAndy Shevchenko 	.name = "resource",
1485df38ca6SAndy Shevchenko 	.test_cases = resource_test_cases,
1495df38ca6SAndy Shevchenko };
1505df38ca6SAndy Shevchenko kunit_test_suite(resource_test_suite);
151*b87e7459SAndy Shevchenko 
152*b87e7459SAndy Shevchenko MODULE_LICENSE("GPL");
153