xref: /openbmc/linux/drivers/base/power/qos-test.c (revision c475c77d)
114e08757SLeonard Crestez // SPDX-License-Identifier: GPL-2.0
214e08757SLeonard Crestez /*
314e08757SLeonard Crestez  * Copyright 2019 NXP
414e08757SLeonard Crestez  */
514e08757SLeonard Crestez #include <kunit/test.h>
614e08757SLeonard Crestez #include <linux/pm_qos.h>
714e08757SLeonard Crestez 
814e08757SLeonard Crestez /* Basic test for aggregating two "min" requests */
freq_qos_test_min(struct kunit * test)914e08757SLeonard Crestez static void freq_qos_test_min(struct kunit *test)
1014e08757SLeonard Crestez {
1114e08757SLeonard Crestez 	struct freq_constraints	qos;
1214e08757SLeonard Crestez 	struct freq_qos_request	req1, req2;
1314e08757SLeonard Crestez 	int ret;
1414e08757SLeonard Crestez 
1514e08757SLeonard Crestez 	freq_constraints_init(&qos);
1614e08757SLeonard Crestez 	memset(&req1, 0, sizeof(req1));
1714e08757SLeonard Crestez 	memset(&req2, 0, sizeof(req2));
1814e08757SLeonard Crestez 
1914e08757SLeonard Crestez 	ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MIN, 1000);
2014e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, ret, 1);
2114e08757SLeonard Crestez 	ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MIN, 2000);
2214e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, ret, 1);
2314e08757SLeonard Crestez 
2414e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000);
2514e08757SLeonard Crestez 
2614e08757SLeonard Crestez 	ret = freq_qos_remove_request(&req2);
2714e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, ret, 1);
2814e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000);
2914e08757SLeonard Crestez 
3014e08757SLeonard Crestez 	ret = freq_qos_remove_request(&req1);
3114e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, ret, 1);
3214e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
3314e08757SLeonard Crestez 			FREQ_QOS_MIN_DEFAULT_VALUE);
3414e08757SLeonard Crestez }
3514e08757SLeonard Crestez 
3614e08757SLeonard Crestez /* Test that requests for MAX_DEFAULT_VALUE have no effect */
freq_qos_test_maxdef(struct kunit * test)3714e08757SLeonard Crestez static void freq_qos_test_maxdef(struct kunit *test)
3814e08757SLeonard Crestez {
3914e08757SLeonard Crestez 	struct freq_constraints	qos;
4014e08757SLeonard Crestez 	struct freq_qos_request	req1, req2;
4114e08757SLeonard Crestez 	int ret;
4214e08757SLeonard Crestez 
4314e08757SLeonard Crestez 	freq_constraints_init(&qos);
4414e08757SLeonard Crestez 	memset(&req1, 0, sizeof(req1));
4514e08757SLeonard Crestez 	memset(&req2, 0, sizeof(req2));
4614e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX),
4714e08757SLeonard Crestez 			FREQ_QOS_MAX_DEFAULT_VALUE);
4814e08757SLeonard Crestez 
4914e08757SLeonard Crestez 	ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MAX,
5014e08757SLeonard Crestez 			FREQ_QOS_MAX_DEFAULT_VALUE);
5114e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, ret, 0);
5214e08757SLeonard Crestez 	ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MAX,
5314e08757SLeonard Crestez 			FREQ_QOS_MAX_DEFAULT_VALUE);
5414e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, ret, 0);
5514e08757SLeonard Crestez 
5614e08757SLeonard Crestez 	/* Add max 1000 */
5714e08757SLeonard Crestez 	ret = freq_qos_update_request(&req1, 1000);
5814e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, ret, 1);
5914e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000);
6014e08757SLeonard Crestez 
6114e08757SLeonard Crestez 	/* Add max 2000, no impact */
6214e08757SLeonard Crestez 	ret = freq_qos_update_request(&req2, 2000);
6314e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, ret, 0);
6414e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000);
6514e08757SLeonard Crestez 
6614e08757SLeonard Crestez 	/* Remove max 1000, new max 2000 */
6714e08757SLeonard Crestez 	ret = freq_qos_remove_request(&req1);
6814e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, ret, 1);
6914e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 2000);
7014e08757SLeonard Crestez }
7114e08757SLeonard Crestez 
7214e08757SLeonard Crestez /*
7314e08757SLeonard Crestez  * Test that a freq_qos_request can be added again after removal
7414e08757SLeonard Crestez  *
7514e08757SLeonard Crestez  * This issue was solved by commit 05ff1ba412fd ("PM: QoS: Invalidate frequency
7614e08757SLeonard Crestez  * QoS requests after removal")
7714e08757SLeonard Crestez  */
freq_qos_test_readd(struct kunit * test)7814e08757SLeonard Crestez static void freq_qos_test_readd(struct kunit *test)
7914e08757SLeonard Crestez {
8014e08757SLeonard Crestez 	struct freq_constraints	qos;
8114e08757SLeonard Crestez 	struct freq_qos_request	req;
8214e08757SLeonard Crestez 	int ret;
8314e08757SLeonard Crestez 
8414e08757SLeonard Crestez 	freq_constraints_init(&qos);
8514e08757SLeonard Crestez 	memset(&req, 0, sizeof(req));
8614e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
8714e08757SLeonard Crestez 			FREQ_QOS_MIN_DEFAULT_VALUE);
8814e08757SLeonard Crestez 
8914e08757SLeonard Crestez 	/* Add */
9014e08757SLeonard Crestez 	ret = freq_qos_add_request(&qos, &req, FREQ_QOS_MIN, 1000);
9114e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, ret, 1);
9214e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000);
9314e08757SLeonard Crestez 
9414e08757SLeonard Crestez 	/* Remove */
9514e08757SLeonard Crestez 	ret = freq_qos_remove_request(&req);
9614e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, ret, 1);
9714e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
9814e08757SLeonard Crestez 			FREQ_QOS_MIN_DEFAULT_VALUE);
9914e08757SLeonard Crestez 
10014e08757SLeonard Crestez 	/* Add again */
10114e08757SLeonard Crestez 	ret = freq_qos_add_request(&qos, &req, FREQ_QOS_MIN, 2000);
10214e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, ret, 1);
10314e08757SLeonard Crestez 	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000);
10414e08757SLeonard Crestez }
10514e08757SLeonard Crestez 
10614e08757SLeonard Crestez static struct kunit_case pm_qos_test_cases[] = {
10714e08757SLeonard Crestez 	KUNIT_CASE(freq_qos_test_min),
10814e08757SLeonard Crestez 	KUNIT_CASE(freq_qos_test_maxdef),
10914e08757SLeonard Crestez 	KUNIT_CASE(freq_qos_test_readd),
11014e08757SLeonard Crestez 	{},
11114e08757SLeonard Crestez };
11214e08757SLeonard Crestez 
11314e08757SLeonard Crestez static struct kunit_suite pm_qos_test_module = {
11414e08757SLeonard Crestez 	.name = "qos-kunit-test",
11514e08757SLeonard Crestez 	.test_cases = pm_qos_test_cases,
11614e08757SLeonard Crestez };
117c475c77dSAlan Maguire kunit_test_suites(&pm_qos_test_module);
118