1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "defs.h"
2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <sys/ioctl.h>
3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <linux/ptp_clock.h>
4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "xlat/ptp_flags_options.h"
6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgint ptp_ioctl(struct tcb *tcp, long code, long arg)
8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org	if (!verbose(tcp))
10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org		return 0;
11e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org	switch (code) {
13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org		case PTP_CLOCK_GETCAPS: /* decode on exit */
14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org		{
15e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org			struct ptp_clock_caps caps;
16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			if (entering(tcp) || syserror(tcp) ||
18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			    umove(tcp, arg, &caps) < 0)
19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				return 0;
20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			tprintf(", {max_adj=%d, n_alarm=%d, n_ext_ts=%d, n_per_out=%d, pps=%d}",
22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				caps.max_adj, caps.n_alarm, caps.n_ext_ts,
23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				caps.n_per_out, caps.pps);
24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			return 1;
25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org		}
26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org		case PTP_EXTTS_REQUEST: /* decode on enter */
28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org		{
29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			struct ptp_extts_request extts;
30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			if (exiting(tcp))
32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				return 1;
33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			if (umove(tcp, arg, &extts) < 0) {
34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				tprintf(", %#lx", arg);
35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				return 0;
36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			}
37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			tprintf(", {index=%d, flags=", extts.index);
38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			printflags(ptp_flags_options, extts.flags, "PTP_???");
39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			tprints("}");
40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			return 1;
41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org		}
42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org		case PTP_PEROUT_REQUEST: /* decode on enter */
443c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com		{
45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			struct ptp_perout_request perout;
46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			if (exiting(tcp))
48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				return 1;
49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			if (umove(tcp, arg, &perout) < 0) {
50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				tprintf(", %#lx", arg);
51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				return 0;
52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			}
53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			tprintf(", {start={%" PRId64 ", %" PRIu32 "}"
55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				   ", period={%" PRId64 ", %" PRIu32 "}"
56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				   ", index=%d, flags=",
57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				(int64_t)perout.start.sec, perout.start.nsec,
58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				(int64_t)perout.period.sec, perout.period.nsec,
59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				perout.index);
60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			printflags(ptp_flags_options, perout.flags, "PTP_???");
61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			tprints("}");
62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			return 1;
63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org		}
64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org		case PTP_ENABLE_PPS: /* decode on enter */
66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			if (entering(tcp))
67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				tprintf(", %ld", arg);
68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			return 1;
69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org		case PTP_SYS_OFFSET: /* decode on exit */
71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org		{
72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			struct ptp_sys_offset sysoff;
73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			unsigned int i;
74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			if (entering(tcp) || umove(tcp, arg, &sysoff) < 0)
76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				return 0;
77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			tprintf(", {n_samples=%u, ts={", sysoff.n_samples);
79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			if (syserror(tcp)) {
80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				tprints("...}}");
81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				return 1;
82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			}
83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			if (sysoff.n_samples > PTP_MAX_SAMPLES)
84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				sysoff.n_samples = PTP_MAX_SAMPLES;
85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			tprintf("{%" PRId64 ", %" PRIu32 "}",
86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				(int64_t)sysoff.ts[0].sec, sysoff.ts[0].nsec);
87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			for (i = 1; i < 2*sysoff.n_samples+1; ++i)
88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org				tprintf(", {%" PRId64 ", %" PRIu32 "}",
89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org					(int64_t)sysoff.ts[i].sec, sysoff.ts[i].nsec);
90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			tprints("}}");
91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			return 1;
92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org		}
93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org		default: /* decode on exit */
95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org			return 0;
96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org	}
97885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
98885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org