phc.sh 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. ALL_TESTS="
  4. settime
  5. adjtime
  6. adjfreq
  7. "
  8. DEV=$1
  9. # Kselftest framework requirement - SKIP code is 4.
  10. ksft_skip=4
  11. ##############################################################################
  12. # Sanity checks
  13. if [[ "$(id -u)" -ne 0 ]]; then
  14. echo "SKIP: need root privileges"
  15. exit $ksft_skip
  16. fi
  17. if [[ "$DEV" == "" ]]; then
  18. echo "SKIP: PTP device not provided"
  19. exit $ksft_skip
  20. fi
  21. require_command()
  22. {
  23. local cmd=$1; shift
  24. if [[ ! -x "$(command -v "$cmd")" ]]; then
  25. echo "SKIP: $cmd not installed"
  26. exit $ksft_skip
  27. fi
  28. }
  29. phc_sanity()
  30. {
  31. phc_ctl $DEV get &> /dev/null
  32. if [ $? != 0 ]; then
  33. echo "SKIP: unknown clock $DEV: No such device"
  34. exit $ksft_skip
  35. fi
  36. }
  37. require_command phc_ctl
  38. phc_sanity
  39. ##############################################################################
  40. # Helpers
  41. # Exit status to return at the end. Set in case one of the tests fails.
  42. EXIT_STATUS=0
  43. PASS_COUNT=0
  44. # Per-test return value. Clear at the beginning of each test.
  45. RET=0
  46. check_err()
  47. {
  48. local err=$1
  49. if [[ $RET -eq 0 && $err -ne 0 ]]; then
  50. RET=$err
  51. fi
  52. }
  53. log_test()
  54. {
  55. local test_name=$1
  56. if [[ $RET -eq $ksft_skip ]]; then
  57. printf "TEST: %-60s [SKIP]\n" "$test_name"
  58. return 0
  59. fi
  60. if [[ $RET -ne 0 ]]; then
  61. EXIT_STATUS=1
  62. printf "TEST: %-60s [FAIL]\n" "$test_name"
  63. return 1
  64. fi
  65. ((PASS_COUNT++))
  66. printf "TEST: %-60s [ OK ]\n" "$test_name"
  67. return 0
  68. }
  69. tests_run()
  70. {
  71. local current_test
  72. for current_test in ${TESTS:-$ALL_TESTS}; do
  73. $current_test
  74. done
  75. }
  76. ##############################################################################
  77. # Tests
  78. settime_do()
  79. {
  80. local res out
  81. out=$(LC_ALL=C phc_ctl $DEV set 0 wait 120.5 get 2>&1)
  82. if [[ $? -ne 0 ]]; then
  83. if echo "$out" | grep -qi "Operation not supported"; then
  84. return $ksft_skip
  85. fi
  86. return 1
  87. fi
  88. res=$(echo "$out" | awk '/clock time is/{print $5}' | awk -F. '{print $1}')
  89. (( res == 120 ))
  90. }
  91. adjtime_do()
  92. {
  93. local res out
  94. out=$(LC_ALL=C phc_ctl $DEV set 0 adj 10 get 2>&1)
  95. if [[ $? -ne 0 ]]; then
  96. if echo "$out" | grep -qi "Operation not supported"; then
  97. return $ksft_skip
  98. fi
  99. return 1
  100. fi
  101. res=$(echo "$out" | awk '/clock time is/{print $5}' | awk -F. '{print $1}')
  102. (( res == 10 ))
  103. }
  104. adjfreq_do()
  105. {
  106. local res out
  107. # Set the clock to be 1% faster
  108. out=$(LC_ALL=C phc_ctl $DEV freq 10000000 set 0 wait 100.5 get 2>&1)
  109. if [[ $? -ne 0 ]]; then
  110. if echo "$out" | grep -qi "Operation not supported"; then
  111. return $ksft_skip
  112. fi
  113. return 1
  114. fi
  115. res=$(echo "$out" | awk '/clock time is/{print $5}' | awk -F. '{print $1}')
  116. (( res == 101 ))
  117. }
  118. ##############################################################################
  119. cleanup()
  120. {
  121. phc_ctl $DEV freq 0.0 &> /dev/null
  122. phc_ctl $DEV set &> /dev/null
  123. }
  124. settime()
  125. {
  126. RET=0
  127. settime_do
  128. check_err $?
  129. log_test "settime"
  130. cleanup
  131. }
  132. adjtime()
  133. {
  134. RET=0
  135. adjtime_do
  136. check_err $?
  137. log_test "adjtime"
  138. cleanup
  139. }
  140. adjfreq()
  141. {
  142. RET=0
  143. adjfreq_do
  144. check_err $?
  145. log_test "adjfreq"
  146. cleanup
  147. }
  148. trap cleanup EXIT
  149. tests_run
  150. if [[ $EXIT_STATUS -eq 0 && $PASS_COUNT -eq 0 ]]; then
  151. exit $ksft_skip
  152. fi
  153. exit $EXIT_STATUS