light_hwspinlock_test.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
  2. /*
  3. * Light hardware spinlock driver
  4. *
  5. * Copyright (C) 2020-2025 Alibaba Group Holding Limited
  6. */
  7. #include <linux/kernel.h>
  8. #include <linux/module.h>
  9. #include <linux/init.h>
  10. #include <linux/err.h>
  11. #include <linux/sched.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/of.h>
  14. #include <linux/of_device.h>
  15. #include <linux/hwspinlock.h>
  16. static void hwspinlock_test(struct hwspinlock *hwlock, int lock_no)
  17. {
  18. int i;
  19. int ret;
  20. for (i = 0; i < 10; i++) {
  21. ret = hwspin_trylock(hwlock);
  22. if (ret) {
  23. pr_err("%d:%d Lock failed\n", lock_no, i);
  24. return;
  25. }
  26. ret = hwspin_trylock(hwlock);
  27. if (!ret) {
  28. pr_err("%d:%d Recursive lock succeeded unexpectedly! Test failed\n",
  29. lock_no, i);
  30. return;
  31. }
  32. hwspin_unlock(hwlock);
  33. ret = hwspin_trylock(hwlock);
  34. if (ret) {
  35. pr_err("%d:%d Unlock failed\n", lock_no, i);
  36. hwspin_unlock(hwlock);
  37. return;
  38. }
  39. hwspin_unlock(hwlock);
  40. }
  41. }
  42. #define HW_SPINLOCK_NUMBER 64
  43. static int light_hwspinlock_test_init(void)
  44. {
  45. int i;
  46. struct hwspinlock *hwlock = NULL;
  47. for (i = 0; i < HW_SPINLOCK_NUMBER; i++) {
  48. hwlock = hwspin_lock_request_specific(i);
  49. if (!hwlock) {
  50. pr_err("request lock %d failed\n", i);
  51. return -EIO;
  52. }
  53. hwspinlock_test(hwlock, i);
  54. hwspin_lock_free(hwlock);
  55. }
  56. return 0;
  57. }
  58. static void light_hwspinlock_test_exit(void)
  59. {
  60. pr_info("Test finished\n");
  61. }
  62. module_init(light_hwspinlock_test_init);
  63. module_exit(light_hwspinlock_test_exit);
  64. MODULE_LICENSE("Dual BSD/GPL");