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: &qos); |
16 | memset(&req1, 0, sizeof(req1)); |
17 | memset(&req2, 0, sizeof(req2)); |
18 | |
19 | ret = freq_qos_add_request(qos: &qos, req: &req1, type: FREQ_QOS_MIN, value: 1000); |
20 | KUNIT_EXPECT_EQ(test, ret, 1); |
21 | ret = freq_qos_add_request(qos: &qos, req: &req2, type: FREQ_QOS_MIN, value: 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(req: &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(req: &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: &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: &qos, req: &req1, type: FREQ_QOS_MAX, |
50 | FREQ_QOS_MAX_DEFAULT_VALUE); |
51 | KUNIT_EXPECT_EQ(test, ret, 0); |
52 | ret = freq_qos_add_request(qos: &qos, req: &req2, type: 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(req: &req1, new_value: 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(req: &req2, new_value: 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(req: &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: &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: &qos, req: &req, type: FREQ_QOS_MIN, value: 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: &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: &qos, req: &req, type: FREQ_QOS_MIN, value: 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); |
118 | |