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