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