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 */
9static 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 */
37static 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 */
78static 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
106static 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
113static struct kunit_suite pm_qos_test_module = {
114 .name = "qos-kunit-test",
115 .test_cases = pm_qos_test_cases,
116};
117kunit_test_suites(&pm_qos_test_module);
118

source code of linux/drivers/base/power/qos-test.c