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