xref: /linux/tools/testing/selftests/ptp/phc.sh (revision b3827c91cc9979fe04d99e016fb9c5f6260f29a0)
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
195