1 // SPDX-License-Identifier: GPL-2.0
5 #include <kunit/test.h>
6 #include <linux/pm_qos.h>
8 /* Basic test for aggregating two "min" requests */
9 static void freq_qos_test_min(struct kunit *test)
11 struct freq_constraints qos;
12 struct freq_qos_request req1, req2;
15 freq_constraints_init(&qos);
16 memset(&req1, 0, sizeof(req1));
17 memset(&req2, 0, sizeof(req2));
19 ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MIN, 1000);
20 KUNIT_EXPECT_EQ(test, ret, 1);
21 ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MIN, 2000);
22 KUNIT_EXPECT_EQ(test, ret, 1);
24 KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000);
26 ret = freq_qos_remove_request(&req2);
27 KUNIT_EXPECT_EQ(test, ret, 1);
28 KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000);
30 ret = freq_qos_remove_request(&req1);
31 KUNIT_EXPECT_EQ(test, ret, 1);
32 KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
33 FREQ_QOS_MIN_DEFAULT_VALUE);
36 /* Test that requests for MAX_DEFAULT_VALUE have no effect */
37 static void freq_qos_test_maxdef(struct kunit *test)
39 struct freq_constraints qos;
40 struct freq_qos_request req1, req2;
43 freq_constraints_init(&qos);
44 memset(&req1, 0, sizeof(req1));
45 memset(&req2, 0, sizeof(req2));
46 KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX),
47 FREQ_QOS_MAX_DEFAULT_VALUE);
49 ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MAX,
50 FREQ_QOS_MAX_DEFAULT_VALUE);
51 KUNIT_EXPECT_EQ(test, ret, 0);
52 ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MAX,
53 FREQ_QOS_MAX_DEFAULT_VALUE);
54 KUNIT_EXPECT_EQ(test, ret, 0);
57 ret = freq_qos_update_request(&req1, 1000);
58 KUNIT_EXPECT_EQ(test, ret, 1);
59 KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000);
61 /* Add max 2000, no impact */
62 ret = freq_qos_update_request(&req2, 2000);
63 KUNIT_EXPECT_EQ(test, ret, 0);
64 KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000);
66 /* Remove max 1000, new max 2000 */
67 ret = freq_qos_remove_request(&req1);
68 KUNIT_EXPECT_EQ(test, ret, 1);
69 KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 2000);
73 * Test that a freq_qos_request can be added again after removal
75 * This issue was solved by commit 05ff1ba412fd ("PM: QoS: Invalidate frequency
76 * QoS requests after removal")
78 static void freq_qos_test_readd(struct kunit *test)
80 struct freq_constraints qos;
81 struct freq_qos_request req;
84 freq_constraints_init(&qos);
85 memset(&req, 0, sizeof(req));
86 KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
87 FREQ_QOS_MIN_DEFAULT_VALUE);
90 ret = freq_qos_add_request(&qos, &req, FREQ_QOS_MIN, 1000);
91 KUNIT_EXPECT_EQ(test, ret, 1);
92 KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000);
95 ret = freq_qos_remove_request(&req);
96 KUNIT_EXPECT_EQ(test, ret, 1);
97 KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
98 FREQ_QOS_MIN_DEFAULT_VALUE);
101 ret = freq_qos_add_request(&qos, &req, FREQ_QOS_MIN, 2000);
102 KUNIT_EXPECT_EQ(test, ret, 1);
103 KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000);
106 static struct kunit_case pm_qos_test_cases[] = {
107 KUNIT_CASE(freq_qos_test_min),
108 KUNIT_CASE(freq_qos_test_maxdef),
109 KUNIT_CASE(freq_qos_test_readd),
113 static struct kunit_suite pm_qos_test_module = {
114 .name = "qos-kunit-test",
115 .test_cases = pm_qos_test_cases,
117 kunit_test_suites(&pm_qos_test_module);