GNU Linux-libre 5.10.219-gnu1
[releases.git] / drivers / base / power / qos-test.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright 2019 NXP
4  */
5 #include <kunit/test.h>
6 #include <linux/pm_qos.h>
7
8 /* Basic test for aggregating two "min" requests */
9 static void freq_qos_test_min(struct kunit *test)
10 {
11         struct freq_constraints qos;
12         struct freq_qos_request req1, req2;
13         int ret;
14
15         freq_constraints_init(&qos);
16         memset(&req1, 0, sizeof(req1));
17         memset(&req2, 0, sizeof(req2));
18
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);
23
24         KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000);
25
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);
29
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);
34 }
35
36 /* Test that requests for MAX_DEFAULT_VALUE have no effect */
37 static void freq_qos_test_maxdef(struct kunit *test)
38 {
39         struct freq_constraints qos;
40         struct freq_qos_request req1, req2;
41         int ret;
42
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);
48
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);
55
56         /* Add max 1000 */
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);
60
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);
65
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);
70 }
71
72 /*
73  * Test that a freq_qos_request can be added again after removal
74  *
75  * This issue was solved by commit 05ff1ba412fd ("PM: QoS: Invalidate frequency
76  * QoS requests after removal")
77  */
78 static void freq_qos_test_readd(struct kunit *test)
79 {
80         struct freq_constraints qos;
81         struct freq_qos_request req;
82         int ret;
83
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);
88
89         /* Add */
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);
93
94         /* Remove */
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);
99
100         /* Add again */
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);
104 }
105
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),
110         {},
111 };
112
113 static struct kunit_suite pm_qos_test_module = {
114         .name = "qos-kunit-test",
115         .test_cases = pm_qos_test_cases,
116 };
117 kunit_test_suites(&pm_qos_test_module);