qos-test.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. /* Basic test for aggregating two "min" requests */
  8. static void freq_qos_test_min(struct kunit *test)
  9. {
  10. struct freq_constraints qos;
  11. struct freq_qos_request req1, req2;
  12. int ret;
  13. freq_constraints_init(&qos);
  14. memset(&req1, 0, sizeof(req1));
  15. memset(&req2, 0, sizeof(req2));
  16. ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MIN, 1000);
  17. KUNIT_EXPECT_EQ(test, ret, 1);
  18. ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MIN, 2000);
  19. KUNIT_EXPECT_EQ(test, ret, 1);
  20. KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000);
  21. ret = freq_qos_remove_request(&req2);
  22. KUNIT_EXPECT_EQ(test, ret, 1);
  23. KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000);
  24. ret = freq_qos_remove_request(&req1);
  25. KUNIT_EXPECT_EQ(test, ret, 1);
  26. KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
  27. FREQ_QOS_MIN_DEFAULT_VALUE);
  28. }
  29. /* Test that requests for MAX_DEFAULT_VALUE have no effect */
  30. static void freq_qos_test_maxdef(struct kunit *test)
  31. {
  32. struct freq_constraints qos;
  33. struct freq_qos_request req1, req2;
  34. int ret;
  35. freq_constraints_init(&qos);
  36. memset(&req1, 0, sizeof(req1));
  37. memset(&req2, 0, sizeof(req2));
  38. KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX),
  39. FREQ_QOS_MAX_DEFAULT_VALUE);
  40. ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MAX,
  41. FREQ_QOS_MAX_DEFAULT_VALUE);
  42. KUNIT_EXPECT_EQ(test, ret, 0);
  43. ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MAX,
  44. FREQ_QOS_MAX_DEFAULT_VALUE);
  45. KUNIT_EXPECT_EQ(test, ret, 0);
  46. /* Add max 1000 */
  47. ret = freq_qos_update_request(&req1, 1000);
  48. KUNIT_EXPECT_EQ(test, ret, 1);
  49. KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000);
  50. /* Add max 2000, no impact */
  51. ret = freq_qos_update_request(&req2, 2000);
  52. KUNIT_EXPECT_EQ(test, ret, 0);
  53. KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000);
  54. /* Remove max 1000, new max 2000 */
  55. ret = freq_qos_remove_request(&req1);
  56. KUNIT_EXPECT_EQ(test, ret, 1);
  57. KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 2000);
  58. }
  59. /*
  60. * Test that a freq_qos_request can be added again after removal
  61. *
  62. * This issue was solved by commit 05ff1ba412fd ("PM: QoS: Invalidate frequency
  63. * QoS requests after removal")
  64. */
  65. static void freq_qos_test_readd(struct kunit *test)
  66. {
  67. struct freq_constraints qos;
  68. struct freq_qos_request req;
  69. int ret;
  70. freq_constraints_init(&qos);
  71. memset(&req, 0, sizeof(req));
  72. KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
  73. FREQ_QOS_MIN_DEFAULT_VALUE);
  74. /* Add */
  75. ret = freq_qos_add_request(&qos, &req, FREQ_QOS_MIN, 1000);
  76. KUNIT_EXPECT_EQ(test, ret, 1);
  77. KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000);
  78. /* Remove */
  79. ret = freq_qos_remove_request(&req);
  80. KUNIT_EXPECT_EQ(test, ret, 1);
  81. KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
  82. FREQ_QOS_MIN_DEFAULT_VALUE);
  83. /* Add again */
  84. ret = freq_qos_add_request(&qos, &req, FREQ_QOS_MIN, 2000);
  85. KUNIT_EXPECT_EQ(test, ret, 1);
  86. KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000);
  87. }
  88. static struct kunit_case pm_qos_test_cases[] = {
  89. KUNIT_CASE(freq_qos_test_min),
  90. KUNIT_CASE(freq_qos_test_maxdef),
  91. KUNIT_CASE(freq_qos_test_readd),
  92. {},
  93. };
  94. static struct kunit_suite pm_qos_test_module = {
  95. .name = "qos-kunit-test",
  96. .test_cases = pm_qos_test_cases,
  97. };
  98. kunit_test_suites(&pm_qos_test_module);