testptp: Add support for testing ptp_clock_info .adjphase callback
authorRahul Rameshbabu <rrameshbabu@nvidia.com>
Mon, 12 Jun 2023 21:14:55 +0000 (14:14 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 20 Jun 2023 08:02:33 +0000 (09:02 +0100)
Invoke clock_adjtime syscall with tx.modes set with ADJ_OFFSET when testptp
is invoked with a phase adjustment offset value. Support seconds and
nanoseconds for the offset value.

Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Richard Cochran <richardcochran@gmail.com>
Cc: Maciek Machnikowski <maciek@machnikowski.net>
Signed-off-by: Rahul Rameshbabu <rrameshbabu@nvidia.com>
Acked-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/ptp/testptp.c

index 36a1ea3..cc535f7 100644 (file)
@@ -134,6 +134,7 @@ static void usage(char *progname)
                "            1 - external time stamp\n"
                "            2 - periodic output\n"
                " -n val     shift the ptp clock time by 'val' nanoseconds\n"
+               " -o val     phase offset (in nanoseconds) to be provided to the PHC servo\n"
                " -p val     enable output with a period of 'val' nanoseconds\n"
                " -H val     set output phase to 'val' nanoseconds (requires -p)\n"
                " -w val     set output pulse width to 'val' nanoseconds (requires -p)\n"
@@ -167,6 +168,7 @@ int main(int argc, char *argv[])
        int adjfreq = 0x7fffffff;
        int adjtime = 0;
        int adjns = 0;
+       int adjphase = 0;
        int capabilities = 0;
        int extts = 0;
        int flagtest = 0;
@@ -188,7 +190,7 @@ int main(int argc, char *argv[])
 
        progname = strrchr(argv[0], '/');
        progname = progname ? 1+progname : argv[0];
-       while (EOF != (c = getopt(argc, argv, "cd:e:f:ghH:i:k:lL:n:p:P:sSt:T:w:z"))) {
+       while (EOF != (c = getopt(argc, argv, "cd:e:f:ghH:i:k:lL:n:o:p:P:sSt:T:w:z"))) {
                switch (c) {
                case 'c':
                        capabilities = 1;
@@ -228,6 +230,9 @@ int main(int argc, char *argv[])
                case 'n':
                        adjns = atoi(optarg);
                        break;
+               case 'o':
+                       adjphase = atoi(optarg);
+                       break;
                case 'p':
                        perout = atoll(optarg);
                        break;
@@ -327,6 +332,18 @@ int main(int argc, char *argv[])
                }
        }
 
+       if (adjphase) {
+               memset(&tx, 0, sizeof(tx));
+               tx.modes = ADJ_OFFSET | ADJ_NANO;
+               tx.offset = adjphase;
+
+               if (clock_adjtime(clkid, &tx) < 0) {
+                       perror("clock_adjtime");
+               } else {
+                       puts("phase adjustment okay");
+               }
+       }
+
        if (gettime) {
                if (clock_gettime(clkid, &ts)) {
                        perror("clock_gettime");