^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright 2019 NXP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <kunit/test.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/pm_qos.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) /* Basic test for aggregating two "min" requests */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) static void freq_qos_test_min(struct kunit *test)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) struct freq_constraints qos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) struct freq_qos_request req1, req2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) freq_constraints_init(&qos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) memset(&req1, 0, sizeof(req1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) memset(&req2, 0, sizeof(req2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MIN, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) KUNIT_EXPECT_EQ(test, ret, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MIN, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) KUNIT_EXPECT_EQ(test, ret, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) ret = freq_qos_remove_request(&req2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) KUNIT_EXPECT_EQ(test, ret, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) ret = freq_qos_remove_request(&req1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) KUNIT_EXPECT_EQ(test, ret, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) FREQ_QOS_MIN_DEFAULT_VALUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) /* Test that requests for MAX_DEFAULT_VALUE have no effect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) static void freq_qos_test_maxdef(struct kunit *test)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct freq_constraints qos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) struct freq_qos_request req1, req2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) freq_constraints_init(&qos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) memset(&req1, 0, sizeof(req1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) memset(&req2, 0, sizeof(req2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) FREQ_QOS_MAX_DEFAULT_VALUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) FREQ_QOS_MAX_DEFAULT_VALUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) KUNIT_EXPECT_EQ(test, ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) FREQ_QOS_MAX_DEFAULT_VALUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) KUNIT_EXPECT_EQ(test, ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) /* Add max 1000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) ret = freq_qos_update_request(&req1, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) KUNIT_EXPECT_EQ(test, ret, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) /* Add max 2000, no impact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) ret = freq_qos_update_request(&req2, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) KUNIT_EXPECT_EQ(test, ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /* Remove max 1000, new max 2000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) ret = freq_qos_remove_request(&req1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) KUNIT_EXPECT_EQ(test, ret, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * Test that a freq_qos_request can be added again after removal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * This issue was solved by commit 05ff1ba412fd ("PM: QoS: Invalidate frequency
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * QoS requests after removal")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) static void freq_qos_test_readd(struct kunit *test)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) struct freq_constraints qos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) struct freq_qos_request req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) freq_constraints_init(&qos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) memset(&req, 0, sizeof(req));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) FREQ_QOS_MIN_DEFAULT_VALUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) /* Add */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) ret = freq_qos_add_request(&qos, &req, FREQ_QOS_MIN, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) KUNIT_EXPECT_EQ(test, ret, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) /* Remove */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) ret = freq_qos_remove_request(&req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) KUNIT_EXPECT_EQ(test, ret, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) FREQ_QOS_MIN_DEFAULT_VALUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) /* Add again */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) ret = freq_qos_add_request(&qos, &req, FREQ_QOS_MIN, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) KUNIT_EXPECT_EQ(test, ret, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) static struct kunit_case pm_qos_test_cases[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) KUNIT_CASE(freq_qos_test_min),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) KUNIT_CASE(freq_qos_test_maxdef),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) KUNIT_CASE(freq_qos_test_readd),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) {},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) static struct kunit_suite pm_qos_test_module = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) .name = "qos-kunit-test",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) .test_cases = pm_qos_test_cases,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) kunit_test_suites(&pm_qos_test_module);