Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright 2019 NXP
0004  */
0005 #include <kunit/test.h>
0006 #include <linux/pm_qos.h>
0007 
0008 /* Basic test for aggregating two "min" requests */
0009 static void freq_qos_test_min(struct kunit *test)
0010 {
0011     struct freq_constraints qos;
0012     struct freq_qos_request req1, req2;
0013     int ret;
0014 
0015     freq_constraints_init(&qos);
0016     memset(&req1, 0, sizeof(req1));
0017     memset(&req2, 0, sizeof(req2));
0018 
0019     ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MIN, 1000);
0020     KUNIT_EXPECT_EQ(test, ret, 1);
0021     ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MIN, 2000);
0022     KUNIT_EXPECT_EQ(test, ret, 1);
0023 
0024     KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000);
0025 
0026     ret = freq_qos_remove_request(&req2);
0027     KUNIT_EXPECT_EQ(test, ret, 1);
0028     KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000);
0029 
0030     ret = freq_qos_remove_request(&req1);
0031     KUNIT_EXPECT_EQ(test, ret, 1);
0032     KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
0033             FREQ_QOS_MIN_DEFAULT_VALUE);
0034 }
0035 
0036 /* Test that requests for MAX_DEFAULT_VALUE have no effect */
0037 static void freq_qos_test_maxdef(struct kunit *test)
0038 {
0039     struct freq_constraints qos;
0040     struct freq_qos_request req1, req2;
0041     int ret;
0042 
0043     freq_constraints_init(&qos);
0044     memset(&req1, 0, sizeof(req1));
0045     memset(&req2, 0, sizeof(req2));
0046     KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX),
0047             FREQ_QOS_MAX_DEFAULT_VALUE);
0048 
0049     ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MAX,
0050             FREQ_QOS_MAX_DEFAULT_VALUE);
0051     KUNIT_EXPECT_EQ(test, ret, 0);
0052     ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MAX,
0053             FREQ_QOS_MAX_DEFAULT_VALUE);
0054     KUNIT_EXPECT_EQ(test, ret, 0);
0055 
0056     /* Add max 1000 */
0057     ret = freq_qos_update_request(&req1, 1000);
0058     KUNIT_EXPECT_EQ(test, ret, 1);
0059     KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000);
0060 
0061     /* Add max 2000, no impact */
0062     ret = freq_qos_update_request(&req2, 2000);
0063     KUNIT_EXPECT_EQ(test, ret, 0);
0064     KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000);
0065 
0066     /* Remove max 1000, new max 2000 */
0067     ret = freq_qos_remove_request(&req1);
0068     KUNIT_EXPECT_EQ(test, ret, 1);
0069     KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 2000);
0070 }
0071 
0072 /*
0073  * Test that a freq_qos_request can be added again after removal
0074  *
0075  * This issue was solved by commit 05ff1ba412fd ("PM: QoS: Invalidate frequency
0076  * QoS requests after removal")
0077  */
0078 static void freq_qos_test_readd(struct kunit *test)
0079 {
0080     struct freq_constraints qos;
0081     struct freq_qos_request req;
0082     int ret;
0083 
0084     freq_constraints_init(&qos);
0085     memset(&req, 0, sizeof(req));
0086     KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
0087             FREQ_QOS_MIN_DEFAULT_VALUE);
0088 
0089     /* Add */
0090     ret = freq_qos_add_request(&qos, &req, FREQ_QOS_MIN, 1000);
0091     KUNIT_EXPECT_EQ(test, ret, 1);
0092     KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000);
0093 
0094     /* Remove */
0095     ret = freq_qos_remove_request(&req);
0096     KUNIT_EXPECT_EQ(test, ret, 1);
0097     KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
0098             FREQ_QOS_MIN_DEFAULT_VALUE);
0099 
0100     /* Add again */
0101     ret = freq_qos_add_request(&qos, &req, FREQ_QOS_MIN, 2000);
0102     KUNIT_EXPECT_EQ(test, ret, 1);
0103     KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000);
0104 }
0105 
0106 static struct kunit_case pm_qos_test_cases[] = {
0107     KUNIT_CASE(freq_qos_test_min),
0108     KUNIT_CASE(freq_qos_test_maxdef),
0109     KUNIT_CASE(freq_qos_test_readd),
0110     {},
0111 };
0112 
0113 static struct kunit_suite pm_qos_test_module = {
0114     .name = "qos-kunit-test",
0115     .test_cases = pm_qos_test_cases,
0116 };
0117 kunit_test_suites(&pm_qos_test_module);