// SPDX-License-Identifier: GPL-2.0 /* * Copyright 2019 NXP */ #include <kunit/test.h> #include <linux/pm_qos.h> /* Basic test for aggregating two "min" requests */ static void freq_qos_test_min(struct kunit *test) { struct freq_constraints qos; struct freq_qos_request req1, req2; int ret; freq_constraints_init(&qos); memset(&req1, 0, sizeof(req1)); memset(&req2, 0, sizeof(req2)); ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MIN, 1000); KUNIT_EXPECT_EQ(test, ret, 1); ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MIN, 2000); KUNIT_EXPECT_EQ(test, ret, 1); KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000); ret = freq_qos_remove_request(&req2); KUNIT_EXPECT_EQ(test, ret, 1); KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000); ret = freq_qos_remove_request(&req1); KUNIT_EXPECT_EQ(test, ret, 1); KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), FREQ_QOS_MIN_DEFAULT_VALUE); } /* Test that requests for MAX_DEFAULT_VALUE have no effect */ static void freq_qos_test_maxdef(struct kunit *test) { struct freq_constraints qos; struct freq_qos_request req1, req2; int ret; freq_constraints_init(&qos); memset(&req1, 0, sizeof(req1)); memset(&req2, 0, sizeof(req2)); KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), FREQ_QOS_MAX_DEFAULT_VALUE); ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MAX, FREQ_QOS_MAX_DEFAULT_VALUE); KUNIT_EXPECT_EQ(test, ret, 0); ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MAX, FREQ_QOS_MAX_DEFAULT_VALUE); KUNIT_EXPECT_EQ(test, ret, 0); /* Add max 1000 */ ret = freq_qos_update_request(&req1, 1000); KUNIT_EXPECT_EQ(test, ret, 1); KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000); /* Add max 2000, no impact */ ret = freq_qos_update_request(&req2, 2000); KUNIT_EXPECT_EQ(test, ret, 0); KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000); /* Remove max 1000, new max 2000 */ ret = freq_qos_remove_request(&req1); KUNIT_EXPECT_EQ(test, ret, 1); KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 2000); } /* * Test that a freq_qos_request can be added again after removal * * This issue was solved by commit 05ff1ba412fd ("PM: QoS: Invalidate frequency * QoS requests after removal") */ static void freq_qos_test_readd(struct kunit *test) { struct freq_constraints qos; struct freq_qos_request req; int ret; freq_constraints_init(&qos); memset(&req, 0, sizeof(req)); KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), FREQ_QOS_MIN_DEFAULT_VALUE); /* Add */ ret = freq_qos_add_request(&qos, &req, FREQ_QOS_MIN, 1000); KUNIT_EXPECT_EQ(test, ret, 1); KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000); /* Remove */ ret = freq_qos_remove_request(&req); KUNIT_EXPECT_EQ(test, ret, 1); KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), FREQ_QOS_MIN_DEFAULT_VALUE); /* Add again */ ret = freq_qos_add_request(&qos, &req, FREQ_QOS_MIN, 2000); KUNIT_EXPECT_EQ(test, ret, 1); KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000); } static struct kunit_case pm_qos_test_cases[] = { KUNIT_CASE(freq_qos_test_min), KUNIT_CASE(freq_qos_test_maxdef), KUNIT_CASE(freq_qos_test_readd), {}, }; static struct kunit_suite pm_qos_test_module = { .name = "qos-kunit-test", .test_cases = pm_qos_test_cases, }; kunit_test_suites(&pm_qos_test_module);