drm_managed_test.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <drm/drm_drv.h>
  3. #include <drm/drm_kunit_helpers.h>
  4. #include <drm/drm_managed.h>
  5. #include <kunit/resource.h>
  6. #include <linux/device.h>
  7. /* Ought to be enough for anybody */
  8. #define TEST_TIMEOUT_MS 100
  9. struct managed_test_priv {
  10. struct drm_device *drm;
  11. bool action_done;
  12. wait_queue_head_t action_wq;
  13. };
  14. static void drm_action(struct drm_device *drm, void *ptr)
  15. {
  16. struct managed_test_priv *priv = ptr;
  17. priv->action_done = true;
  18. wake_up_interruptible(&priv->action_wq);
  19. }
  20. /*
  21. * The test verifies that the release action is called when
  22. * drmm_release_action is called.
  23. */
  24. static void drm_test_managed_release_action(struct kunit *test)
  25. {
  26. struct managed_test_priv *priv = test->priv;
  27. int ret;
  28. ret = drmm_add_action_or_reset(priv->drm, drm_action, priv);
  29. KUNIT_EXPECT_EQ(test, ret, 0);
  30. ret = drm_dev_register(priv->drm, 0);
  31. KUNIT_ASSERT_EQ(test, ret, 0);
  32. drmm_release_action(priv->drm, drm_action, priv);
  33. ret = wait_event_interruptible_timeout(priv->action_wq, priv->action_done,
  34. msecs_to_jiffies(TEST_TIMEOUT_MS));
  35. KUNIT_EXPECT_GT(test, ret, 0);
  36. drm_dev_unregister(priv->drm);
  37. drm_kunit_helper_free_device(test, priv->drm->dev);
  38. }
  39. /*
  40. * The test verifies that the release action is called automatically when the
  41. * device is released.
  42. */
  43. static void drm_test_managed_run_action(struct kunit *test)
  44. {
  45. struct managed_test_priv *priv = test->priv;
  46. int ret;
  47. ret = drmm_add_action_or_reset(priv->drm, drm_action, priv);
  48. KUNIT_EXPECT_EQ(test, ret, 0);
  49. ret = drm_dev_register(priv->drm, 0);
  50. KUNIT_ASSERT_EQ(test, ret, 0);
  51. drm_dev_unregister(priv->drm);
  52. drm_kunit_helper_free_device(test, priv->drm->dev);
  53. ret = wait_event_interruptible_timeout(priv->action_wq, priv->action_done,
  54. msecs_to_jiffies(TEST_TIMEOUT_MS));
  55. KUNIT_EXPECT_GT(test, ret, 0);
  56. }
  57. static int drm_managed_test_init(struct kunit *test)
  58. {
  59. struct managed_test_priv *priv;
  60. struct device *dev;
  61. priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);
  62. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv);
  63. init_waitqueue_head(&priv->action_wq);
  64. dev = drm_kunit_helper_alloc_device(test);
  65. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
  66. /*
  67. * DRM device can't be embedded in priv, since priv->action_done needs
  68. * to remain allocated beyond both parent device and drm_device
  69. * lifetime.
  70. */
  71. priv->drm = __drm_kunit_helper_alloc_drm_device(test, dev, sizeof(*priv->drm), 0,
  72. DRIVER_MODESET);
  73. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->drm);
  74. test->priv = priv;
  75. return 0;
  76. }
  77. static struct kunit_case drm_managed_tests[] = {
  78. KUNIT_CASE(drm_test_managed_release_action),
  79. KUNIT_CASE(drm_test_managed_run_action),
  80. {}
  81. };
  82. static struct kunit_suite drm_managed_test_suite = {
  83. .name = "drm_managed",
  84. .init = drm_managed_test_init,
  85. .test_cases = drm_managed_tests
  86. };
  87. kunit_test_suite(drm_managed_test_suite);
  88. MODULE_AUTHOR("Maxime Ripard <maxime@cerno.tech>");
  89. MODULE_DESCRIPTION("KUnit DRM managed test suite");
  90. MODULE_LICENSE("GPL");